diff --git a/app/src/main/java/com/d4rk/androidtutorials/java/ui/screens/android/lessons/networking/retrofit/RetrofitActivity.java b/app/src/main/java/com/d4rk/androidtutorials/java/ui/screens/android/lessons/networking/retrofit/RetrofitActivity.java index bff6023f..0d61b269 100644 --- a/app/src/main/java/com/d4rk/androidtutorials/java/ui/screens/android/lessons/networking/retrofit/RetrofitActivity.java +++ b/app/src/main/java/com/d4rk/androidtutorials/java/ui/screens/android/lessons/networking/retrofit/RetrofitActivity.java @@ -5,6 +5,7 @@ import android.os.Handler; import android.os.Looper; +import androidx.annotation.Keep; import androidx.annotation.NonNull; import androidx.annotation.Nullable; @@ -12,6 +13,9 @@ import com.d4rk.androidtutorials.java.databinding.ActivityRetrofitBinding; import com.d4rk.androidtutorials.java.ui.components.navigation.UpNavigationActivity; import com.d4rk.androidtutorials.java.utils.EdgeToEdgeDelegate; +import com.google.gson.annotations.SerializedName; + +import java.util.Map; import retrofit2.Call; import retrofit2.Callback; @@ -47,17 +51,17 @@ protected void onCreate(@Nullable Bundle savedInstanceState) { api.getTodo().enqueue(new Callback<>() { @Override public void onResponse(@NonNull Call call, @NonNull Response response) { - if (response.isSuccessful() && response.body() != null) { - binding.textViewResult.setText(response.body().title); + if (response.isSuccessful()) { + displayTodoTitle(response); } else { - binding.textViewResult.setText(R.string.snack_general_error); + showGeneralErrorMessage(); } binding.buttonFetch.setEnabled(true); } @Override public void onFailure(@NonNull Call call, @NonNull Throwable t) { - binding.textViewResult.setText(R.string.snack_general_error); + showGeneralErrorMessage(); binding.buttonFetch.setEnabled(true); } }); @@ -74,12 +78,37 @@ protected void onDestroy() { handler.removeCallbacksAndMessages(null); } + private void displayTodoTitle(@NonNull Response response) { + Object body = response.body(); + if (body instanceof Todo) { + Todo todo = (Todo) body; + if (todo.title != null && !todo.title.isEmpty()) { + binding.textViewResult.setText(todo.title); + return; + } + } else if (body instanceof Map map) { + Object title = map.get("title"); + if (title != null) { + binding.textViewResult.setText(String.valueOf(title)); + return; + } + } + showGeneralErrorMessage(); + } + + private void showGeneralErrorMessage() { + binding.textViewResult.setText(R.string.snack_general_error); + } + interface JsonPlaceholderApi { @GET("todos/1") Call getTodo(); } - static class Todo { + @Keep + public static final class Todo { + @SerializedName("title") + @Nullable public String title; } } diff --git a/app/src/main/res/raw/text_retrofit_java.txt b/app/src/main/res/raw/text_retrofit_java.txt index 55488755..d1eecc17 100644 --- a/app/src/main/res/raw/text_retrofit_java.txt +++ b/app/src/main/res/raw/text_retrofit_java.txt @@ -5,13 +5,17 @@ import android.os.Bundle; import android.os.Handler; import android.os.Looper; +import androidx.annotation.Keep; +import androidx.annotation.NonNull; import androidx.annotation.Nullable; +import com.d4rk.androidtutorials.java.R; import com.d4rk.androidtutorials.java.databinding.ActivityRetrofitBinding; import com.d4rk.androidtutorials.java.ui.components.navigation.UpNavigationActivity; import com.d4rk.androidtutorials.java.utils.EdgeToEdgeDelegate; +import com.google.gson.annotations.SerializedName; -import com.d4rk.androidtutorials.java.R; +import java.util.Map; import retrofit2.Call; import retrofit2.Callback; @@ -21,19 +25,10 @@ import retrofit2.converter.gson.GsonConverterFactory; import retrofit2.http.GET; public class RetrofitActivity extends UpNavigationActivity { - private ActivityRetrofitBinding binding; private final Handler handler = new Handler(Looper.getMainLooper()); + private ActivityRetrofitBinding binding; private JsonPlaceholderApi api; - interface JsonPlaceholderApi { - @GET("todos/1") - Call getTodo(); - } - - static class Todo { - public String title; - } - @Override protected void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); @@ -50,20 +45,20 @@ public class RetrofitActivity extends UpNavigationActivity { binding.buttonFetch.setOnClickListener(v -> { binding.buttonFetch.setEnabled(false); - api.getTodo().enqueue(new Callback() { + api.getTodo().enqueue(new Callback<>() { @Override - public void onResponse(Call call, Response response) { - if (response.isSuccessful() && response.body() != null) { - binding.textViewResult.setText(response.body().title); + public void onResponse(@NonNull Call call, @NonNull Response response) { + if (response.isSuccessful()) { + displayTodoTitle(response); } else { - binding.textViewResult.setText(R.string.snack_general_error); + showGeneralErrorMessage(); } binding.buttonFetch.setEnabled(true); } @Override - public void onFailure(Call call, Throwable t) { - binding.textViewResult.setText(R.string.snack_general_error); + public void onFailure(@NonNull Call call, @NonNull Throwable t) { + showGeneralErrorMessage(); binding.buttonFetch.setEnabled(true); } }); @@ -79,4 +74,38 @@ public class RetrofitActivity extends UpNavigationActivity { super.onDestroy(); handler.removeCallbacksAndMessages(null); } + + private void displayTodoTitle(@NonNull Response response) { + Object body = response.body(); + if (body instanceof Todo) { + Todo todo = (Todo) body; + if (todo.title != null && !todo.title.isEmpty()) { + binding.textViewResult.setText(todo.title); + return; + } + } else if (body instanceof Map map) { + Object title = map.get("title"); + if (title != null) { + binding.textViewResult.setText(String.valueOf(title)); + return; + } + } + showGeneralErrorMessage(); + } + + private void showGeneralErrorMessage() { + binding.textViewResult.setText(R.string.snack_general_error); + } + + interface JsonPlaceholderApi { + @GET("todos/1") + Call getTodo(); + } + + @Keep + public static final class Todo { + @SerializedName("title") + @Nullable + public String title; + } }