/* Ċ Ġ* ĠCopyright Ġ( c ) Ġ 2 0 2 1 Ġ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 . wait list . tracker protection . ui Ċ Ċ import Ġandroid . app . Activity Ċ import Ġandroidx . lifecycle . ViewModel Ċ import Ġandroidx . lifecycle . viewModel Scope Ċ import Ġandroidx . work . Work Manager Ċ import Ġcom . duck duck go . app . global . plugins . view _ model . ViewModel Factory Plugin Ċ import Ġcom . duck duck go . app . wait list . tracker protection . App TP Wait list Work RequestBuilder Ċ import Ġcom . duck duck go . di . scopes . App Scope Ċ import Ġcom . duck duck go . mobile . android . vpn . pixels . Device Shield Pixels Ċ import Ġcom . duck duck go . mobile . android . vpn . wait list . Tracking Protection Wait list Manager Ċ import Ġcom . duck duck go . mobile . android . vpn . wait list . Wait list State Ċ import Ġcom . duck duck go . mobile . android . vpn . wait list . api . App Tracking Protection Wait list Service Ċ import Ġcom . squareup . an vil . annotations . Contribut es Mult ib ind ing Ċ import Ġkotlinx . coroutines . channels . Buffer Overflow Ċ import Ġkotlinx . coroutines . channels . Channel Ċ import Ġkotlinx . coroutines . flow . Mutable State Flow Ċ import Ġkotlinx . coroutines . flow . State Flow Ċ import Ġkotlinx . coroutines . flow . receive As Flow Ċ import Ġkotlinx . coroutines . launch Ċ import Ġjavax . inject . Inject Ċ import Ġjavax . inject . Provider Ċ Ċ class ĠApp TP Wait list ViewModel ( ĊĠĠĠ Ġprivate Ġval Ġwait list Manager : ĠTracking Protection Wait list Manager , ĊĠĠĠ Ġprivate Ġval Ġwait list Service : ĠApp Tracking Protection Wait list Service , ĊĠĠĠ Ġprivate Ġval Ġwork Manager : ĠWork Manager , ĊĠĠĠ Ġprivate Ġval Ġwork RequestBuilder : ĠApp TP Wait list Work RequestBuilder , ĊĠĠĠ Ġprivate Ġval Ġdevice Shield Pixels : ĠDevice Shield Pixels Ċ ) Ġ: ĠViewModel () Ġ{ ĊĊĠĠĠ Ġprivate Ġval Ġview State Flow : ĠMutable State Flow < ViewState > Ġ= ĊĠĠĠĠĠĠĠ ĠMutable State Flow ( ViewState ( wait list Manager . wait list State ())) ĊĠĠĠ Ġval Ġview State : ĠState Flow < ViewState > Ġ= Ġview State Flow ĊĊĠĠĠ Ġprivate Ġval Ġcommand Channel Ġ= ĠChannel < Command >( capacity Ġ= Ġ 1 , Ġon Buffer Overflow Ġ= ĠBuffer Overflow . DROP _ OL DEST ) ĊĠĠĠ Ġval Ġcommands Ġ= Ġcommand Channel . receive As Flow () ĊĊĠĠĠ Ġsealed Ġclass ĠCommand Ġ{ ĊĠĠĠĠĠĠĠ Ġobject ĠLaunch Beta Instructions Ġ: ĠCommand () ĊĠĠĠĠĠĠĠ Ġobject ĠEnter Invite Code Ġ: ĠCommand () ĊĠĠĠĠĠĠĠ Ġobject ĠShow ErrorMessage Ġ: ĠCommand () ĊĠĠĠĠĠĠĠ Ġobject ĠShow Notification Dialog Ġ: ĠCommand () ĊĠĠĠĠĠĠĠ Ġobject ĠShow On boarding Ġ: ĠCommand () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġdata Ġclass ĠView State ( val Ġwait list : ĠWait list State ) ĊĊĠĠĠ Ġfun Ġget Started () Ġ{ ĊĠĠĠĠĠĠĠ ĠviewModel Scope . launch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcommand Channel . send ( Command . Show On boarding ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġhave An Invite Code () Ġ{ ĊĠĠĠĠĠĠĠ ĠviewModel Scope . launch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcommand Channel . send ( Command . Enter Invite Code ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġjoin The Wait list () Ġ{ ĊĠĠĠĠĠĠĠ ĠviewModel Scope . launch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrun Catch ing Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwait list Service . join Wait list () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}. on Success Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtimestamp Ġ= Ġit . timestamp ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtoken Ġ= Ġit . token ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( timestamp Ġ!= Ġnull Ġ&& Ġ! token . isNull Or Blank ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġjoined Wait list ( timestamp , Ġtoken ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcommand Channel . send ( Command . Show ErrorMessage ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}. on Failure Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcommand Channel . send ( Command . Show ErrorMessage ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġjoined Wait list ( ĊĠĠĠĠĠĠĠ Ġtimestamp : ĠInt , ĊĠĠĠĠĠĠĠ Ġtoken : ĠString ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġdevice Shield Pixels . did Show Wait list Dialog () ĊĠĠĠĠĠĠĠ ĠviewModel Scope . launch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwait list Manager . join Wait list ( timestamp , Ġtoken ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcommand Channel . send ( Command . Show Notification Dialog ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwork Manager . enqueue ( work RequestBuilder . wait list Request Work ( with Big Delay Ġ= Ġfalse )) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġlearn More () Ġ{ ĊĠĠĠĠĠĠĠ ĠviewModel Scope . launch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcommand Channel . send ( Command . Launch Beta Instructions ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġon Notify Me Clicked () Ġ{ ĊĠĠĠĠĠĠĠ ĠviewModel Scope . launch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdevice Shield Pixels . did Press Wait list Dialog Notify Me () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwait list Manager . notify On Joined Wait list () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġon No Thanks Clicked () Ġ{ ĊĠĠĠĠĠĠĠ ĠviewModel Scope . launch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdevice Shield Pixels . did Press Wait list Dialog Dismiss () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġon Dialog Dis missed () Ġ{ ĊĠĠĠĠĠĠĠ ĠviewModel Scope . launch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġview State Flow . emit ( ViewState ( wait list Manager . wait list State ())) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġon Code Re dee med ( result Code : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( result Code Ġ== ĠActivity . RESULT _ OK ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠviewModel Scope . launch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġview State Flow . emit ( ViewState ( Wait list State . Code Re dee med )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ @ Contribut es Mult ib ind ing ( App Scope :: class ) Ċ class ĠApp TP Wait list ViewModel Factory Ġ@ Inject Ġconstructor ( ĊĠĠĠ Ġprivate Ġval Ġwait list Manager : ĠProvider < Tracking Protection Wait list Manager >, ĊĠĠĠ Ġprivate Ġval Ġwait list Service : ĠProvider < App Tracking Protection Wait list Service >, ĊĠĠĠ Ġprivate Ġval Ġwork Manager : ĠProvider < Work Manager >, ĊĠĠĠ Ġprivate Ġval Ġwork RequestBuilder : ĠProvider < App TP Wait list Work RequestBuilder >, ĊĠĠĠ Ġprivate Ġval Ġdevice Shield Pixels : ĠProvider < Device Shield Pixels >, Ċ ) Ġ: ĠViewModel Factory Plugin Ġ{ ĊĠĠĠ Ġoverride Ġfun Ġ< T Ġ: ĠViewModel ?> Ġcreate ( model Class : ĠClass < T >): ĠT ? Ġ{ ĊĠĠĠĠĠĠĠ Ġwith ( model Class ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis AssignableFrom ( App TP Wait list ViewModel :: class . java ) Ġ-> Ġ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠApp TP Wait list ViewModel ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwait list Manager . get (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwait list Service . get (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwork Manager . get (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwork RequestBuilder . get (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdevice Shield Pixels . get (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) Ġas ĠT ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ