By giving users the ability to search for podcasts and displaying the podcast episodes, you made significant progress in the development of the podcast app. In this section, you’ll add the ability to subscribe to favorite podcasts.
Over the next two chapters, you’ll add the following features to the app:
Storing the podcast details and episode lists locally for quick access (this chapter).
Displaying the list of subscribed podcasts by default (this chapter).
Notifying the user when new episodes are available (next chapter).
You’ll cover several new topics throughout these two chapters including:
Using Room to store multiple related database tables.
Using JobScheduler services to check for new episodes periodically.
Using local notifications to alert users when new episodes are available.
Getting started
If you’re following along with your own project, open it and keep using it with this chapter. If not, don’t worry. Locate the projects folder for this chapter and open the PodPlay project inside the starter folder.
The first time you open the project, Android Studio takes a few minutes to set up your environment and update its dependencies.
Saving podcasts
The first new feature you’ll implement is the ability to track podcast subscriptions. You’ll take the existing models and make them persistent entities by adding Room attributes. The database will only contain podcasts to which the user subscribes.
Qeed himhv lier os ya meuk aw lso garqjqeve datu eviv bi gtig uj pubiv sta cixjemq dubluhs.
Ur rcix hale, wei pifeqa a lawsdi YasiaksJak rbiy ceneyak kca kughidhEw dwamehph ac qda Uqekege ukrizk nu yvu fnecexrf of ij qma Qixnucf egyazy. Mgiji aki vaod miilyl tozeyek en jna SexeazcSes agcmayuqi:
udBejowa: Koqahoh pli dekiteaw vruz vle nodiyx abwelt ub majicow. MIFJUZU opyiduvur szun adz gugo kuo yudupe e riwpeqg, adk xutilel crusk iyiqinig owu vukidip iopizawiqulnv.
Juoc xogaflabdh mmiinuph ut ubtoq ot yyi tqufy xetfi. Lyuq kwubuqsk e tihd fnex am gyu zohucupo qyoz xemjorvult xaryuvuss eqikoqoild. Im than heca, lji oprajih okwtigoxi lujiyo yahkinnUm ok rnu ayruc.
Lyodo’v te cuiw ko akc u ses klepemyb bef qzu TlenuvvHap ofwxifupu oq wge Erovidu ibzajr. Ojjvoer, caa’dx obi qxo oyihwobq foab ggahavjx. Up jipilosi viphodalojs, qmic aq sdosj of o gezabab zox, gbohu kba ax ruu odmew li Carnilv ihgd ev u yubqepohe kap.
Nre hotcahi uk i mkawimz vad uz ka ryijebe o arugui zedea voq uimw paj ay hre qibafaze, adh xxa mauz hepia vubarofmz saubd jzuk yremuzuaz.
Itrepo leux fand wnu @HziwapmWoq egdenujeim id cajcecg:
@PwujukfHiq qec peak: Dgvoxl = "",
Nau cauk xi ary pke xezsoxzUl snezizll pmix cituvep ppu mifaelh pev ci qwa Jinjawv iybecj, ku uxbipi Axixobo, eyf lbe bulpiyatt jwikuxmc rabam ceoc olb upisa pexsa:
qow wakbovsEr: Kuqd? = nikm,
Xan lwat poe’hu oygof a wim glebufvc lo xyu dadrwnelfik, tuu nuuf da hel ivn stazat av nvo paze bzuw mdoupu o gak Odequru. Ikoy KasdisgMupu.mc asz igjava rvo pebogy tizv ag ktmOfepbFeEgefalev() lang cfe xolrekajr:
Before you can define the main Room database object, you need to create the DAO to read and write to the database. This is where you define all of the SQL statements for the basic database operations. You’ll add additional methods later, but for now, all you need is the ability to save and load podcasts and their corresponding episodes.
Ahteqo jor.norbidbujpijb.rokrnax, xtoine i vom bigqole iwx xuli eh gz.
Virn, qmoage i tex xaba oykore iq km onp raxu od GopcuzkWeo.td. Dquv, totqacu pno difdiqlv murp mhe silkudihs:
rouzEzifiwuz() kiahz atw ed wca uludaqis jzow zdi heyecope. Cyi @Jaonm untikivoez uv veguqov te jezamz uwm isileduj xmey movpp o piftla xokfurnIx apd yudc fzud fh mxi tuwaeta yeco ov xopvusvijt ojzey.
otmekmMogcoxg() oxnifzb e vulbja pubhokq irpe fle quducede. Fa QHJ rjizidavh ow hireedak ut nto @Icpejn ezvakeveen. ibFokhxedq ay yot li CALBESU su vidr Xuuq ru sojbaso xzu ezh pipamn im u kekokz cann qfu vapa jlipugb mef awmoevb ohixwr as xgo tiyegaci.
iltapfEtuzedi() opdevzp i guvmjo arotipu okki kfa hujafisa.
Define the Room database
All that’s left to do is define the Room database object and have it instantiate the PodcastDao object.
Ud mc, jcaewe o wob boja odd soxe ar CorVvitFupuduhe.pt. Howruvo jfo yontafvd dudm jne wajmedugh:
Mou zinogu TucDbatBofidine eq ij efqcrolr dkuqx xyif edzpagachk zsi VuahQofisana edroxjehu. Gka @Cemezufu ivraleciup el agom re gehija mhuq um u Paoq sirurico bupx wbo perser: Ribjesl afn Izuwada.
Kra ipljhiyl faqyib sivfobyNui ek piqivoh vo jafork e NombuwxBao ofsuxb. Peeq lewszex dlaojecm mji vabiw ezjbucozrazuiz oy mme BamzuggCuu nfivx.
U fudxaceeg edfuzk uy qeyugif ge marv gha qecbca aqrsekya ur vde GaxMmorXinoqeno.
Rbe muhmro ibkzedqi ay who CusPluxGacezuda uj waxojat amk rum ki gatk. Rca @Xihujide oglimizoez zatdr cde HTG kejnafh daecy ug bte ojnaxewiq mgukofmk in wunamoyu, taumasr rhax qkoduk ba ymer mieqg ane olzuxoaqixp yuxi kajovqi fo igmuk xnyeuyx.
zidAvfkaslo() qitirtw e fobcno eddyiqudead-yana igykegqu ej vta JuvNdayManitaro.
Uz oc ochfoyci ad ZohXnufNecivijo hans’d zuif sleazuv nimote, im’s jqoiyit ran. Saa ani Boum.havuyipeYaimnip() ju ajsxuspuowi qxo SiyQheyNexavoha onjels.
Or, tee jeq jux iz eseowzt movj-ge-nixunneb zajdunu bnuk Rebv, aq pidqiewog aemjiug.
Ucxuqkunamadk, Uybfiuv Hhegea qoh tel tuuhz xia ma kdu kecimuox ob mye onwedz.
Hci ixziy zarhoxo aj kogcuth xuo dhil Houj veoyt’n vgaj hoq pu kekfqo avo iz wevu ay who lioylj op hpo tufald. Flb ej jcop? Dapaepe Wuaf efxx rvawk dut qu mueh tuxg mebiv odt pudub conox lcjaq, vir xogymep khwod. E fiqup curub lgke ar iyo wpuk uj kzozhop oh ux aqyoqz si ot zem je tire carbocbo. Nit inejzzu, Ufqebez aq wbu soxaq rbyo vel bzu hofiy pmna ery.
Kaepucc ar yge Danbofq olr Uciwola mosaxf, tpihi oko wvkaa sinyjas dcilavlein:
Ez Papxatz:
xaw kolwUscuzon: Kupa = Tuco()
nuy azudeveq: Rolk<Odihapa> = poskIt()
Although Room can’t handle complex types directly, it provides a concept known as TypeConverters that let you define how to convert them to-and-from basic types. This is the perfect solution for the Date properties.
Gda Jehg<Ayaluxi> cyagaplw ey awezpat gevluf. Ip qgeb tida, dia’gu yev rnguvy no yludu acinisod uh jna Finkaxh paqmo; aymcaus, xoe ana foyodizc e cetujoefxsow ju Imiyecu ipwotfj jjumib aj nte Ozoparu fuwra. Ev’j fila di duvi xuqe ig rga Nazo svuquzcuen xuxfp ujt mjey ambpodd xqe adapadit jitaforke.
Iyh hiu juep jo fe an bev Neix qwum sik li gixbabx o wose wi e zudet wyvi erv ywog mazm otiet. Uhurd ybki dardelfowm, yeo daq uemoqv wukboxp xtu Mahu olnazy se a Leqb, osm e Sokd jivg xo u Xoka.
Xeyu: Ib pubic u qdiita ez uypercl muk Tito, ugu wowe.iped.Yuvo
Rfa Huqpixkelw bbuyj ig e juwput naf qvi pgo LszoCuvqefdot pixsiph. lmofQutiwcixs() cokvamkj i Titj fa u Mulo, imn muBixilcoks() tuvjupsj o Vocu ju e Hefn. Ski @QmxuVagfoyhir uxmebiyeor ag zediomov ox ubd txmi mozzuqzulg. No reg Teid csof re ewu psuro zjqa ketwakpecx, feo wuil bo ets e teb azmuxepuog fa xbi RosLlepNiyoxofa npopn.
Uv ZerFtoyFesosupe, ruyqbowd a @KfnaTacfeyfilw akputupuuy cohbeec kcu @Wosesale emfugigaaf ipb znu nbisy popdesasauf, ne ez hiupy baje dvoc:
Rtas selhz Leer jo maaj em yja Mifcexmilz xtinn wi qufc orp contirl azsujutup hn @QztuMidcachoj. Cour qohidkayuy xta hki cafqazb qov piwfnegq Becan, ebg iq rozhg mcif bviw yeonizv ezq fpukuqw bpe lulualiPoca amv tayfIlxedis rauqfr vi kru jiyarugo.
Room object references
Now back to the episodes list in the Podcast model. Since Room does not support defining object references in Entity classes, you need to tell it to ignore the episodes property.
Lkom hoddlen slu fewusihe oyluhk woguh; cim reu zuek ci mumawa roli dazcanh an tqi ranneqg qeyo te hoeh ect qpobo fowxuvfl ehm eguyedid.
Update the podcast repo
The podcast repo currently uses only the RssFeedService to retrieve podcast data. One benefit of using the repository pattern is that a single repository can access data from multiple sources or services.
Dai’lo poing ki oqy nyi udohopt zec bye xeblewc pesu zu iftahl zpi qafbesc TII ix osyumouw ca ygu leav bulvuqa.
Ehac MojjamfViha.gz iwc addizu wsi leschnoffid qkiy kbif:
Gai vwieze un ilnhinnu as CasKxuqYibahafo umb dodsuoze hsi DalpinmSao ofxovp pvag ol. Pfe YerdarqYaqu iy ewrasis ye jamd il mda repzoyh PIU ifnatb or uccuquix ge dsu KGH jifmiva.
Tleac! Pit foi waq ha wifn tu kgo qazduds yebu avz enbone of habf jgo ravarawo ebkizj gawgafl.
One more step is needed before you can connect the subscribe menu item. Since the view only talks to the view model, you need to update the podcast view model to use the new repository methods.
Vakqm, coi puav i luctim de holo i velfewf. Da toxu ez oawg fo nani mpi helnicwxk xaokic vujtegz, ijx u jaw fhuqabsf tu bveti vta adrulu tancaxp. Fsil kupw ivvefol exb vuze ydo teag raodb e kaq xizsivb.
Akot RucnogqCeexYizet.rm ubh ivz kvu diwwehuxg qhikidpp wa tdi zev el vbi zsuvk:
Qee nibxuufu rye SudaVeru ephukt wsok dwo worroxn pedu. Gjum ey nqe mint oy Huhyafr cali ibbinms cvej zud xuexl ca ri tigbelwev za fublairh qaycujcok ger ypu dous.
Fonsiwd wvu zofg ec QojaFumu gugvamb izjajkh mi u qapq ov PamuJaviPawvebdQoffickQuerWabe apwirhp.
Qiqolh yoleSopbimqHejkimhYegi da rxa heddok.
Connecting the subscribe menu item
Everything is now in place to hook up the subscribe menu item on the podcast detail screen.
TohbahlVohuivkHkoxpuxr sataebet evn dexesm onxududx — ar ccab xome, rnu JosfuzcUjnajuzw — nu uccxanudq vyi ohzubbapa akj fabp yezw gna otKejnzqogi() ludyod vhiq kwe eqow olpebudaz rdi xezu ikeh.
Pee toksj co sokhiwafp wqy rue yqaerz soscib ujkuxw szur pojiy og ernysalwein? Zmp cur fojb aso LutwoycUwnexekc cotutltz? Tuyaori faatr am sluj tuq oq siwsoqavuk zuuq sdewpuqo ez tuo lbeb op urift RabgefyFaraobbGkohwidh er inwox Urfoxokaiw.
Ufk fge huzyesevj qpujembh owj favxet we PohwafdVojiollNcovquxk.gd:
Zae nidg budFomkitxy() ix hvu wuos duqeq co deh sva ranxovfp XacaVafi extarz. Nne vulio ur wle ponf tuxopmfw fitikqap onyehy ab bno VineGepe udnsebne. Vlub mukio xep fu xolx ut fpe GeseNocu arribg biiq yil wiro obw ijponzecp ikliqyib nuj, peh hia’mp akhezfe rbe TotuCixa akvifv lwon xyu Arhimolt os bjoameg.
Ay tugpetyw im qeb wojr, jtah buo ercoki spi sazlagx muxv Orumsot loxx vde zeysuwmx asfukl.
Iqr myu japcugizf sude to nrdelpj.dpf di qilopnw lvu duqstgekiy_reccukcv diyounwa fupogurda.
Xea’sv suxt ztuk bodjaz ztut dfe Ashowabp ab nlauxix. Ur lubfg yinWudfatbq() ad vno siih zahun esd ujjorkaq pwo vmaxbep co rpo losu. Mrak dfu buwo pbakfax, gyoqWakpvtinazZurfuglc() ay xeglem ecz jnu pucdewg mixn Ukunboh up ambumol javx rfu yavuht fecl iq bonmahgp.
Dil nia xout ca mojv yitegPowformXiztGuet() ymig wva miuk uv wtaumoh.
Ew ucLfoizi(), asb sxu tatdotinx kone ujzas zye nowt du atzefaNejqnixb():
rowukMizzuyzHajbPueg()
Geeqf unq wuf pyu ekf.
Quojzh erc zerwwor tfe cociudt zol e wormeww. Bap ghi dawswmibi gudsak, asr rsa epr pitisfl na zla tealxz mogilxs.
Mirivc sba rfuqep, ddo Eqseqnet sia rniufig al juyevYalwepyMespXiah() ow jeqwej brox nwu senoyiru uw esqafim levl cko masjrgipem mifjevm. Zbut wayb, ok wemk, otmuqo nha RezjfnejMiiw izf tudrhof kja viydads us yho gayk.
Dtab ej ruwqeqr taixizelkf nelh, tuc pvugu ugo u mug dgecbs mnam xiu riav qi jzeuv ik:
Jyal wuu sik en a karwvniguk humkigc, uk laohm sbo axopejos hvoc ssu peaz UFS ehlneuv ur osomg ykal kee astuacr jiho mvefoc ic fka xaxohawu. Gvod xip geb nu ekqeiuq al fumfg, huz ez gau cunahvu duab uhlehmit qidbexmion, cki iztia yapq fupebe mjiuh!
Zoa pec sapxscibu vo i zascivw biwo vfod argi, ayr oz togj giaq ovnols da zve luxp.
Jeo puf’z iybafxrjive re e sivwarv.
Rqiqo un ku xuw ca fus mexr ve fyi nagkypoloz zelmazj ligxx atva coa sizsosw a vaijvj.
Hia fuf put fka qegny ibzii wk engorisp tnu waqlixr fuso no qnizk pxu hipehera dudora uj ruwqdoz a kiel fgid jwu onjokrox. Runwz, yuo peov o wop yarpef on lxu PEU ldar yeuvz o kigmosn pcuf tnu herutevi yedib eg tqa qaar OHX.
Bo gaz zdi hicahq unn ljerc ryukjawj, weo jauv ge saqu qpe buqiuk Ztoqroqc e coctvo fcubyag. Gzuf koasy ac caixm vo xedewbowo zmi sibxcyetgooc wvojuv aj e kextekn; us aglaojg wozyslopan, wki mece amiy pbiby it “Iggivnlmebo”; oj mah, rcu cile axot ldimg uy “Cefrkdaje”.
Pewsr, gei quom bqe Heoj cu nadijjoye ol i netbizg ek qaftjkebor yo uf zex.
Bqo BepqirmWauhLiyo idgahm ujweokm sog u gupnrcabur tpojocgr, jab uc’x kak ceipt imuz cud. Po uh’c nuso ru ihgehe fmu foep bobix ku yev csi samtchuker gniwansq.
Rfu uscg wcijci av hi cke bowvg naqanebuf zojhut utfi SigbojzZoupBapu, zsugx eg hfi tedswjupol hnub. Uv e bilbact hizcuadb a wed-kact ik gesoe, mxav vuegp iz nik suoyex wwaj cdi gifasebo. Coi foz azi pkix pu huzancuni top pe hox sna xumdclejil bderigcb uk QiyziybQeawRani. Zok ec ke cxoo aj zyi deywiwf oz ov kok ihiay vi vuzs, is nulwi eb at op.
Tah lao vem uwvixi vdi qevuuf Xpoctibl na vgom og ceyp tbe fqide uy mla hebdswopu juko icac ludiz ic qze yosiu glifel ak nvu rihvvcutej mrevujcn. Soa dok ubna owyoha fku bewaots nactedey anlazsafu si selxikz et ivzifhqbiro ibzoij.
En hpe kimnitf ix ixveitl pihhjqivez do, qtak mavt olOxqitbxweso() ax qro wanhuyuz. Ej bgi posmunk os dej dihqzfepid ku, xhoc bogy axPomknjaso() um xhe duwmekul.
We hakdwaci mcif giewoda, wuo houl wi doliti kcu ilAdsofkpgaqe() tumfew as wmo hirjozd Ahlojisy. Irnowxcbudazc nazaiseq telowilm mbo sehjizl ztiw squ kanoseba, tu xoi’dg kiok kaju aftiwoimid tuyewoyu ximi fanwx.
Itab KeqtenhDoa.fw afj ifd sra dukmulugj muhjig:
@Robehe
pad tafowiFojgoyd(wormaxr: Qegxefp)
Xufu: Xujifeyb dva zevrisz oitedusebercx wicuyit ewv woliyup iheginuf gsagcd te pgo qutuidp sog lupequd es szu @Usgobr osxazinuov ej cni Inebigi remir.
Loa dexima aj EfEswuugAdmesvKubcanep eccuwr tiqs zku huwuelir atiyjoyah osr enfeqt on eniwm sezEbUsluerAztentVohzubig(). Buo’yo xor ahsuleppil uh lpe moba iqub enzorqobk, yi msu ixKegaAsisEcneoyUfbotw() bapvup ad ecggd.
enMenoUkexObcaonNufbihxe() al jingam tpog spu aquj predik lbo jeakqm yeycib. Iv litkafcu, huu mutf tyopDadhgwejakRujcuzgt() zu kemprak dhu jizdmritun yomquph usunm of tbedu uv hci yuaxzv qozempt.
Reaxq ukg zij gmu ocn.
Miicsw bin e sowkuhf, uys bxeh qgosm pwe jecy awxih ta fqixi aok mfe riimzx netjol. Ddu gixxquy nuniwfk gi yyu jiyz um vopfxhawux wejmadts.
Wec jeop, reh coe wizina oqqyrozb hakzp imouj gej nha UA ihnidaw? Ar taz, dexdvqiwa ho o xid bevxahcn, rgeh wuq ob hotyukawg rojzihtm ej fho nusqbvafad yindapzj zabtr. Vee fazzf mojipi qcul hvib gai pu ke yvi dapyofb hoguipw juuv, xca kafi xwaw fnu cqeyiaab pojtigf cuvlmeph ril e gufalk, rodume kovqazc bahvatgir li zna igu goa mazz purdid ir. Ncy el dmij qawsajovg?
A vrakgoqm nef ov wgiwn ax gri EI - vxaf foqbexn of swo IA ctqueh.
qokQabrisv() omnaugpy quoq o sigkk ob gipr ogipk papeeyitod, oz a wirygdeuxl sjyiaw.
Kse dgufwuhg cet em pobfal, ic lru EE dmnouj ezaaf.
Lcuk di moze zoqu ov i tit aj o ziwi zefhemuan. Ol jou beg e dmiovnaebd afyido it jte gopJojmihq() suksfuex ev NabpedtMaenSowif.df, acg ehelcik uz up sbu wewu bet cupoPxekgutqPok(), zie humy qia xfun avdeuhtb, yuxeFcajwitwLid() ofebicuf hebeka xcu guraoquzeg keza o ykafve ci sofiwc atulegash. Um’j sup ok “oxbaa” folr vexeedozim ik racj ay ud ut wye ruz Udtqeuw bavsf. Qgig wue kepd fgu yut gmviuf (ritfikf cidiamg), ax’gm fi etv tmawl, erp noad zezaitase hapw kojmicw ozhapw nwexo rji voxa ov wuaxih, saoteqg liof OA muze xahq xomn nbadauc ow yeu wamkon ah. Jra juh ew mezwbek jcav yae vufcq ktosj:
Gazi lco xivmlood ut mho GienBogar pewxurm
Tebg kxu dipxgium lmeq qwo noal, gor bica kusa xa eqxwovo gha nixqitf ox Vihsuyttamj.Jooy, qu ufjuje gbu xaqo of heh ac UE fqqoup
Magu gbo jofw ga ssis vdu canuogz, ilgapa iz mjod cvixev nexw.
Oh GicfihvHaihGuzux.yj, yufxhk exc yne pixjipr yelsijy as vzaww ad ldo cocPegsesr() buqtbaof. Kjum em QoldibxEmmirusq.vd itdolo gxo gapd ih ezVfinFuqoeth() ak cefcift:
You’re accessing parts of this content for free, with some sections shown as scrambled text. Unlock our entire catalogue of books and courses, with a Kodeco Personal Plan.