diff --git a/src/main/java/com/bluelinelabs/logansquare/ConverterUtils.java b/src/main/java/com/bluelinelabs/logansquare/ConverterUtils.java new file mode 100644 index 0000000..f8f7bba --- /dev/null +++ b/src/main/java/com/bluelinelabs/logansquare/ConverterUtils.java @@ -0,0 +1,22 @@ +package com.bluelinelabs.logansquare; + +import android.support.annotation.NonNull; + +import java.lang.reflect.Type; + +/** + * Utility class for the {@link ru.touchin.templates.logansquare.LoganSquareJsonFactory}. This resides in LoganSquare's + * main package in order to take advantage of the package-visible ConcreteParameterizedType class, which is essential + * to the support of generic classes in the Retrofit converter. + */ +public final class ConverterUtils { + + @NonNull + public static ParameterizedType parameterizedTypeOf(@NonNull final Type type) { + return new ParameterizedType.ConcreteParameterizedType(type); + } + + private ConverterUtils() { + } + +} diff --git a/src/main/java/ru/touchin/templates/calendar/CalendarAdapter.java b/src/main/java/ru/touchin/templates/calendar/CalendarAdapter.java index 66f1d76..358fcff 100644 --- a/src/main/java/ru/touchin/templates/calendar/CalendarAdapter.java +++ b/src/main/java/ru/touchin/templates/calendar/CalendarAdapter.java @@ -132,6 +132,16 @@ public abstract class CalendarAdapter getCalendarItems() { + return calendarItems; + } + + @NonNull + protected String getMonthsNameByHeaderCalendarItem(@NonNull final CalendarHeaderItem item) { + return monthsNames != null ? monthsNames[item.getMonth()] : String.valueOf(item.getMonth()); + } + @NonNull @Override public RecyclerView.ViewHolder onCreateViewHolder(@NonNull final ViewGroup parent, final int viewType) { diff --git a/src/main/java/ru/touchin/templates/logansquare/LoganSquareJsonFactory.java b/src/main/java/ru/touchin/templates/logansquare/LoganSquareJsonFactory.java index 8d47057..6411f83 100644 --- a/src/main/java/ru/touchin/templates/logansquare/LoganSquareJsonFactory.java +++ b/src/main/java/ru/touchin/templates/logansquare/LoganSquareJsonFactory.java @@ -21,13 +21,17 @@ package ru.touchin.templates.logansquare; import android.support.annotation.NonNull; +import com.bluelinelabs.logansquare.ConverterUtils; import com.bluelinelabs.logansquare.LoganSquare; import com.google.api.client.json.jackson2.JacksonFactory; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.lang.annotation.Annotation; +import java.lang.reflect.ParameterizedType; import java.lang.reflect.Type; +import java.util.List; +import java.util.Map; import okhttp3.RequestBody; import okhttp3.ResponseBody; @@ -73,7 +77,23 @@ public class LoganSquareJsonFactory extends Converter.Factory { @NonNull @Override protected T parseResponse(@NonNull final ResponseBody value) throws IOException { - return (T) LoganSquare.parse(value.byteStream(), (Class) type); + if (type instanceof ParameterizedType) { + final ParameterizedType parameterizedType = (ParameterizedType) type; + final Type[] typeArguments = parameterizedType.getActualTypeArguments(); + final Type firstType = typeArguments[0]; + + final Type rawType = parameterizedType.getRawType(); + if (rawType == Map.class) { + return (T) LoganSquare.parseMap(value.byteStream(), (Class) typeArguments[1]); + } else if (rawType == List.class) { + return (T) LoganSquare.parseList(value.byteStream(), (Class) firstType); + } else { + // Generics + return (T) LoganSquare.parse(value.byteStream(), ConverterUtils.parameterizedTypeOf(type)); + } + } else { + return (T) LoganSquare.parse(value.byteStream(), (Class) type); + } } } diff --git a/src/main/java/ru/touchin/templates/retrofit/JsonResponseBodyConverter.java b/src/main/java/ru/touchin/templates/retrofit/JsonResponseBodyConverter.java index a847926..f82f2d0 100644 --- a/src/main/java/ru/touchin/templates/retrofit/JsonResponseBodyConverter.java +++ b/src/main/java/ru/touchin/templates/retrofit/JsonResponseBodyConverter.java @@ -57,6 +57,8 @@ public abstract class JsonResponseBodyConverter implements Converter