package Ġplay ground . basket Ċ Ċ import Ġio . reactivex . rx java 3 . core . Single Ċ Ċ /** Ċ Ġ* ĠGiven Ġthe Ġfollowing Ġclasses , Ġimplement Ġa Ġway Ġfor Ġthe Ġ` Shopping Basket View ` Ġto Ġ` display B ask ets `. Ċ Ġ* ĠBear Ġin Ġmind Ġthe Ġfollowing Ġconstraints : Ċ Ġ* Ġ 1 . ĠIn Ġorder Ġto Ġ` getB ask ets ` Ġwe Ġneed Ġa Ġ` secret Key `, Ġand Ġfor Ġthat Ġwe Ġneed Ġto Ġbe Ġ` login ` Ġ( Session Api ) Ċ Ġ* Ġ 2 . Ġ` getB ask ets ` Ġreturn ĠB asket TO s , Ġwhich Ġcontain Ġonly Ġthe Ġproduct Ids , Ġbut Ġnot Ġthe Ġ` Product `. ĠIn Ġorder Ġto Ġget Ġthe Ġproduct Ċ Ġ* Ġwe Ġneed Ġto Ġuse Ġthe Ġ` Products Api ` Ġ` get Products ()` Ċ Ġ* Ġ 3 . ĠThread ing Ġ( parallel ism Ġwhenever Ġpossible ) Ċ Ġ* Ġ 4 . ĠError Ġhandling Ġ( login Ġfailure , Ġget Products Ġfailure , Ġretries ) Ċ Ġ* Ġ 5 . ĠBear Ġin Ġmind Ġthat Ġwe Ġdon 't Ġwant Ġto Ġlogin Ġtwice , Ġeven Ġif Ġwe Ġtry Ġto Ġrequest Ġthe Ġget Products Ġtwice . ĠThink Ġof Ġa Ġway Ġto Ġcache Ċ Ġ* Ġthe Ġlogin Ġresponse Ġso Ġit Ġcan Ġbe Ġre - used Ġin Ġthe Ġstream . Ċ Ġ*/ Ċ Ċ sealed Ġclass ĠError Type Ġ{ ĊĠĠĠ Ġdata Ġclass ĠNetwork ( val Ġis Connected : ĠBoolean ) Ġ: ĠError Type () ĊĊĠĠĠ Ġobject ĠOther Ġ: ĠError Type () Ċ } Ċ Ċ interface ĠShop ping Basket View Ġ{ ĊĊĠĠĠ Ġfun Ġdisplay B ask ets ( items : ĠList < Basket Item >) ĊĠĠĠ Ġfun Ġdisplay Error ( error : ĠError Type ) Ċ } Ċ Ċ data Ġclass ĠB asket Item ( val Ġid : ĠB asket Id , Ġval Ġname : ĠString , Ġval Ġproducts : ĠList < Product >) Ċ data Ġclass ĠProduct ( val Ġid : ĠProduct Id , Ġval Ġname : ĠString , Ġval Ġtype : ĠProduct Type ) Ċ Ċ enum Ġclass ĠProduct Type Ġ{ ĊĠĠĠ ĠF RU IT , ĊĠĠĠ ĠME AT , ĊĠĠĠ ĠF ISH , ĊĠĠĠ ĠV E GET ABLE S , ĊĠĠĠ ĠUNKNOWN Ċ } Ċ Ċ type alias ĠB asket Id Ġ= ĠString Ċ type alias ĠProduct Id Ġ= ĠString Ċ Ċ // API ĠLayer Ċ Ċ interface ĠSession Api Ġ{ ĊĠĠĠ Ġfun Ġlogin ( username : ĠString , Ġpassword : ĠString ): ĠSingle < Session TO > ĊĠĠĠ Ġfun Ġlogout () Ċ } Ċ Ċ data Ġclass ĠSession TO ( val Ġsuccess : ĠBoolean , Ġval Ġsecret Key : ĠString ) Ċ Ċ interface ĠB asket Api Ġ{ ĊĠĠĠ Ġfun Ġget B ask ets ( secret Key : ĠString ): ĠSingle < List < Basket TO >> Ċ } Ċ Ċ data Ġclass ĠB asket TO ( val Ġid : ĠString , Ġval Ġname : ĠString , Ġval Ġproduct Ids : ĠList < ProductId >) Ċ Ċ interface ĠProducts Api Ġ{ ĊĠĠĠ Ġfun Ġget Products ( secret Key : ĠString , Ġid : ĠString ): ĠSingle < Product TO > Ċ } Ċ Ċ data Ġclass ĠProduct TO ( val Ġid : ĠString , Ġval Ġname : ĠString , Ġval Ġtype : ĠString ) Ċ Ċ enum Ġclass ĠConnection ErrorType Ġ{ ĊĠĠĠ ĠSESSION _ INVALID , ĊĠĠĠ ĠNET WORK Ċ } Ċ Ċ data Ġclass ĠConnection Error ( val Ġerror Type : ĠConnection ErrorType ) Ġ: ĠError ()