/* Ċ Ġ* ĠCopyright Ġ( C ) Ġ 2 0 1 6 ĠThe ĠAndroid ĠOpen ĠSource ĠProject Ċ Ġ* Ċ Ġ* ĠLicensed Ġunder Ġthe ĠApache ĠLicense , ĠVersion Ġ 2 . 0 Ġ( the Ġ" License "); Ċ Ġ* Ġyou Ġmay Ġnot Ġuse Ġthis Ġfile Ġexcept Ġin Ġcompliance Ġwith Ġthe ĠLicense . Ċ Ġ* ĠYou Ġmay Ġobtain Ġa Ġcopy Ġof Ġthe ĠLicense Ġat Ċ Ġ* Ċ Ġ* ĠĠĠĠĠ Ġhttp :// www . apache . org / licenses / LICENSE - 2 . 0 Ċ Ġ* Ċ Ġ* ĠUnless Ġrequired Ġby Ġapplicable Ġlaw Ġor Ġagreed Ġto Ġin Ġwriting , Ġsoftware Ċ Ġ* Ġdistributed Ġunder Ġthe ĠLicense Ġis Ġdistributed Ġon Ġan Ġ" AS ĠIS " ĠBASIS , Ċ Ġ* ĠWITHOUT ĠWARRANTIES ĠOR ĠCONDITIONS ĠOF ĠANY ĠKIND , Ġeither Ġexpress Ġor Ġimplied . Ċ Ġ* ĠSee Ġthe ĠLicense Ġfor Ġthe Ġspecific Ġlanguage Ġgoverning Ġpermissions Ġand Ċ Ġ* Ġlimitations Ġunder Ġthe ĠLicense . Ċ Ġ*/ Ċ package Ġcom . example . android . sun sh ine . utilities Ċ Ċ import Ġandroid . content . Context Ċ import Ġandroid . net . Uri Ċ import Ġandroid . util . Log Ċ import Ġcom . example . android . sun sh ine . R Ċ import Ġcom . example . android . sun sh ine . data . Sun sh ine Preferences Ċ Ċ import Ġjava . io . IOException Ċ import Ġjava . io . InputStream Ċ import Ġjava . net . Http URLConnection Ċ import Ġjava . net . Malformed URLException Ċ import Ġjava . net . URL Ċ import Ġjava . util . Scanner Ċ Ċ /** Ċ Ġ* ĠThese Ġutilities Ġwill Ġbe Ġused Ġto Ġcommunicate Ġwith Ġthe Ġweather Ġservers . Ċ Ġ*/ Ċ object ĠNetwork Utils Ġ{ ĊĊĠĠĠ Ġprivate Ġval ĠTAG Ġ= ĠNetwork Utils . java Class . simple Name ĊĊĠĠĠ Ġprivate Ġval ĠD Y NAMIC _ WE ATHER _ URL Ġ= Ġ" https :// api . open weather map . org / data / 2 . 5 / forecast " Ċ Ċ // ĠĠĠ Ġprivate Ġval ĠSTATIC _ WE ATHER _ URL Ġ= Ġ" https :// and fun - weather . ud acity . com / static weather " ĊĊĠĠĠ Ġprivate Ġval ĠFORE CAST _ BASE _ URL Ġ= ĠD Y NAMIC _ WE ATHER _ URL ĊĊĠĠĠ Ġ/* ĊĠĠĠĠ Ġ* ĠNOTE : ĠThese Ġvalues Ġonly Ġaffect Ġresponses Ġfrom ĠOpen Weather Map , ĠNOT Ġfrom Ġthe Ġfake Ġweather ĊĠĠĠĠ Ġ* Ġserver . ĠThey Ġare Ġsimply Ġhere Ġto Ġallow Ġus Ġto Ġte ach Ġyou Ġhow Ġto Ġbuild Ġa ĠURL Ġif Ġyou Ġwere Ġto Ġuse ĊĠĠĠĠ Ġ* Ġa Ġreal ĠAPI . If Ġyou Ġwant Ġto Ġconnect Ġyour Ġapp Ġto ĠOpen Weather Map 's ĠAPI , Ġfeel Ġfree Ġto ! ĠHowever , ĊĠĠĠĠ Ġ* Ġwe Ġare Ġnot Ġgoing Ġto Ġshow Ġyou Ġhow Ġto Ġdo Ġso Ġin Ġthis Ġcourse . ĊĠĠĠĠ Ġ*/ ĊĊĠĠĠ Ġ/* ĠThe Ġformat Ġwe Ġwant Ġour ĠAPI Ġto Ġreturn Ġ*/ ĊĠĠĠ Ġprivate Ġval Ġformat Ġ= Ġ" json " ĊĠĠĠ Ġ/* ĠThe Ġunits Ġwe Ġwant Ġour ĠAPI Ġto Ġreturn Ġ*/ ĊĠĠĠ Ġprivate Ġval Ġunits Ġ= Ġ" metric " ĊĠĠĠ Ġ/* ĠThe Ġnumber Ġof Ġdays Ġwe Ġwant Ġour ĠAPI Ġto Ġreturn Ġ*/ ĊĠĠĠ Ġprivate Ġval Ġnum Days Ġ= Ġ 1 4 ĊĊĠĠĠ Ġinternal Ġval ĠQUERY _ PARAM Ġ= Ġ" q " ĊĠĠĠ Ġinternal Ġval ĠLAT _ PARAM Ġ= Ġ" lat " ĊĠĠĠ Ġinternal Ġval ĠL ON _ PARAM Ġ= Ġ" lon " ĊĠĠĠ Ġinternal Ġval ĠFORMAT _ PARAM Ġ= Ġ" mode " ĊĠĠĠ Ġinternal Ġval ĠUN ITS _ PARAM Ġ= Ġ" units " ĊĠĠĠ Ġinternal Ġval ĠDAY S _ PARAM Ġ= Ġ" cnt " ĊĠĠĠ Ġinternal Ġval ĠKEY _ PARAM Ġ= Ġ" APP ID " ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠRetrieves Ġthe Ġproper ĠURL Ġto Ġquery Ġfor Ġthe Ġweather Ġdata . ĠThe Ġreason Ġfor Ġboth Ġthis Ġmethod Ġas ĊĠĠĠĠ Ġ* Ġwell Ġas Ġ[. build Url With Location Query ] Ġis Ġtwo Ġfold . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ 1 ) ĠYou Ġshould Ġbe Ġable Ġto Ġjust Ġuse Ġone Ġmethod Ġwhen Ġyou Ġneed Ġto Ġcreate Ġthe ĠURL Ġwithin Ġthe ĊĠĠĠĠ Ġ* Ġapp Ġinstead Ġof Ġcalling Ġboth Ġmethods . ĊĠĠĠĠ Ġ* Ġ 2 ) ĠL ater Ġin ĠSun sh ine , Ġyou Ġare Ġgoing Ġto Ġadd Ġan Ġalternate Ġmethod Ġof Ġallowing Ġthe Ġuser ĊĠĠĠĠ Ġ* Ġto Ġselect Ġtheir Ġpreferred Ġlocation . ĠOnce Ġyou Ġdo Ġso , Ġthere Ġwill Ġbe Ġanother Ġway Ġto Ġform ĊĠĠĠĠ Ġ* Ġthe ĠURL Ġusing Ġa Ġlatitude Ġand Ġlongitude Ġrather Ġthan Ġjust Ġa Ġlocation ĠString . ĠThis Ġmethod ĊĠĠĠĠ Ġ* Ġwill Ġ" dec ide " Ġwhich ĠURL Ġto Ġbuild Ġand Ġreturn Ġit . ĊĊĠĠĠĠ Ġ* Ġ@ param Ġcontext Ġused Ġto Ġaccess Ġother ĠUtility Ġmethods ĊĠĠĠĠ Ġ* Ġ* ĊĠĠĠĠ Ġ* Ġ@ return ĠURL Ġto Ġquery Ġweather Ġservice ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġbuild Url ( context : ĠContext ): ĠURL Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( Sun sh ine Preferences . is Location Lat Lon Available ( context )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpreferred Coordinates Ġ= ĠSun sh ine Preferences . getLocation Coordinates ( context ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlatitude Ġ= Ġpreferred Coordinates [ 0 ] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlongitude Ġ= Ġpreferred Coordinates [ 1 ] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġbuild Url With Latitude Longitude ( context , Ġlatitude , Ġlongitude ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlocation Query Ġ= ĠSun sh ine Preferences . get Preferred Weather Location ( context ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġbuild Url With Location Query ( context , Ġlocation Query ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠBuilds Ġthe ĠURL Ġused Ġto Ġtalk Ġto Ġthe Ġweather Ġserver Ġusing Ġlatitude Ġand Ġlongitude Ġof Ġa ĊĠĠĠĠ Ġ* Ġlocation . ĊĊĠĠĠĠ Ġ* Ġ@ param Ġlatitude Ġ ĠThe Ġlatitude Ġof Ġthe Ġlocation ĊĠĠĠĠ Ġ* Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġlongitude ĠThe Ġlongitude Ġof Ġthe Ġlocation ĊĠĠĠĠ Ġ* Ġ* ĊĠĠĠĠ Ġ* Ġ@ return ĠThe ĠUrl Ġto Ġuse Ġto Ġquery Ġthe Ġweather Ġserver . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġbuild Url With Latitude Longitude ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcontext : ĠContext , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlatitude : ĠDouble , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlongitude : ĠDouble ĊĠĠĠ Ġ): ĠURL Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġweather Query Uri Ġ= ĠUri . parse ( FORE CAST _ BASE _ URL ). build Up on () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. append QueryParameter ( LAT _ PARAM , Ġlatitude . toString ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. append QueryParameter ( LON _ PARAM , Ġlongitude . toString ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. append QueryParameter ( FORMAT _ PARAM , Ġformat ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. append QueryParameter ( UNITS _ PARAM , Ġunits ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. append QueryParameter ( DAYS _ PARAM , ĠInteger . toString ( num Days )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. append QueryParameter ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠKEY _ PARAM , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontext . getString ( R . string . owm _ key ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĊĠĠĠĠĠĠĠ Ġval Ġweather Query Url Ġ= ĠURL ( weather Query Uri . toString ()) ĊĠĠĠĠĠĠĠ ĠLog . v ( TAG , Ġ" URL : Ġ" Ġ+ Ġweather Query Url ) ĊĠĠĠĠĠĠĠ Ġreturn Ġweather Query Url ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠBuilds Ġthe ĠURL Ġused Ġto Ġtalk Ġto Ġthe Ġweather Ġserver Ġusing Ġa Ġlocation . ĠThis Ġlocation Ġis Ġbased ĊĠĠĠĠ Ġ* Ġon Ġthe Ġquery Ġcapabilities Ġof Ġthe Ġweather Ġprovider Ġthat Ġwe Ġare Ġusing . ĊĊĠĠĠĠ Ġ* Ġ@ param Ġlocation Query ĠThe Ġlocation Ġthat Ġwill Ġbe Ġqueried Ġfor . ĊĠĠĠĠ Ġ* Ġ* ĊĠĠĠĠ Ġ* Ġ@ return ĠThe ĠURL Ġto Ġuse Ġto Ġquery Ġthe Ġweather Ġserver . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġbuild Url With Location Query ( context : ĠContext , Ġlocation Query : ĠString ): ĠURL Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġweather Query Uri Ġ= ĠUri . parse ( FORE CAST _ BASE _ URL ). build Up on () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. append QueryParameter ( QUERY _ PARAM , Ġlocation Query ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. append QueryParameter ( FORMAT _ PARAM , Ġformat ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. append QueryParameter ( UNITS _ PARAM , Ġunits ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. append QueryParameter ( DAYS _ PARAM , ĠInteger . toString ( num Days )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. append QueryParameter ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠKEY _ PARAM , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontext . getString ( R . string . owm _ key ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĊĠĠĠĠĠĠĠ Ġval Ġweather Query Url Ġ= ĠURL ( weather Query Uri . toString ()) ĊĠĠĠĠĠĠĠ ĠLog . v ( TAG , Ġ" URL : Ġ" Ġ+ Ġweather Query Url ) ĊĠĠĠĠĠĠĠ Ġreturn Ġweather Query Url ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠThis Ġmethod Ġreturns Ġthe Ġentire Ġresult Ġfrom Ġthe ĠHTTP Ġresponse . ĊĊĠĠĠĠ Ġ* Ġ@ param Ġurl ĠThe ĠURL Ġto Ġfetch Ġthe ĠHTTP Ġresponse Ġfrom . ĊĠĠĠĠ Ġ* Ġ* ĊĠĠĠĠ Ġ* Ġ@ return ĠThe Ġcontents Ġof Ġthe ĠHTTP Ġresponse . ĊĠĠĠĠ Ġ* Ġ* ĊĠĠĠĠ Ġ* Ġ@ throws ĠIOException ĠRelated Ġto Ġnetwork Ġand Ġstream Ġreading ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġ@ Throws ( IOException :: class ) ĊĠĠĠ Ġfun Ġget Response From Http Url ( url : ĠURL ): ĠString ? Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġurl Connection Ġ= Ġurl . open Connection () Ġas ĠHttp URLConnection ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġ` in ` Ġ= Ġurl Connection . inputStream ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġscanner Ġ= ĠScanner (` in `) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġscanner . use Delimiter ("\\ A ") ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġhas Input Ġ= Ġscanner . hasNext () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( has Input ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġscanner . next () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġfinally Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġurl Connection . disconnect () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ }