package Ġpw . j any o . wh atan ime . viewModel Ċ Ċ import Ġandroid . content . Intent Ċ import Ġandroidx . lifecycle . Mutable LiveData Ċ import Ġcom . google . android . ex op layer 2 . Media Item Ċ import Ġcom . google . android . ex op layer 2 . source . Media Source Ċ import Ġcom . google . android . ex op layer 2 . source . Progress ive Media Source Ċ import Ġcom . google . android . ex op layer 2 . upstream . DataSource Ċ import Ġkotlinx . coroutines . Dispatch ers Ċ import Ġkotlinx . coroutines . with Context Ċ import Ġorg . k oin . core . component . K oin Component Ċ import Ġorg . k oin . core . component . inject Ċ import Ġpw . j any o . wh atan ime . base . Compose ViewModel Ċ import Ġpw . j any o . wh atan ime . config . Configure Ċ import Ġpw . j any o . wh atan ime . config . track Event Ċ import Ġpw . j any o . wh atan ime . constant . String Constant Ċ import Ġpw . j any o . wh atan ime . model . Result Ċ import Ġpw . j any o . wh atan ime . model . Search Quota Ċ import Ġpw . j any o . wh atan ime . model . Show Image Ċ import Ġpw . j any o . wh atan ime . repository . Animation Repository Ċ import Ġpw . j any o . wh atan ime . utils . clone Uri ToFile Ċ import Ġpw . j any o . wh atan ime . utils . getCache File Ċ import Ġv ip . m yst ery 0 . tools . utils . copy ToFile Ċ import Ġjava . io . File Ċ import Ġjava . util . concurrent . Concurrent HashMap Ċ Ċ class ĠMain ViewModel Ġ: ĠCompose ViewModel (), ĠK oin Component Ġ{ ĊĠĠĠ Ġprivate Ġval Ġanimation Repository : ĠAnimation Repository Ġby Ġinject () ĊĠĠĠ Ġprivate Ġval Ġex o DataSource Factory : ĠDataSource . Factory Ġby Ġinject () ĊĊĠĠĠ Ġprivate Ġval Ġmedia Source Map Ġ= ĠConcurrent HashMap < String , ĠMedia Source >() ĊĠĠĠ Ġval Ġquota Ġ= ĠMutable LiveData < Search Quota >() ĊĠĠĠ Ġval Ġimage File Ġ= ĠMutable LiveData < Show Image >() ĊĠĠĠ Ġval Ġresult List Ġ= ĠMutable LiveData < List < Result >>() ĊĠĠĠ Ġval Ġclick Docs Ġ= ĠMutable LiveData < Result >() ĊĠĠĠ Ġval Ġmedia Source Ġ= ĠMutable LiveData < Media Source >() ĊĠĠĠ Ġval Ġloading Video Ġ= ĠMutable LiveData ( false ) ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ@ param Ġfile Ġ è¦ģ æĺ¾ç¤º çļĦæĸĩä»¶ ï¼Į ä¹Łæĺ¯ è¦ģ æĲľç´¢ çļĦæĸĩä»¶ ĊĠĠĠĠ Ġ* Ġ@ param Ġfilter Ġ è¿ĩæ»¤ æĿ¡ä»¶ ĊĠĠĠĠ Ġ* Ġ@ param Ġcache In Path Ġ ç¼ĵåŃĺ è·¯å¾Ħ ï¼Į å¦Ĥæŀľ ä¸º null è¯´æĺİ æ²¡æľī ç¼ĵåŃĺ æĪĸèĢħ ä¸į çŁ¥éģĵ ç¼ĵåŃĺ è·¯å¾Ħ ĊĠĠĠĠ Ġ* Ġ@ param Ġorigin Path Ġ åİŁå§ĭ è·¯å¾Ħ ĊĠĠĠĠ Ġ* Ġ@ param ĠmimeType Ġæĸĩä»¶ ç±»åŀĭ ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġsearch ( ĊĠĠĠĠĠĠĠ Ġfile : ĠFile , ĊĠĠĠĠĠĠĠ Ġcache In Path : ĠString ?, ĊĠĠĠĠĠĠĠ Ġorigin Path : ĠString , ĊĠĠĠĠĠĠĠ ĠmimeType : ĠString ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġlaunch Load Data Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( file . length () Ġ> Ġ 1 0 4 8 5 7 6 0 L ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// å¤§äºİ 1 0 M ï¼Į æıĲç¤º æĸĩä»¶ è¿ĩ å¤§ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠException ( String Constant . hint _ file _ too _ large ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġcache Path Ġ= Ġcache In Path Ġ?: Ġ// æ²¡æľī ç¼ĵåŃĺ æĪĸèĢħ ä¸į çŁ¥éģĵ ç¼ĵåŃĺ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġanimation Repository . query History By Origin Path ( origin Path )?. cache Path ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( cache Path Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsave File Ġ= Ġfile . getCache File () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġthrow ĠException ( String Constant . hint _ cache _ make _ dir _ error ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwith Context ( Dispatch ers . IO ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfile . copy ToFile ( save File ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcache Path Ġ= Ġsave File . absolute Path ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġanimation Ġ= Ġanimation Repository . query Animation By Image Local ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfile , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġorigin Path , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcache Path !! , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠmimeType ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresult Ġ= Ġif Ġ( Configure . hide Sex ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġanimation . result . filter Ġ{ Ġ! it . an il ist . is Ad ult Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġanimation . result ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġresult List . post Value ( result ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġshow Quota () Ġ{ ĊĠĠĠĠĠĠĠ Ġlaunch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġquota . post Value ( animation Repository . show Quota ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġä»İ Intent ä¸Ń èİ·åıĸ Uri ï¼Į å°Ĩ åħ¶ clone åĪ° ä¸´ æĹ¶ çĽ®å½ķ ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġparse Image File ( data : ĠIntent , ĠmimeType : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġlaunch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrefresh State ( true ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfile Ġ= Ġdata . data !!. clone Uri ToFile () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( file Ġ!= Ġnull Ġ&& Ġfile . exists ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġshow Image Ġ= ĠShow Image () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġshow Image . mime Type Ġ= ĠmimeType ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġshow Image . origin Path Ġ= Ġfile . absolute Path ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġshow Image . cache Path Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġimage File . post Value ( show Image ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠException ( String Constant . hint _ select _ file _ path _ null ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// æĲľç´¢ åĽ¾çīĩ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsearch ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfile , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnull , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfile . absolute Path , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠmimeType ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġæ Ĵ Ń æĶ¾ è§Ĩé¢ĳ ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġplay Video ( result : ĠResult ) Ġ{ ĊĠĠĠĠĠĠĠ Ġlaunch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġrequest Url Ġ= Ġ"${ result . video }& size = l " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtrack Event (" play Ġvideo ", Ġmap Of (" url " Ġto Ġrequest Url )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnew Media Source Ġ= Ġmedia Source Map . get Or Put ( request Url ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsource Ġ= ĠMedia Item . Builder () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Uri ( request Url ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠProgress ive Media Source . Factory ( exo DataSource Factory ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. create Media Source ( source ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmedia Source . post Value ( new Media Source ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġloading Video . post Value ( true ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ }