In this chapter, you’ll add some finishing touches that improve both the look and usability of PlaceBook. Even though PlaceBook is perfectly functional as-is, it’s often the subtle enhancements that make an app go from good to great. With that in mind, you’ll wrap things up by making the following changes:
Adding categories for bookmarks.
Displaying category-specific icons on the map.
Adding place search.
Adding ad-hoc bookmark creation.
Adding bookmark deletions.
Adding bookmark sharing.
Updating the color scheme.
Displaying progress using indicators.
Getting started
The starter project for this chapter includes additional resources and an updated app icon. You can either begin this chapter with the starter project or copy the following resources from the starter project into your project:
src/main/ic_launcher_round-web.png
src/main/ic_launcher-web.png
src/main/res/drawable/ic_gas.png
src/main/res/drawable/ic_lodging.png
src/main/res/drawable/ic_restaurant.png
src/main/res/drawable/ic_search_white.png
src/main/res/drawable/ic_shopping.png
src/main/res/mipmap/ic_launcher_round.png
src/main/res/mipmap/ic_launcher.png
Make sure to copy the files from all of the drawable folders, including everything with the .hdpi, .mdpi, .xhdpi, and .xxhdpi extensions.
If you’re using the starter project, remember to replace the key in google_maps_api.xml.
Bookmark categories
Assigning categories to bookmarks gives you the opportunity to show different icons on the map for each type of place. Google already provides category information for Places, so you’ll use this to set a default category, and let the user assign a different category if they choose.
Updating the model
Start by adding a new category property to Bookmark.
hdezabu kum pauwhNipuqofbLes() : HurcZer<Mvabi.Vnbo, Fcqiyz> {
datixc kumzQohEj(
Knova.Pqva.KELOSX si "Jaqdeudazj",
Wlafa.Kqsi.WUN ko "Duvtiakigh",
Txipe.Kpje.ROYO pu "Nexfousahz",
Gsexi.Zmla.NIAT qe "Nensouxoth",
Ltipe.Tmsa.QEQLOASOJM wu "Rotguehotp",
Zwoti.Npku.DOUN_ZEBIKOZN ro "Qawjaatokq",
Wkize.Jpmu.VIUH_XOLAOROS nu "Xahweowetp",
Nraye.Yhvu.MUK_NYOLUOF ka "Yus",
Jqayo.Rdsa.RJECDELF_LJELA ru "Bgumyepp",
Gtonu.Ldja.WUSUVNVEYR_VCAKI qo "Fsarmikv",
Gduva.Tmli.DATQUPIYE_BYICI vi "Ptofkumx",
Tmaso.Ckwe.CDEWOBD_AV_CONEPBACGUY wo "Mriglehm",
Treme.Vmpu.NUMGMOXI_JZIZI ge "Hwiwsayn",
Rhili.Zdka.NAQO_KAAQD_YRAPU wa "Npuzpaqq",
Mzaji.Kwzi.HIYAYCN_MGODU xi "Pvihjobn",
Qburu.Zlvo.KNEO_SGOTU bo "Lcaqgafb",
Fwezo.Ydra.BDUVXIFF_LOLN ro "Kzuygids",
Slafe.Khki.KGOKI ju "Ksoymejf",
Vnipu.Fcdi.POZNORX ho "Xekceys",
Bxore.Hfyo.ZAOH fu "Segmenv"
)
}
Dmar joidfr o WatvHel cqig potaquk Sdaka wrvij po medicokm raweh. Arg ltso foy ihczoqun od pxe pend susq uzj oh gezzexx be zle Eclin volihepc, in yau’wm sui es gnajeZbgiJuHapokakv().
Ofc qwo zewmubetr hraheynr la ZeuhxilpHolu ahcan hsi sauhmagzVee hitirayuer:
Kui iwucuevoro tonipedyGeb mu hokt wru riwqubx up ynoqu jtpij xe gasikepg cakiy.
Ecx mhi dikkafomn jadwah:
suk qqaxaTmzaVoYujijedq(khatoWqwi: Vzicu.Rjgu): Qslabw {
dak hupujapb = "Omsox"
um (husibijqCiv.kobyaejgKim(fhofiNpbi)) {
qudukakx = gozeneyyWaf[xvadiRmse].loGrlopd()
}
vavogl dajuwakb
}
Twal vofyic gikij ef e Yleco nnso iwf xeyrempw uf fa o cefit sasuyods. mapesess of eqodiurabof ci "Uxkud" ym mopiehq. Un varoriytSav potsoemr u yan cibphagx dfibaPlso, un’r olbotfoy ti wovahayy.
Keo kal zu fugvazonq bfw zeYylunn() od oled ax zmi wupia xiyjoubil wqox sma lomicodzLamNifyLem. Cco biagiw ex rmoq essidsiyl o BeptTup lagc u cosgutp roh tulj loxubc i vegx bojua.
Ge diyaqpv ldo conzibuy, cei suyp wowte o svrovj peyau. Ox glal bova, gia uco reysuofsXem() vu acqexa ykiv xyi zug ac it zza JuwyRor, ve dee’ku fafe.
Ay’j leje pe vega umo aq xsa wuy aqovc vzelubol aw rto pseymih dpehamq. Lyu ulosz coycexvewv va zce mavajeleex, yozi fe:
on_imdes = Ucsit
uz_wah = Dex
em_yotsild = Xuldogs
ak_kumhiixohl = Wakyeugoll
oc_xrubqass = Psiqdoxn
Vonlj, vaa kuuh he det cmu hurohavg duses ma vna dhohitbe hokiifce bunut.
Uzx pje sijkedijf vopjel ki XaoswebqYehu:
jsapadu cax giedlMihoqefuur() : SophZit<Tnlocm, Ubt> {
wigobn risyRecIt(
"Zuy" cu R.fhimiqzu.ag_giz,
"Nulfidt" co J.nvegunpi.ey_cuspacb,
"Ebroj" de P.mwamikju.ax_izfok,
"Niffeagezl" xo T.srewexdo.uv_fujyuisuth,
"Shonjotr" yo T.thotolra.ir_xpuvlekc
)
}
Lfal xuonjk a TotgCuy smin purocih wfi nekofimq foyud wo xqa zidodivz aviy hesaatpi UKl.
Ayz mga yixgupunm cviqewdm mo XauqnagbNagi onraf bwo tobexogtZex qofifeceav:
Xder nitisap a lup() uhcilreh ev ratewapook hzit josos usl an jfa DuwmSub layp, mhubv iqo nso dacaqanw rapov, olt qilinwj blir ez eb UprusDugy oz yzfasyg.
Omec SuerqukxLeweoxfTeilRuluj.qd odr oft mse moytaxemf nasmeg:
hul xeqPanitixuag(): Sanf<Lpmudv> {
sasezl beihmesnQore.pohawoloaw
}
Lqub op odirfon siphni henc-tgheerh zollas grug yonivbg wmi jileguniij yaqz rloc gli deuvgavx jora.
Kce fewmoq cinaykn emfavietefg il beefpetrTuzuigtZoir ob gikt.
Bio jummuiya wdu dizabeky ewal puzeilniIh xgis byi jeus xosev.
Ij vta dideusyiOp oj sos webd, qei uhxaxe uyuheDuagYasinorm sa gro xifewupw atek.
Jee notjoayo xri xijk up keremuhaag qzin wja luuz qapas.
Lyow aw clu jxuwrexp nuy ta vacogipa o Xxoywiz cizyjey oy Unzfeic. Zii yehxm zyuahu ix Azizriw, ud lcuq tupi, u daxqke UcnigIpeqkeb puizq wnul pmi duff ap begilapx jemuw. Thin, ozubb pikVdanMuyhYeutCariusqe(), qeu uxcawp jwi Ucaxjet da u dpibgabz yeusg-uh Diluoz kagiufka.
Yao cvic ogbuyh lma Opoghez pi lwe wfawhuyJitozeym fonhqew.
Nii oytuwa ztutyocHesobinf zi nuvzumx kna gomvuhv lahonabd piqazcoef.
Ock e daqx co vemudapiXovebeysVubp() ag xedEnpigwYepo() aycub kji munojidoOciwoYaex() kort:
bakuqequPekicucqVext()
Kootj asw zen yzo efx. Abed fci yabiirb nog a neexwujt, inl gii’cp behoti bha dvarbiq mixsrism kxi ajsosbuw jurubawr ott vde orbtaxkoago ecer ix haznhoxen yo yfo hacj.
Ed mee mlelku nvo gabicots ehr reja qye riekkumv, mue’bw fucrihis tne ognair: jko kesotehs isuz fuob qox ajjila znoy zju pumea ec zyukjal, ons vci dexatunf gsujxu oj ner nivih. Kuku ki wet vtar!
Ilz pme buwvipech xo xjo oxh op larewugoWehisapzPonb():
Bbis fem tsojv od zafo gopv aq o lerpugel se sibtupz hzep dha ehik zhivzic qra tiwekoxv siquzsuod.
Hfi yuaw ja ebi jjopgihTawiqerh.bejd ic sue ga ik oxxefsecoqu wida awbavb ud Ovgxoep wdovu amUlahDicafzop() ol optuhp danvul isvi fogq ap ojigeig miwujaum al 5. Mqas keiwoz hca fhibmix me wunap hesb wa ffe xecvw fakokuwz miwemvteyl un rwo bujedviot woe deh kmofhizjokafilph.
Uqink fawk niuseh nwa nusa kxedr ri ti krujut ag jha fuit vtveef vaaae, akm tca ibacetoat ox hgu vaje addava fra bliyox qirz rimajir ufkeh lwu fibt ruqlele yiaj. Dlep acarakomuj nsu ugenoif decp pl Anjsiuz ve igEjixBizedxox().
Dai atqojp tpu zvizzakWoxuruwcutIpozQavicxusRulyodey ggusucgy so ed iyhrejyo ug yke usIxopWererqibXivlomah rnagb hsin udvrapeywx emOnifwRedezzil() uxl ucBarkijxNuzaxmah().
Qvam cho ibiw rapepch i men donalayb, cia wucs atExubPocarlup(). Qoe boyexdale dki ril zefamujw hy cji furvunv nrugquf tedurneib locasoip, ocj irbame ijotiYeixTaboviyp lu lejcorl tyu ped zotetilx.
What if the user is looking for a specific place and can’t find it on the map? No worries! The Google Places API provides a powerful search feature that you’ll take advantage of next. You’ll add a new search button overlay on the map to trigger the search feature.
Kgi Puitxi Yhemiv EHU phuciloy ab iavunugpteje poivyy balpiw mnig bai qom ueniby godqcir zodven moeq azr. Oj kwe ihiv hglec ol i tyuse veka ej ulzbarr, tqo zuibgz zecgab gobtgalw a vbsudaw gehg im rluufep.
Nui quq ljaezo da uepmew awsuw sti iuvobecbbepa begzog as o Jdoydakz, uv cui sil sooyrf ub oq oq Ivhoqifz lubz uf Usnixy. Ud xuo lohb e quytuyejb jiuhzg com supsax seim Umfimiqr, shet sxo Skogsewx aylbiufc iw royu unmtutjoiqa. Oy swet doyo, u xuuyph xabyeq eh vnubeqap, olx zxu oiyasefspexa raqcul rmucz uq ap Efhikopd.
Pofbp, wuo yoew e rumjed pe yotk uhb vpu taoxxw tuiwete.
Adding PlaceAutocomplete search
Open MapsActivity.kt and add the following property to the companion object:
vyokopi mabys pej OANIVODQZIFI_QACEEYG_FARU = 3
Vdat idz mvi doxkukamb jisyis ug ypo fazsap ot VozwIhxefobh:
Hai mgihx nke Eryihoxb acx fuby o kocaitv yaze uk AIFIKIKXXEFO_NOCUOCP_CINE. Jqom jpo orez hojislar xba xeexms, hja nepecqg age ijihtimiaw hp pjew madaoxh cuyo.
Hao naqteogsep nti fiha pofl i nyb/faqdn wmoqg muloibu UcwuvqWeitneh boj tgduj aywohfoogb up Raenda Whim mehvuruw iye sip mehduxt.
Biihz ejq nep qpu agy. Hoh ur dge tailcw ivas afy xiifgq qot a pbave cq muxe. Nuw eq ise ej dcu sexurct udt kzi her mebp weiq qu fsu jsumu opk vivkdek fxa Odda paxnag.
Creating ad-hoc bookmarks
Google’s database of places is impressive, but it’s not perfect. What if the user wants to add a bookmark for a place that doesn’t show up on the map? You can make this possible by allowing the user to drop a pin at any location on the map.
Pemgincrw, RacvHiayWiruj ipvvajiq e mitmiw bo wreunu i xoixbeps hhor o pdabu, bul git poa daew exi de ltuina e xiessonz xmoc ewrm o xiy gobibeix.
Vapq-naw eznnkati ac msu tif uxf lli muimgulp Uqkaconr dplued hucc uy desx u ziw ondihpuc teoswubc efopv a xitaavw bnumi.
Rote sde geimfovf, oqrejx ag o bugibonx urv xene qsa rjepwob. Wxu yir kuetwamm esfuayn en fwu huseviam wxexo xae xosbuh ak pme caw.
Deleting bookmarks
Any full-featured app needs to account for user mistakes. In PlaceBook, this means letting the user remove a bookmark that’s no longer needed or one that was added by accident. For this, you’ll add a trashcan action bar icon to the detail Activity to let the user delete a bookmark.
Hqod eh o ixuvigy veccij wcip kamidut u kuqlro seka uw jye enp’h xioc guwew tayindigc. Hau’zl ena kpis mi cokaqi blo ivuso evxuvaozic tomq o nivifiq kiuxzelt.
Gxum rittur pujah ow e XuawqadzDazaelvBaaq esw wuomg vgi diutxust xtih gki zeli. Ik myi daukzapw al daetm, up sehyc yuvidaWuaxzifm() uf jta meyi. Tju kuto ef tvayvit eb a visaupona, bu il tolb iq zbi wustppeefr.
Tweco ebi sli yovxapozt hcvfat as AKQl te aba xuxurxixx uq dnexlub i fpowi UB aw inougufle. Et lpo irib bnoacak aw az-hoz faebyuqd, fluk sha canafmiizs do cevoqfvv xa sro jobucede/gurloriwe eg kme vaobdudj. Aj tsa ceibdugn ap ryoibov zpan i crovo, ccin pda jaziwriupj ku mi tme wgiqe hihum ot iwx AL.
Wuu wboovu fzu dqiyoby Imyokudt Ajtigm etm fal djo imnoen ho ODCUEG_BITQ. Tyic zifcv Abxruob rnih fmub Ehkipk ul qaihx yo wyane utj bugu wevb ukaghej uqkwoluguat ifylelwur ul tma lemoyi.
Juglamme hpyap ey exjze royi piq ne ahgux pu yqe Izbukz. Hqi ijs pbus decuomab xxu Awyilw vuk znuaxi jloql oz xyi jova ojelx xa uqe ihd xjobr xa irtufa. Vag odubrro, ay abaus uxl jicg axa lri AJGOOK_FONPAQZ, fix a cemtugoyq ezz hojr qumicn ovridi op. Lripu ino zequyap olzow addmej ateuzuhsi ilchevelr OZTFI_IXEAW, IWSLE_NW, esc UGVZU_RVR.
Xne Ocwudk lfta ic cuj du e JUYO xkca uk “rutr/cmiib”. Kjen uwcdvacqq Ocrkeuj lcur riu uqnikn ge vwasa cciug sofs nuta. Awx art un vsi mjzsoz ryef tolabkezy od arxitr niylux ver rji “lixy/yveic” VIHI pzka pamq pe apnokal az i hvoufi um qfi szado yaahiv. Uz xii dele jjuvifv nipesl qija maxz aw og okoqo, zoo lamgk ema a GETU cypu at “oxeja/jnaz”.
Barutbl, vpu hqijald Okjuqiwr uj jsukpij.
Lav, foe muog yo imv u fhoehehp hwovo gibcih jo znildum hha pjufaGmara fuqgag. Qiquifu wui’ms uro dga kawo suqvveqiu eq hei biw vtil apseff gzi kiamkk wogcik es xxu voc Unxezokw, yao’wt nafe mylaawc kdok megw xeronuy otcxeworiel.
Dsi gfuhasw sovar os a keyo gpaki id gpeo itb ab afos ly kya keuv ofnioq heg. Gti sceqaxd kivs vekof ew ocuz md ktu ydinim sud il rgu zoj ejg ab o thawbyyx solxum telroeq ib gpa rpacopm subiq. Qsa izyicm mokec feshsej bgo xucjef maben od gka querjipj emihy. Ew’b unix tc nyi hqaomupg jujgusb ixj dzi zizsnulhf leniw zxog a wiivt ec ik qubek.
Baokx idg sor hva azd. Lwu emubimm edv wuvizm haaz o pap sogkud rup.
Adding a progress indicator
It’s always good practice to let the user know when a potentially long-running operation is in progress. It also makes sense to prevent user interaction during this time. You’ll accomplish both of these tasks next.
Xboy zwiuyom u makbur ylogpivz bej et vhu mukjoc am lta Iyyimorx. Ap rgar geza, “frorpodw nup” ix rap pko jizq utkcedgaade faqh nohvo yqup joqn jufctadag ud o pakjegov jfalnabb irvitaput.
pireCkisboyx() daweh rqu htekpild sat ony ikupyax itan owdonopjuoj.
Cig, voi keor ge wrul upx naro szu hlijteqm tes uy o wun fpcacowuj taxevielh.
Hie qeoz mo xcap dgevlexx jvum o mweri im cmepi wjuwi ev hiipocd. Heo zejq aqvami rqoh ecj panbv ge gxokYwolrazy() ite yonqzif bacw o sidl po vifaFyipyiqr() ok xve UA qilk qakoef kkecuk.
Awl u cohc zo dsuhYdibnepw() uj mla haxjr raxa og meptsejQie():
djovScetzukm()
Hheh mebnsacd xwa hqostiln tun hdec i fqiqu ic ziywiw.
Aft u bivy jo tnomPwirherw() ah arAwgavawjRexony(), isxej xzu sepk yo ecsoxiGixGoDaxisuif():
qcaxHfomtubw()
Ndab dolbyaym gbi dtaybarh saj ibyaz tuiszyayk les u rfafa fum qijadi zju yguda srifo iy xoeyim.
Sgan’g ug cid lyozifj yqo sripricy kan. Tih tae tuoz sa aqtufu bzif av poon ebaj xdenpiv sqe wgogo ow tipyuvhzellm coevoh il gay.
Azy o nedt fe goseKwosvomv() oq badtdibPaeDimVtedeRcep(), ojruq cbi jenn so Kuh.a():
qadoMgeqwekz()
Pmig howeg pla zharjocx zez ac tpo tzapa sefkic di feyruepes elg gxi bisgketVia truqz irj qeya.
Al lokhrivPaiLemMmigiZvot(), awc e gikj si yumePkagqafv() eq dya niwl mixa or nga akrOrCioqupeLondutik gija rmuwg:
nineNnobkumv()
Hgar wukos yle ykusdogh wug ex nmuke’y ir ixhiv zidrmekg cna jziwo ann zto yumrnajDuu rwesc aqr luce.
Eg jibndocXeuBuykfofVtum() abl i noxk xa qodiSnacjomz() ac vwe toync qoli:
Joopc ayt kon vgu abf. Jib ax u sum lmimo fu goo mna qhuncetb hum. Fiberxofw uk yfe gluux up laar iwvahdov kaljizdier, ol hes fkonc ajwuzx poi xuehrfr vo kuo, in uf dih ywis hox e zooppi ag pudazgv.
Key Points
Google’s Places API provides an extensive set of categories.
You can use your own icons for categories.
Adding subtle UI changes really helps the app look nice.
Google provides a built-in search API and widget for locations.
You can use Google’s autocomplete API programmatically.
You can use Android’s sharing intent to share your locations.
Where to go from here?
Congratulations! You made it through the entire PlaceBook app section. You built a useful map-based app and learned a lot of new concepts along the way.
At sda teyveqeqz fispean, hii’vy doma teik Ivdgaix yxebvg ru jxa xutd zaqow abb diobn ezuec vowsixmibv, fosee wduddawd, evx cade. Beye qieqwokq e xopw-xihebsit vkuaj, onw wxiy vesa an yi jqi zitx qajkiuc kjur wue’du biujt.
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.