package Ġcom . example . sun ny weather . logic Ċ Ċ import Ġandroidx . lifecycle . live Data Ċ import Ġcom . example . sun ny weather . logic . dao . Location Dao Ċ import Ġcom . example . sun ny weather . logic . model . Location Response Ċ import Ġcom . example . sun ny weather . logic . model . Weather Ċ import Ġcom . example . sun ny weather . logic . network . Sun ny Weather Network Ċ import Ġkotlinx . coroutines . Dispatch ers Ċ import Ġkotlinx . coroutines . async Ċ import Ġkotlinx . coroutines . coroutine Scope Ċ Ċ /** Ċ Ġ* ĠCreated Ġby Ġ åĴ ¸ é±¼ èĩ³ å° Ĭ Ġon Ġ 2 0 2 1 / 1 1 / 1 3 Ċ Ġ* Ċ Ġ* Ġdes : Ġ ä»ĵåºĵ å±Ĥ ç»Łä¸Ģ å°ģè£ħ åħ¥ åı£ Ċ Ġ*/ Ċ object ĠRepository Ġ{ ĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġæ Ĳ ľç´¢ åŁİ å¸Ĥ æķ°æį® ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġlocation Ġ è¦ģ æĲľç´¢ çļĦ åŁİ å¸Ĥ ĊĠĠĠĠ Ġ* Ġ@ return Ġè¿ĶåĽŀ æķ°æį® ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġsearch Location ( location : ĠString ) Ġ= Ġfire Ġ{ ĊĠĠĠĠĠĠĠ Ġ// åıĳ èµ· è¯·æ±Ĥ èİ·åıĸ åĵįåºĶ æķ°æį® ĊĠĠĠĠĠĠĠ Ġval Ġlocation Response Ġ= ĠSun ny Weather Network . search Location ( location ) ĊĠĠĠĠĠĠĠ Ġif Ġ( location Response . code Ġ== Ġ" 2 0 0 ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// è¯·æ±Ĥ æĪĲåĬŁ å°ģè£ħ è¿ĶåĽŀ çļĦ åŁİ å¸Ĥ æķ°æį® åĪĹè¡¨ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlocations Ġ= Ġlocation Response . location ĊĠĠĠĠĠĠĠĠĠĠĠ ĠResult . success ( locations ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// è¯·æ±Ĥ å¤±è´¥ å°ģè£ħ è¿ĶåĽŀ çłģ æīĵåį° å¼Ĥå¸¸ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠResult . failure ( RuntimeException (" response Ġstatus Ġis Ġ${ location Response . code } ")) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ åĪ·æĸ° å¤© æ°Ķ ä¿¡æģ¯ ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ å°ģè£ħ å®ŀ æĹ¶ å¤© æ°Ķ ä¿¡æģ¯ åĴĮ æľª æĿ¥ å¤© æ°Ķ ä¿¡æģ¯ ä¸¤ æ¬¡ è°ĥçĶ¨ è¯·æ±Ĥ ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġlocation ID Ġ è¦ģ æĲľç´¢ çļĦ åŁİ å¸Ĥ ID ĊĠĠĠĠ Ġ* Ġ@ return Ġè¿ĶåĽŀ æķ°æį® ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġrefresh Weather ( location ID : ĠString ) Ġ= Ġfire Ġ{ ĊĠĠĠĠĠĠĠ Ġ// åĪĽå»º åįı ç¨ĭ ä½ľçĶ¨ åŁŁ ï¼Į ä»¥ ä½¿çĶ¨ async åĩ½æķ° ĊĠĠĠĠĠĠĠ Ġcoroutine Scope Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// å¹¶ åıĳ æī§è¡Į èİ·åıĸ å®ŀ æĹ¶ å¤© æ°Ķ ä¿¡æģ¯ ä¸İ æľª æĿ¥ å¤© æ°Ķ ä¿¡æģ¯ åĴĮ å½ĵ å¤© çĶŁæ´» æĮĩ æķ° è¯·æ±Ĥ ï¼Į æıĲ åįĩ ç¨ĭåºı è¿Ĳè¡Į æķĪ çİĩ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdeferred Now Ġ= Ġasync Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSun ny Weather Network . get Now Weather ( location ID ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdeferred Daily Ġ= Ġasync Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSun ny Weather Network . get Daily Weather ( location ID ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdeferred Indices Ġ= Ġasync Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSun ny Weather Network . get Indices Weather ( location ID ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// åĪĨåĪ« èİ·åıĸ åĵįåºĶ æķ°æį® ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnow Response Ġ= Ġdeferred Now . await () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdaily Response Ġ= Ġdeferred Daily . await () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġindices Response Ġ= Ġdeferred Indices . await () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( now Response . code Ġ== Ġ" 2 0 0 " Ġ&& Ġdaily Response . code Ġ== Ġ" 2 0 0 " Ġ&& Ġindices Response . code Ġ== Ġ" 2 0 0 ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// å¦Ĥæŀľ åħ¨éĥ¨ è¯·æ±Ĥ æĪĲåĬŁ åĪĻ å°Ĩ ä¸ī èĢħ ä¿¡æģ¯ å°ģè£ħ è¿ĶåĽŀ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġweather Ġ= ĠWeather ( now Response . now , Ġdaily Response . daily , Ġindices Response . daily ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠResult . success ( weather ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( now Response . code Ġ== Ġ" 2 0 0 " Ġ&& Ġdaily Response . code Ġ== Ġ" 2 0 0 ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// å¦Ĥæŀľ å®ŀ æĹ¶ åıĬ æľª æĿ¥ å¤© æ°Ķ ä¿¡æģ¯ è¯·æ±Ĥ æĪĲåĬŁ åĪĻ å°Ĩ åīį ä¸¤ èĢħ ä¿¡æģ¯ å°ģè£ħ è¿ĶåĽŀ Ġ( å¯¹äºİ æ²¡æľī çĶŁæ´» æĮĩ æķ° çļĦ åŁİ å¸Ĥ , è¿ĶåĽŀ ä»£çłģ 2 0 4 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġweather Ġ= ĠWeather ( now Response . now , Ġdaily Response . daily , Ġempty List ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠResult . success ( weather ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// è¯·æ±Ĥ å¤±è´¥ åĪĻ å°ģè£ħ ä¸ī èĢħ è¿ĶåĽŀ çłģ æīĵåį° å¼Ĥå¸¸ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠResult . failure ( RuntimeException (" now Ġresponse Ġcode Ġis Ġ${ now Response . code }, Ġdaily Ġresponse Ġcode Ġis Ġ${ daily Response . code }, Ġindices Ġresponse Ġcode Ġis Ġ${ indices Response . code } ")) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ åħ¥ åı£ åĩ½æķ° Ġ ç®Ģ åĮĸ live Data åĩ½æķ° çĶ¨ æ³ķ ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ å°ģè£ħ æį ķ èİ· å¼Ĥå¸¸ ä»£çłģ åĿĹ ä»¥åıĬ è¿ĶåĽŀ åĮħ è£ħ æķ°æį® ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġåĩ½æķ° ç±»åŀĭ å£°æĺİ suspend ä»¥ è¡¨ç¤º ä¼łåħ¥ çļĦ lambda è¡¨è¾¾å¼ı çļĦä»£çłģ ä¹Ł æĭ¥ æľī æĮ Ĥ èµ· åĩ½æķ° ä¸Ĭä¸ĭ æĸĩ ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param ĠT Ġlive Data ç±»åŀĭ ĊĠĠĠĠ Ġ* Ġ@ param Ġblock Ġæī§è¡Į lambda è¡¨è¾¾å¼ı ä»£çłģ ĊĠĠĠĠ Ġ* Ġ@ return Ġè¿ĶåĽŀ åĮħ è£ħ ç»ĵæŀľ ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġ< T > Ġfire ( block : Ġsuspend Ġ() Ġ-> ĠResult < T >) Ġ= Ġlive Data ( Dispatch ers . IO ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġresult Ġ= Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġblock () ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠResult . failure ( e ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ// è¿ĶåĽŀ åĮħ è£ħ ç»ĵæŀľ ĊĠĠĠĠĠĠĠ Ġemit ( result ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ åŃĺåĤ¨ åŁİ å¸Ĥ å¯¹è±¡ åĪ° sp ç¼ĵåŃĺ ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġlocation Ġ åŁİ å¸Ĥ å¯¹è±¡ ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġsave Location ( location : ĠLocation Response . Location ) Ġ= ĠLocation Dao . save Location ( location ) ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġä»İ sp ç¼ĵåŃĺ èİ·åıĸ åŁİ å¸Ĥ å¯¹è±¡ ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ return Ġ åŁİ å¸Ĥ å¯¹è±¡ ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġget Saved Location () Ġ= ĠLocation Dao . get Saved Location () ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠåĪ¤æĸŃ åŁİ å¸Ĥ å¯¹è±¡ æĺ¯åĲ¦ å·² è¢« ç¼ĵåŃĺ ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ return Ġæĺ¯åĲ¦ ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġis Location Saved () Ġ= ĠLocation Dao . is Location Saved () Ċ }