/* Ċ Ġ* ĠCopyright Ġ 2 0 1 9 ĠGoogle ĠInc . ĠAll ĠRights ĠReserved . Ċ Ġ* Ċ Ġ* Ġ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 . google . ml kit . samples . nl . translate . kotlin Ċ Ċ import Ġandroid . app . Application Ċ import Ġandroidx . lifecycle . Android ViewModel Ċ import Ġandroidx . lifecycle . Mediator LiveData Ċ import Ġandroidx . lifecycle . Mutable LiveData Ċ import Ġandroidx . lifecycle . Observer Ċ import Ġandroid . util . L ru Cache Ċ import Ġcom . google . android . gms . tasks . On Complete Listener Ċ import Ġcom . google . android . gms . tasks . Task Ċ import Ġcom . google . android . gms . tasks . Tasks Ċ import Ġcom . google . ml kit . common . model . Download Conditions Ċ import Ġcom . google . ml kit . common . model . Remote Model Manager Ċ import Ġcom . google . ml kit . nl . translate .* Ċ import Ġcom . google . ml kit . samples . nl . translate . R Ċ import Ġjava . util . Locale Ċ Ċ class ĠTranslate ViewModel ( application : ĠApplication ) Ġ: ĠAndroid ViewModel ( application ) Ġ{ ĊĊĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠ Ġ// ĠThis Ġspecifies Ġthe Ġnumber Ġof Ġtrans l ators Ġinstance Ġwe Ġwant Ġto Ġkeep Ġin Ġour ĠL RU Ġcache . ĊĠĠĠ Ġ// ĠEach Ġinstance Ġof Ġthe Ġtranslator Ġis Ġbuilt Ġwith Ġdifferent Ġoptions Ġbased Ġon Ġthe Ġsource ĊĠĠĠ Ġ// Ġlanguage Ġand Ġthe Ġtarget Ġlanguage , Ġand Ġsince Ġwe Ġwant Ġto Ġbe Ġable Ġto Ġmanage Ġthe Ġnumber Ġof ĊĠĠĠ Ġ// Ġtranslator Ġinstances Ġto Ġkeep Ġaround , Ġan ĠL RU Ġcache Ġis Ġan Ġeasy Ġway Ġto Ġachieve Ġthis . ĊĠĠĠ Ġprivate Ġconst Ġval ĠNUM _ TRANSL ATORS Ġ= Ġ 3 ĊĠ Ġ} ĊĊĠ Ġprivate Ġval Ġmodel Manager : ĠRemote Model Manager Ġ= ĠRemote Model Manager . getInstance () ĊĠ Ġprivate Ġval Ġtrans l ators Ġ= ĊĠĠĠ Ġobject Ġ: ĠL ru Cache < Translator Options , ĠTrans lator >( NUM _ TRANSL ATORS ) Ġ{ ĊĠĠĠĠĠ Ġoverride Ġfun Ġcreate ( options : ĠTrans lator Options ): ĠTrans lator Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠTranslation . getClient ( options ) ĊĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġoverride Ġfun Ġentry Removed ( ĊĠĠĠĠĠĠĠ Ġev ict ed : ĠBoolean , ĊĠĠĠĠĠĠĠ Ġkey : ĠTrans lator Options , ĊĠĠĠĠĠĠĠ ĠoldValue : ĠTrans lator , ĊĠĠĠĠĠĠĠ ĠnewValue : ĠTrans lator ? ĊĠĠĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ ĠoldValue . close () ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠ Ġval Ġsource Lang Ġ= ĠMutable LiveData < Language >() ĊĠ Ġval Ġtarget Lang Ġ= ĠMutable LiveData < Language >() ĊĠ Ġval Ġsource Text Ġ= ĠMutable LiveData < String >() ĊĠ Ġval Ġtranslated Text Ġ= ĠMed iator LiveData < Result Or Error >() ĊĠ Ġval Ġavailable Models Ġ= ĠMutable LiveData < List < String >>() ĊĊĠ Ġ// ĠGets Ġa Ġlist Ġof Ġall Ġavailable Ġtranslation Ġlanguages . ĊĠ Ġval Ġavailable Languages : ĠList < Language > Ġ= ĠTranslate Language . getAll Languages () ĊĠĠĠ Ġ. map Ġ{ ĊĠĠĠĠĠ ĠLanguage ( it ) ĊĠĠĠ Ġ} ĊĊĠ Ġinit Ġ{ ĊĠĠĠ Ġ// ĠCreate Ġa Ġtranslation Ġresult Ġor Ġerror Ġobject . ĊĠĠĠ Ġval Ġprocess Translation Ġ= ĊĠĠĠĠĠ ĠOn Complete Listener < String > Ġ{ Ġtask Ġ-> ĊĠĠĠĠĠĠĠ Ġif Ġ( task . is Successful ) Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġtranslated Text . value Ġ= ĠResult Or Error ( task . result , Ġnull ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġtranslated Text . value Ġ= ĠResult Or Error ( null , Ġtask . exception ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ// ĠUpdate Ġthe Ġlist Ġof Ġdownloaded Ġmodels Ġas Ġmore Ġmay Ġhave Ġbeen ĊĠĠĠĠĠĠĠ Ġ// Ġautomatically Ġdownloaded Ġdue Ġto Ġrequested Ġtranslation . ĊĠĠĠĠĠĠĠ Ġfetch Downloaded Models () ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ// ĠStart Ġtranslation Ġif Ġany Ġof Ġthe Ġfollowing Ġchange : Ġinput Ġtext , Ġsource Ġlang , Ġtarget Ġlang . ĊĠĠĠ Ġtranslated Text . add Source ( source Text ) Ġ{ Ġtranslate (). add On Complete Listener ( process Translation ) Ġ} ĊĠĠĠ Ġval Ġlanguage Observer Ġ= ĊĠĠĠĠĠ ĠObserver < Language > Ġ{ Ġtranslate (). add On Complete Listener ( process Translation ) Ġ} ĊĠĠĠ Ġtranslated Text . add Source ( source Lang , Ġlanguage Observer ) ĊĠĠĠ Ġtranslated Text . add Source ( target Lang , Ġlanguage Observer ) ĊĊĠĠĠ Ġ// ĠUpdate Ġthe Ġlist Ġof Ġdownloaded Ġmodels . ĊĠĠĠ Ġfetch Downloaded Models () ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun ĠgetModel ( language Code : ĠString ): ĠTranslate Remote Model Ġ{ ĊĠĠĠ Ġreturn ĠTranslate Remote Model . Builder ( language Code ). build () ĊĠ Ġ} ĊĊĠ Ġ// ĠUpdates Ġthe Ġlist Ġof Ġdownloaded Ġmodels Ġavailable Ġfor Ġlocal Ġtranslation . ĊĠ Ġprivate Ġfun Ġfetch Downloaded Models () Ġ{ ĊĠĠĠ Ġmodel Manager . get Downloaded Models ( Translate Remote Model :: class . java ) ĊĠĠĠĠĠ Ġ. add On Success Listener Ġ{ Ġremote Models Ġ-> ĊĠĠĠĠĠĠĠ Ġavailable Models . value Ġ= ĊĠĠĠĠĠĠĠĠĠ Ġremote Models . sorted By Ġ{ Ġit . language Ġ}. map Ġ{ Ġit . language Ġ} ĊĠĠĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġ// ĠStarts Ġdownloading Ġa Ġremote Ġmodel Ġfor Ġlocal Ġtranslation . ĊĠ Ġinternal Ġfun Ġdownload Language ( language : ĠLanguage ) Ġ{ ĊĠĠĠ Ġval Ġmodel Ġ= ĠgetModel ( Translate Language . from Language Tag ( language . code ) !! ) ĊĠĠĠ Ġmodel Manager . download ( model , ĠDownload Conditions . Builder (). build ()) ĊĠĠĠĠĠ Ġ. add On Complete Listener Ġ{ Ġfetch Downloaded Models () Ġ} ĊĠ Ġ} ĊĊĠ Ġ// ĠDeletes Ġa Ġlocally Ġstored Ġtranslation Ġmodel . ĊĠ Ġinternal Ġfun Ġdelete Language ( language : ĠLanguage ) Ġ{ ĊĠĠĠ Ġval Ġmodel Ġ= ĠgetModel ( Translate Language . from Language Tag ( language . code ) !! ) ĊĠĠĠ Ġmodel Manager . delete Downloaded Model ( model ). add On Complete Listener Ġ{ Ġfetch Downloaded Models () Ġ} ĊĠ Ġ} ĊĊĠ Ġfun Ġtranslate (): ĠTask < String > Ġ{ ĊĠĠĠ Ġval Ġtext Ġ= Ġsource Text . value ĊĠĠĠ Ġval Ġsource Ġ= Ġsource Lang . value ĊĠĠĠ Ġval Ġtarget Ġ= Ġtarget Lang . value ĊĠĠĠ Ġif Ġ( source Ġ== Ġnull Ġ|| Ġtarget Ġ== Ġnull Ġ|| Ġtext Ġ== Ġnull Ġ|| Ġtext . isEmpty ()) Ġ{ ĊĠĠĠĠĠ Ġreturn ĠTasks . for Result ("") ĊĠĠĠ Ġ} ĊĠĠĠ Ġval Ġsource Lang Code Ġ= ĠTranslate Language . from Language Tag ( source . code ) !! ĊĠĠĠ Ġval Ġtarget Lang Code Ġ= ĠTranslate Language . from Language Tag ( target . code ) !! ĊĠĠĠ Ġval Ġoptions Ġ= ĠTrans lator Options . Builder () ĊĠĠĠĠĠ Ġ. set Source Language ( source Lang Code ) ĊĠĠĠĠĠ Ġ. setTarget Language ( target Lang Code ) ĊĠĠĠĠĠ Ġ. build () ĊĠĠĠ Ġreturn Ġtrans l ators [ options ]. download Model IfNeeded (). continue With Task Ġ{ Ġtask Ġ-> ĊĠĠĠĠĠ Ġif Ġ( task . is Successful ) Ġ{ ĊĠĠĠĠĠĠĠ Ġtrans l ators [ options ]. translate ( text ) ĊĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠ ĠTasks . for Exception < String >( ĊĠĠĠĠĠĠĠĠĠ Ġtask . exception ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ?: ĠException ( getApplication < Application >(). getString ( R . string . unknown _ error )) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġ/** ĊĠĠ Ġ* ĠHold s Ġthe Ġresult Ġof Ġthe Ġtranslation Ġor Ġany Ġerror . ĊĠĠ Ġ*/ ĊĠ Ġinner Ġclass ĠResult Or Error ( var Ġresult : ĠString ?, Ġvar Ġerror : ĠException ?) ĊĊĠ Ġ/** ĊĠĠ Ġ* ĠHold s Ġthe Ġlanguage Ġcode Ġ( i . e . Ġ" en ") Ġand Ġthe Ġcorresponding Ġlocalized Ġfull Ġlanguage Ġname ĊĠĠ Ġ* Ġ( i . e . Ġ" English ") ĊĠĠ Ġ*/ ĊĠ Ġclass ĠLanguage ( val Ġcode : ĠString ) Ġ: ĠComparable < Language > Ġ{ ĊĊĠĠĠ Ġprivate Ġval ĠdisplayName : ĠString ĊĠĠĠĠĠ Ġget () Ġ= ĠLocale ( code ). displayName ĊĊĠĠĠ Ġoverride Ġfun Ġequals ( other : ĠAny ?): ĠBoolean Ġ{ ĊĠĠĠĠĠ Ġif Ġ( other Ġ=== Ġthis ) Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠ Ġif Ġ( other Ġ! is ĠLanguage ) Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠ Ġval Ġother Lang Ġ= Ġother Ġas ĠLanguage ? ĊĠĠĠĠĠ Ġreturn Ġother Lang !!. code Ġ== Ġcode ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠtoString (): ĠString Ġ{ ĊĠĠĠĠĠ Ġreturn Ġ"$ code Ġ- Ġ$ displayName " ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġcompare To ( other : ĠLanguage ): ĠInt Ġ{ ĊĠĠĠĠĠ Ġreturn Ġthis . displayName . compareTo ( other . displayName ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠhashCode (): ĠInt Ġ{ ĊĠĠĠĠĠ Ġreturn Ġcode . hashCode () ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġoverride Ġfun Ġon Cle ared () Ġ{ ĊĠĠĠ Ġsuper . on Cle ared () ĊĠĠĠ Ġ// ĠEach Ġnew Ġinstance Ġof Ġa Ġtranslator Ġneeds Ġto Ġbe Ġclosed Ġappropriately . ĠHere Ġwe Ġutilize Ġthe ĊĠĠĠ Ġ// ĠViewModel 's Ġon Cle ared () Ġto Ġclear Ġour ĠL ru Cache Ġand Ġclose Ġeach ĠTrans lator Ġinstance Ġwhen ĊĠĠĠ Ġ// Ġthis ĠViewModel Ġis Ġno Ġlonger Ġused Ġand Ġdestroyed . ĊĠĠĠ Ġtrans l ators . ev ict All () ĊĠ Ġ} Ċ } Ċ