Skip to content

Feature/retrofit day img #15

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Closed
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 6 additions & 3 deletions starter/app/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -28,11 +28,11 @@ android {
dataBinding true
}
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
sourceCompatibility JavaVersion.VERSION_11
targetCompatibility JavaVersion.VERSION_11
}
kotlinOptions {
jvmTarget = JavaVersion.VERSION_1_8.toString()
jvmTarget = JavaVersion.VERSION_11.toString()
}
}

Expand All @@ -52,6 +52,9 @@ dependencies {
implementation "com.squareup.retrofit2:converter-moshi:$version_retrofit"
implementation "com.squareup.retrofit2:converter-scalars:$version_retrofit"

// Retrofit + OkHttp
implementation("com.squareup.okhttp3:logging-interceptor:3.5.0")

// Moshi
implementation "com.squareup.moshi:moshi:$version_moshi"
implementation "com.squareup.moshi:moshi-kotlin:$version_moshi"
Expand Down
16 changes: 11 additions & 5 deletions starter/app/src/main/java/com/udacity/asteroidradar/Asteroid.kt
Original file line number Diff line number Diff line change
@@ -1,10 +1,16 @@
package com.udacity.asteroidradar

import android.os.Parcelable
import kotlinx.android.parcel.Parcelize
import kotlinx.parcelize.Parcelize

@Parcelize
data class Asteroid(val id: Long, val codename: String, val closeApproachDate: String,
val absoluteMagnitude: Double, val estimatedDiameter: Double,
val relativeVelocity: Double, val distanceFromEarth: Double,
val isPotentiallyHazardous: Boolean) : Parcelable
data class Asteroid(
val id: Long,
val codename: String,
val closeApproachDate: String,
val absoluteMagnitude: Double,
val estimatedDiameter: Double,
val relativeVelocity: Double,
val distanceFromEarth: Double,
val isPotentiallyHazardous: Boolean
) : Parcelable
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,9 @@ package com.udacity.asteroidradar

import android.widget.ImageView
import android.widget.TextView
import androidx.core.net.toUri
import androidx.databinding.BindingAdapter
import com.bumptech.glide.Glide

@BindingAdapter("statusIcon")
fun bindAsteroidStatusImage(imageView: ImageView, isHazardous: Boolean) {
Expand Down Expand Up @@ -39,3 +41,15 @@ fun bindTextViewToDisplayVelocity(textView: TextView, number: Double) {
val context = textView.context
textView.text = String.format(context.getString(R.string.km_s_unit_format), number)
}

@BindingAdapter("asteroidPictureOfDay")
fun bindImage(imgView: ImageView, imgUrl: String?) {
imgUrl?.let {
val imgUri = imgUrl.toUri().buildUpon().scheme("https").build()
Glide.with(imgView.context)
.load(imgUri)
.into(imgView)
}
}


Original file line number Diff line number Diff line change
Expand Up @@ -2,5 +2,11 @@ package com.udacity.asteroidradar

import com.squareup.moshi.Json

data class PictureOfDay(@Json(name = "media_type") val mediaType: String, val title: String,
val url: String)
data class PictureOfDay(
@Json(name = "media_type")
val mediaType: String = "",
@Json(name = "title")
val title: String = "",
@Json(name = "url")
val url: String = ""
)
Original file line number Diff line number Diff line change
@@ -0,0 +1,63 @@
package com.udacity.asteroidradar.api

import android.graphics.Picture
import androidx.lifecycle.LiveData
import com.squareup.moshi.Moshi
import com.squareup.moshi.kotlin.reflect.KotlinJsonAdapterFactory
import com.udacity.asteroidradar.Constants.BASE_URL
import com.udacity.asteroidradar.PictureOfDay
import java.util.concurrent.TimeUnit
import okhttp3.OkHttpClient
import okhttp3.logging.HttpLoggingInterceptor
import retrofit2.Response
import retrofit2.Retrofit
import retrofit2.converter.moshi.MoshiConverterFactory
import retrofit2.http.GET
import retrofit2.http.Query

class NeoWsService {

val API_KEY = ""

private val interceptor = HttpLoggingInterceptor().setLevel(HttpLoggingInterceptor.Level.BODY)

private val moshi = Moshi.Builder()
.add(KotlinJsonAdapterFactory())
.build()

private val okHttp = OkHttpClient.Builder()
.callTimeout(10, TimeUnit.SECONDS)
.connectTimeout(10, TimeUnit.SECONDS)
.addNetworkInterceptor(interceptor)
.build()

private val moshiRetrofit = Retrofit.Builder()
//.addCallAdapterFactory(RxJava3CallAdapterFactory.create())
.addConverterFactory(MoshiConverterFactory.create(moshi))
.baseUrl(BASE_URL)
.client(okHttp)
.build()

private val neoWsApi : NeoWsApi by lazy {
moshiRetrofit.create(NeoWsApi::class.java)
}

suspend fun fetchPictureOfDay() : PictureOfDay? {
neoWsApi.fetchPictureOfDay(API_KEY).apply {
return if (isSuccessful) {
body()
} else { null }
}
}

interface NeoWsApi {

//https://api.nasa.gov/neo/rest/v1/feed
//
//https://api.nasa.gov/planetary/apod
@GET("/planetary/apod")
suspend fun fetchPictureOfDay(
@Query("api_key") apiKey : String
): Response<PictureOfDay>
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,35 +2,39 @@ package com.udacity.asteroidradar.main

import android.os.Bundle
import android.view.*
import androidx.core.view.MenuProvider
import androidx.fragment.app.Fragment
import androidx.lifecycle.Lifecycle
import androidx.lifecycle.ViewModelProvider
import com.udacity.asteroidradar.R
import com.udacity.asteroidradar.databinding.FragmentMainBinding

class MainFragment : Fragment() {
class MainFragment : Fragment(), MenuProvider {

private val viewModel: MainViewModel by lazy {
ViewModelProvider(this).get(MainViewModel::class.java)
}

override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?): View? {
val binding = FragmentMainBinding.inflate(inflater)
binding.lifecycleOwner = this

binding.viewModel = viewModel

setHasOptionsMenu(true)

return binding.root
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
requireActivity().addMenuProvider(this, this, Lifecycle.State.RESUMED)
}

override fun onCreateOptionsMenu(menu: Menu, inflater: MenuInflater) {
inflater.inflate(R.menu.main_overflow_menu, menu)
super.onCreateOptionsMenu(menu, inflater)
override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
savedInstanceState: Bundle?
) = FragmentMainBinding.inflate(inflater).apply {
lifecycleOwner = this@MainFragment
viewModel = this@MainFragment.viewModel
}.root

override fun onCreateMenu(menu: Menu, menuInflater: MenuInflater) {
menuInflater.inflate(R.menu.main_overflow_menu, menu)
}

override fun onOptionsItemSelected(item: MenuItem): Boolean {
override fun onMenuItemSelected(menuItem: MenuItem): Boolean {
println("*** on menu")
return true
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
package com.udacity.asteroidradar.main

import androidx.lifecycle.LiveData
import androidx.lifecycle.MutableLiveData
import com.udacity.asteroidradar.PictureOfDay
import com.udacity.asteroidradar.api.NeoWsService

class MainRepository {

private val _neoWsService = NeoWsService()
private val _pictureOfDay = MutableLiveData<PictureOfDay>()

val pictureOfDay : LiveData<PictureOfDay> = _pictureOfDay

suspend fun updateImageOfDay() {
_pictureOfDay.value = _neoWsService.fetchPictureOfDay()
}
}
Original file line number Diff line number Diff line change
@@ -1,6 +1,29 @@
package com.udacity.asteroidradar.main

import androidx.lifecycle.LiveData
import androidx.lifecycle.ViewModel
import androidx.lifecycle.viewModelScope
import com.udacity.asteroidradar.PictureOfDay
import kotlinx.coroutines.launch

class MainViewModel : ViewModel() {

private val repo = MainRepository()

init {
refreshPictureOfDay()
}

val pictureOfDay : LiveData<PictureOfDay> = repo.pictureOfDay

fun refreshPictureOfDay() {
viewModelScope.launch {
try {
repo.updateImageOfDay()
}
catch (e: Exception) {
e.printStackTrace()
}
}
}
}
1 change: 1 addition & 0 deletions starter/app/src/main/res/layout/fragment_main.xml
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,7 @@
android:layout_height="match_parent"
android:adjustViewBounds="true"
android:scaleType="centerCrop"
app:asteroidPictureOfDay="@{viewModel.pictureOfDay.url}"
app:srcCompat="@drawable/placeholder_picture_of_day"/>

<TextView
Expand Down