From a3c8aa10c27767c8880d6f1309123499143dd24e Mon Sep 17 00:00:00 2001 From: Pluu Date: Fri, 17 Feb 2017 03:21:13 +0900 Subject: [PATCH 1/3] Fixed Local Time - https://github.com/DroidKaigi/conference-app-2017/issues/198 ## Desc - Add, ThreeTenABP - Add, Gson Custom TypeAdapter (ZonedDateTimeSerializer, ZonedDateTimeDeserializer) - Change Data type Date -> ZonedDateTime (Session stime/etime) --- app/build.gradle | 1 + .../confsched2017/MainApplication.java | 2 ++ .../confsched2017/di/AppModule.java | 10 +++++- .../confsched2017/model/Session.java | 12 +++---- .../confsched2017/util/AlarmUtil.java | 9 ++--- .../confsched2017/util/DateUtil.java | 32 ++++++++++-------- .../util/DroidKaigiTypeAdapters.java | 33 +++++++++++++++++++ .../confsched2017/util/LocaleUtil.java | 23 +++++-------- .../util/ZonedDateTimeDeserializer.java | 18 ++++++++++ .../util/ZonedDateTimeSerializer.java | 17 ++++++++++ .../view/fragment/SessionsFragment.java | 4 +-- .../viewmodel/MySessionViewModel.java | 8 ++--- .../viewmodel/SessionDetailViewModel.java | 9 ++--- .../viewmodel/SessionViewModel.java | 15 +++++---- .../viewmodel/SessionsViewModel.java | 13 ++++---- 15 files changed, 145 insertions(+), 61 deletions(-) create mode 100644 app/src/main/java/io/github/droidkaigi/confsched2017/util/DroidKaigiTypeAdapters.java create mode 100644 app/src/main/java/io/github/droidkaigi/confsched2017/util/ZonedDateTimeDeserializer.java create mode 100644 app/src/main/java/io/github/droidkaigi/confsched2017/util/ZonedDateTimeSerializer.java diff --git a/app/build.gradle b/app/build.gradle index 39547c17..30e6a81e 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -206,6 +206,7 @@ dependencies { // Android Utility compile 'com.deploygate:sdk:3.1.1' compile 'com.jakewharton.timber:timber:4.5.1' + compile 'com.jakewharton.threetenabp:threetenabp:1.0.5' debugCompile 'com.facebook.stetho:stetho:1.4.2' debugCompile 'com.facebook.stetho:stetho-okhttp3:1.4.2' debugCompile 'com.facebook.stetho:stetho-timber:1.4.2@aar' diff --git a/app/src/main/java/io/github/droidkaigi/confsched2017/MainApplication.java b/app/src/main/java/io/github/droidkaigi/confsched2017/MainApplication.java index 0876932a..dab93209 100644 --- a/app/src/main/java/io/github/droidkaigi/confsched2017/MainApplication.java +++ b/app/src/main/java/io/github/droidkaigi/confsched2017/MainApplication.java @@ -1,6 +1,7 @@ package io.github.droidkaigi.confsched2017; import com.deploygate.sdk.DeployGate; +import com.jakewharton.threetenabp.AndroidThreeTen; import com.squareup.leakcanary.LeakCanary; import com.tomoima.debot.DebotConfigurator; import com.tomoima.debot.DebotStrategyBuilder; @@ -56,6 +57,7 @@ public AppComponent getComponent() { @Override public void onCreate() { super.onCreate(); + AndroidThreeTen.init(this); appComponent = DaggerAppComponent.builder() .appModule(new AppModule(this)) diff --git a/app/src/main/java/io/github/droidkaigi/confsched2017/di/AppModule.java b/app/src/main/java/io/github/droidkaigi/confsched2017/di/AppModule.java index 8b3b8c49..fa9f9b22 100644 --- a/app/src/main/java/io/github/droidkaigi/confsched2017/di/AppModule.java +++ b/app/src/main/java/io/github/droidkaigi/confsched2017/di/AppModule.java @@ -5,6 +5,8 @@ import com.jakewharton.retrofit2.adapter.rxjava2.RxJava2CallAdapterFactory; +import org.threeten.bp.ZonedDateTime; + import android.app.Application; import android.content.Context; import android.content.SharedPreferences; @@ -19,6 +21,8 @@ import io.github.droidkaigi.confsched2017.api.service.GoogleFormService; import io.github.droidkaigi.confsched2017.model.OrmaDatabase; import io.github.droidkaigi.confsched2017.pref.DefaultPrefs; +import io.github.droidkaigi.confsched2017.util.ZonedDateTimeDeserializer; +import io.github.droidkaigi.confsched2017.util.ZonedDateTimeSerializer; import io.reactivex.disposables.CompositeDisposable; import okhttp3.Interceptor; import okhttp3.OkHttpClient; @@ -105,6 +109,10 @@ public GoogleFormService provideGoogleFormService(OkHttpClient client) { } private static Gson createGson() { - return new GsonBuilder().setDateFormat("yyyy/MM/dd HH:mm:ss").create(); + return new GsonBuilder() + .setDateFormat("yyyy/MM/dd HH:mm:ss") + .registerTypeAdapter(ZonedDateTime.class, new ZonedDateTimeSerializer()) + .registerTypeAdapter(ZonedDateTime.class, new ZonedDateTimeDeserializer()) + .create(); } } diff --git a/app/src/main/java/io/github/droidkaigi/confsched2017/model/Session.java b/app/src/main/java/io/github/droidkaigi/confsched2017/model/Session.java index 1a6fa4a7..56a2c424 100644 --- a/app/src/main/java/io/github/droidkaigi/confsched2017/model/Session.java +++ b/app/src/main/java/io/github/droidkaigi/confsched2017/model/Session.java @@ -6,9 +6,9 @@ import com.github.gfx.android.orma.annotation.PrimaryKey; import com.github.gfx.android.orma.annotation.Table; -import android.support.annotation.Nullable; +import org.threeten.bp.ZonedDateTime; -import java.util.Date; +import android.support.annotation.Nullable; @Table public class Session { @@ -34,11 +34,11 @@ public class Session { @Column @SerializedName("stime") - public Date stime; + public ZonedDateTime stime; @Column @SerializedName("etime") - public Date etime; + public ZonedDateTime etime; @Column @SerializedName("duration_min") @@ -107,8 +107,8 @@ public boolean isDinner() { return Type.DINNER.matches(type); } - public boolean isLiveAt(Date when) { - return stime.before(when) && etime.after(when); + public boolean isLiveAt(ZonedDateTime when) { + return stime.isBefore(when)&& etime.isAfter(when); } @Override diff --git a/app/src/main/java/io/github/droidkaigi/confsched2017/util/AlarmUtil.java b/app/src/main/java/io/github/droidkaigi/confsched2017/util/AlarmUtil.java index 527e1893..808248a1 100644 --- a/app/src/main/java/io/github/droidkaigi/confsched2017/util/AlarmUtil.java +++ b/app/src/main/java/io/github/droidkaigi/confsched2017/util/AlarmUtil.java @@ -1,5 +1,7 @@ package io.github.droidkaigi.confsched2017.util; +import org.threeten.bp.ZonedDateTime; + import android.app.AlarmManager; import android.app.PendingIntent; import android.content.Context; @@ -7,7 +9,6 @@ import android.os.Build; import android.support.annotation.NonNull; -import java.util.Date; import java.util.concurrent.TimeUnit; import io.github.droidkaigi.confsched2017.R; @@ -20,7 +21,7 @@ public class AlarmUtil { private static final long REMIND_DURATION_MINUTES_FOR_START = TimeUnit.MINUTES.toMillis(10); public static void registerAlarm(@NonNull Context context, @NonNull Session session) { - long time = session.stime.getTime() - REMIND_DURATION_MINUTES_FOR_START; + long time = session.stime.toInstant().toEpochMilli() - REMIND_DURATION_MINUTES_FOR_START; DefaultPrefs prefs = DefaultPrefs.get(context); if (prefs.getNotificationTestFlag()) { @@ -44,8 +45,8 @@ public static void unregisterAlarm(@NonNull Context context, @NonNull Session se private static PendingIntent createAlarmIntent(@NonNull Context context, @NonNull Session session) { String title = context.getString(R.string.notification_title, session.title); - Date displaySTime = LocaleUtil.getDisplayDate(session.stime, context); - Date displayETime = LocaleUtil.getDisplayDate(session.etime, context); + ZonedDateTime displaySTime = LocaleUtil.getDisplayDate(session.stime, context); + ZonedDateTime displayETime = LocaleUtil.getDisplayDate(session.etime, context); String room = ""; if (session.room != null) { room = session.room.name; diff --git a/app/src/main/java/io/github/droidkaigi/confsched2017/util/DateUtil.java b/app/src/main/java/io/github/droidkaigi/confsched2017/util/DateUtil.java index e5c86e6d..6d5145d4 100644 --- a/app/src/main/java/io/github/droidkaigi/confsched2017/util/DateUtil.java +++ b/app/src/main/java/io/github/droidkaigi/confsched2017/util/DateUtil.java @@ -1,5 +1,9 @@ package io.github.droidkaigi.confsched2017.util; +import org.threeten.bp.DateTimeUtils; +import org.threeten.bp.ZonedDateTime; +import org.threeten.bp.temporal.ChronoUnit; + import android.content.Context; import android.os.Build; import android.support.annotation.NonNull; @@ -11,7 +15,6 @@ import java.util.Date; import java.util.Locale; import java.util.TimeZone; -import java.util.concurrent.TimeUnit; public class DateUtil { @@ -28,7 +31,13 @@ private DateUtil() { } @NonNull - public static String getMonthDate(Date date, Context context) { + private static Date convertZoneDateTime(ZonedDateTime date) { + return DateTimeUtils.toDate(date.toInstant()); + } + + @NonNull + public static String getMonthDate(ZonedDateTime zonedDateTime, Context context) { + Date date = convertZoneDateTime(zonedDateTime); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR2) { String pattern = DateFormat.getBestDateTimePattern(Locale.getDefault(), FORMAT_MMDD); return new SimpleDateFormat(pattern, Locale.getDefault()).format(date); @@ -39,7 +48,8 @@ public static String getMonthDate(Date date, Context context) { } @NonNull - public static String getHourMinute(Date date) { + public static String getHourMinute(ZonedDateTime zonedDateTime) { + Date date = convertZoneDateTime(zonedDateTime); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR2) { String pattern = DateFormat.getBestDateTimePattern(Locale.getDefault(), FORMAT_KKMM); return new SimpleDateFormat(pattern, Locale.getDefault()).format(date); @@ -49,11 +59,11 @@ public static String getHourMinute(Date date) { } @NonNull - public static String getLongFormatDate(@Nullable Date date) { - if (date == null) { + public static String getLongFormatDate(@Nullable ZonedDateTime zonedDateTime) { + if (zonedDateTime == null) { return ""; } - + Date date = convertZoneDateTime(zonedDateTime); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR2) { String pattern = DateFormat.getBestDateTimePattern(Locale.getDefault(), FORMAT_YYYYMMDDKKMM); return new SimpleDateFormat(pattern, Locale.getDefault()).format(date); @@ -68,13 +78,7 @@ public static String getLongFormatDate(@Nullable Date date) { } } - public static int getMinutes(Date stime, Date etime) { - long range = etime.getTime() - stime.getTime(); - - if (range > 0) { - return (int) (range / TimeUnit.MINUTES.toMillis(1L)); - } else { - return 0; - } + public static int getMinutes(ZonedDateTime stime, ZonedDateTime etime) { + return (int) ChronoUnit.MINUTES.between(stime, etime); } } diff --git a/app/src/main/java/io/github/droidkaigi/confsched2017/util/DroidKaigiTypeAdapters.java b/app/src/main/java/io/github/droidkaigi/confsched2017/util/DroidKaigiTypeAdapters.java new file mode 100644 index 00000000..8d9d9055 --- /dev/null +++ b/app/src/main/java/io/github/droidkaigi/confsched2017/util/DroidKaigiTypeAdapters.java @@ -0,0 +1,33 @@ +package io.github.droidkaigi.confsched2017.util; + +import com.github.gfx.android.orma.annotation.StaticTypeAdapter; +import com.github.gfx.android.orma.annotation.StaticTypeAdapters; + +import org.threeten.bp.LocalDateTime; +import org.threeten.bp.ZoneId; +import org.threeten.bp.ZonedDateTime; +import org.threeten.bp.format.DateTimeFormatter; + +import io.github.droidkaigi.confsched2017.BuildConfig; + +@StaticTypeAdapters({ + @StaticTypeAdapter( + targetType = ZonedDateTime.class, + serializedType = String.class, + serializer = "serializeZonedDateTime", + deserializer = "deserializeZonedDateTime" + ) +}) +public class DroidKaigiTypeAdapters { + + private static final ZoneId CONFERENCE_TIMEZONE = ZoneId.of(BuildConfig.CONFERENCE_TIMEZONE); + public static final DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy/MM/dd HH:mm:ss"); + + public static String serializeZonedDateTime(ZonedDateTime time) { + return time.format(formatter); + } + + public static ZonedDateTime deserializeZonedDateTime(String serialized) { + return LocalDateTime.parse(serialized, formatter).atZone(CONFERENCE_TIMEZONE); + } +} diff --git a/app/src/main/java/io/github/droidkaigi/confsched2017/util/LocaleUtil.java b/app/src/main/java/io/github/droidkaigi/confsched2017/util/LocaleUtil.java index 7e650b5c..88ca1aa7 100644 --- a/app/src/main/java/io/github/droidkaigi/confsched2017/util/LocaleUtil.java +++ b/app/src/main/java/io/github/droidkaigi/confsched2017/util/LocaleUtil.java @@ -1,5 +1,8 @@ package io.github.droidkaigi.confsched2017.util; +import org.threeten.bp.ZoneId; +import org.threeten.bp.ZonedDateTime; + import android.content.Context; import android.content.res.Configuration; import android.os.Build; @@ -7,11 +10,7 @@ import android.support.annotation.StringRes; import android.text.TextUtils; -import java.text.DateFormat; -import java.text.ParseException; -import java.text.SimpleDateFormat; import java.util.Arrays; -import java.util.Date; import java.util.List; import java.util.Locale; import java.util.TimeZone; @@ -105,17 +104,11 @@ public static int getLanguage(@NonNull String languageId) { } } - public static Date getDisplayDate(@NonNull Date date, Context context) { - DateFormat formatTokyo = SimpleDateFormat.getDateTimeInstance(); - formatTokyo.setTimeZone(CONFERENCE_TIMEZONE); - DateFormat formatLocal = SimpleDateFormat.getDateTimeInstance(); - formatLocal.setTimeZone(getDisplayTimeZone(context)); - try { - return formatLocal.parse(formatTokyo.format(date)); - } catch (ParseException e) { - Timber.tag(TAG).e(e, "date: %s can not parse.", date.toString()); - return date; + public static ZonedDateTime getDisplayDate(@NonNull ZonedDateTime date, Context context) { + if (DefaultPrefs.get(context).getShowLocalTimeFlag()) { + return date.withZoneSameInstant(ZoneId.systemDefault()); } + return date; } public static TimeZone getDisplayTimeZone(Context context) { @@ -123,4 +116,6 @@ public static TimeZone getDisplayTimeZone(Context context) { boolean shouldShowLocalTime = DefaultPrefs.get(context).getShowLocalTimeFlag(); return (shouldShowLocalTime && defaultTimeZone != null) ? defaultTimeZone : CONFERENCE_TIMEZONE; } + + } diff --git a/app/src/main/java/io/github/droidkaigi/confsched2017/util/ZonedDateTimeDeserializer.java b/app/src/main/java/io/github/droidkaigi/confsched2017/util/ZonedDateTimeDeserializer.java new file mode 100644 index 00000000..2307fd63 --- /dev/null +++ b/app/src/main/java/io/github/droidkaigi/confsched2017/util/ZonedDateTimeDeserializer.java @@ -0,0 +1,18 @@ +package io.github.droidkaigi.confsched2017.util; + +import com.google.gson.JsonDeserializationContext; +import com.google.gson.JsonDeserializer; +import com.google.gson.JsonElement; +import com.google.gson.JsonParseException; + +import org.threeten.bp.ZonedDateTime; + +import java.lang.reflect.Type; + +public class ZonedDateTimeDeserializer implements JsonDeserializer { + @Override + public ZonedDateTime deserialize(JsonElement jsonElement, Type type, JsonDeserializationContext jsonDeserializationContext) throws + JsonParseException { + return DroidKaigiTypeAdapters.deserializeZonedDateTime(jsonElement.getAsString()); + } +} diff --git a/app/src/main/java/io/github/droidkaigi/confsched2017/util/ZonedDateTimeSerializer.java b/app/src/main/java/io/github/droidkaigi/confsched2017/util/ZonedDateTimeSerializer.java new file mode 100644 index 00000000..9ef55d52 --- /dev/null +++ b/app/src/main/java/io/github/droidkaigi/confsched2017/util/ZonedDateTimeSerializer.java @@ -0,0 +1,17 @@ +package io.github.droidkaigi.confsched2017.util; + +import com.google.gson.JsonElement; +import com.google.gson.JsonPrimitive; +import com.google.gson.JsonSerializationContext; +import com.google.gson.JsonSerializer; + +import org.threeten.bp.ZonedDateTime; + +import java.lang.reflect.Type; + +public class ZonedDateTimeSerializer implements JsonSerializer { + @Override + public JsonElement serialize(ZonedDateTime zonedDateTime, Type type, JsonSerializationContext jsonSerializationContext) { + return new JsonPrimitive(zonedDateTime.format(DroidKaigiTypeAdapters.formatter)); + } +} diff --git a/app/src/main/java/io/github/droidkaigi/confsched2017/view/fragment/SessionsFragment.java b/app/src/main/java/io/github/droidkaigi/confsched2017/view/fragment/SessionsFragment.java index 77b11ab8..34ffabba 100644 --- a/app/src/main/java/io/github/droidkaigi/confsched2017/view/fragment/SessionsFragment.java +++ b/app/src/main/java/io/github/droidkaigi/confsched2017/view/fragment/SessionsFragment.java @@ -3,6 +3,7 @@ import org.lucasr.twowayview.TwoWayLayoutManager; import org.lucasr.twowayview.widget.DividerItemDecoration; import org.lucasr.twowayview.widget.SpannableGridLayoutManager; +import org.threeten.bp.ZonedDateTime; import android.content.Context; import android.graphics.Point; @@ -26,7 +27,6 @@ import android.widget.LinearLayout; import android.widget.TextView; -import java.util.Date; import java.util.List; import java.util.Locale; @@ -201,7 +201,7 @@ public void onScrolled(RecyclerView recyclerView, int dx, int dy) { } private void renderSessions(List adjustedSessionViewModels) { - List stimes = viewModel.getStimes(); + List stimes = viewModel.getStimes(); List rooms = viewModel.getRooms(); if (binding.recyclerView.getLayoutManager() == null) { diff --git a/app/src/main/java/io/github/droidkaigi/confsched2017/viewmodel/MySessionViewModel.java b/app/src/main/java/io/github/droidkaigi/confsched2017/viewmodel/MySessionViewModel.java index 8318ccde..a2807c64 100644 --- a/app/src/main/java/io/github/droidkaigi/confsched2017/viewmodel/MySessionViewModel.java +++ b/app/src/main/java/io/github/droidkaigi/confsched2017/viewmodel/MySessionViewModel.java @@ -1,12 +1,12 @@ package io.github.droidkaigi.confsched2017.viewmodel; +import org.threeten.bp.ZonedDateTime; + import android.content.Context; import android.databinding.BaseObservable; import android.support.annotation.NonNull; import android.view.View; -import java.util.Date; - import io.github.droidkaigi.confsched2017.R; import io.github.droidkaigi.confsched2017.model.MySession; import io.github.droidkaigi.confsched2017.model.Session; @@ -61,8 +61,8 @@ public int getRoomVisibility() { } private String decideSessionTimeRange(Context context, Session session) { - Date displaySTime = LocaleUtil.getDisplayDate(session.stime, context); - Date displayETime = LocaleUtil.getDisplayDate(session.etime, context); + ZonedDateTime displaySTime = LocaleUtil.getDisplayDate(session.stime, context); + ZonedDateTime displayETime = LocaleUtil.getDisplayDate(session.etime, context); return context.getString(R.string.session_time_range, DateUtil.getLongFormatDate(displaySTime), diff --git a/app/src/main/java/io/github/droidkaigi/confsched2017/viewmodel/SessionDetailViewModel.java b/app/src/main/java/io/github/droidkaigi/confsched2017/viewmodel/SessionDetailViewModel.java index ecf2395f..be96ec4d 100644 --- a/app/src/main/java/io/github/droidkaigi/confsched2017/viewmodel/SessionDetailViewModel.java +++ b/app/src/main/java/io/github/droidkaigi/confsched2017/viewmodel/SessionDetailViewModel.java @@ -1,5 +1,7 @@ package io.github.droidkaigi.confsched2017.viewmodel; +import org.threeten.bp.ZonedDateTime; + import android.content.Context; import android.databinding.BaseObservable; import android.support.annotation.ColorRes; @@ -9,7 +11,6 @@ import android.text.TextUtils; import android.view.View; -import java.util.Date; import java.util.Locale; import javax.inject.Inject; @@ -155,13 +156,13 @@ public void onClickFab(@SuppressWarnings("unused") View view) { } private String decideSessionTimeRange(Context context, Session session) { - Date displaySTime = LocaleUtil.getDisplayDate(session.stime, context); - Date displayETime = LocaleUtil.getDisplayDate(session.etime, context); + ZonedDateTime displaySTime = LocaleUtil.getDisplayDate(session.stime, context); + ZonedDateTime displayETime = LocaleUtil.getDisplayDate(session.etime, context); return context.getString(R.string.session_time_range, DateUtil.getLongFormatDate(displaySTime), DateUtil.getHourMinute(displayETime), - DateUtil.getMinutes(displaySTime, displayETime)); + session.durationMin); } public String getSessionTitle() { diff --git a/app/src/main/java/io/github/droidkaigi/confsched2017/viewmodel/SessionViewModel.java b/app/src/main/java/io/github/droidkaigi/confsched2017/viewmodel/SessionViewModel.java index 8dff3542..70e4adb1 100644 --- a/app/src/main/java/io/github/droidkaigi/confsched2017/viewmodel/SessionViewModel.java +++ b/app/src/main/java/io/github/droidkaigi/confsched2017/viewmodel/SessionViewModel.java @@ -1,5 +1,7 @@ package io.github.droidkaigi.confsched2017.viewmodel; +import org.threeten.bp.ZonedDateTime; + import android.content.Context; import android.databinding.BaseObservable; import android.databinding.Bindable; @@ -8,14 +10,13 @@ import android.support.annotation.NonNull; import android.view.View; -import java.util.Date; - import io.github.droidkaigi.confsched2017.BR; import io.github.droidkaigi.confsched2017.R; import io.github.droidkaigi.confsched2017.model.Session; import io.github.droidkaigi.confsched2017.repository.sessions.MySessionsRepository; import io.github.droidkaigi.confsched2017.util.AlarmUtil; import io.github.droidkaigi.confsched2017.util.DateUtil; +import io.github.droidkaigi.confsched2017.util.LocaleUtil; import timber.log.Timber; public class SessionViewModel extends BaseObservable implements ViewModel { @@ -67,8 +68,10 @@ public class SessionViewModel extends BaseObservable implements ViewModel { SessionViewModel(@NonNull Session session, Context context, int roomCount, boolean isMySession, MySessionsRepository mySessionsRepository) { this.session = session; - this.shortStime = DateUtil.getHourMinute(session.stime); - this.formattedDate = DateUtil.getMonthDate(session.stime, context); + + ZonedDateTime displayDate = LocaleUtil.getDisplayDate(session.stime, context); + this.shortStime = DateUtil.getHourMinute(displayDate); + this.formattedDate = DateUtil.getMonthDate(displayDate, context); this.title = session.title; if (session.speaker != null) { @@ -96,7 +99,7 @@ public class SessionViewModel extends BaseObservable implements ViewModel { this.normalSessionItemVisibility = View.GONE; } else { this.isClickable = true; - this.backgroundResId = session.isLiveAt(new Date()) ? R.drawable.clickable_purple : R.drawable.clickable_white; + this.backgroundResId = session.isLiveAt(ZonedDateTime.now()) ? R.drawable.clickable_purple : R.drawable.clickable_white; this.topicColorResId = TopicColor.from(session.topic).middleColorResId; this.normalSessionItemVisibility = View.VISIBLE; } @@ -141,7 +144,7 @@ private void decideRowSpan(@NonNull Session session) { } } - Date getStime() { + ZonedDateTime getStime() { return session.stime; } diff --git a/app/src/main/java/io/github/droidkaigi/confsched2017/viewmodel/SessionsViewModel.java b/app/src/main/java/io/github/droidkaigi/confsched2017/viewmodel/SessionsViewModel.java index f1dff070..b1dd361f 100644 --- a/app/src/main/java/io/github/droidkaigi/confsched2017/viewmodel/SessionsViewModel.java +++ b/app/src/main/java/io/github/droidkaigi/confsched2017/viewmodel/SessionsViewModel.java @@ -2,6 +2,8 @@ import com.annimon.stream.Stream; +import org.threeten.bp.ZonedDateTime; + import android.content.Context; import android.databinding.BaseObservable; import android.databinding.Bindable; @@ -10,7 +12,6 @@ import android.view.View; import java.util.ArrayList; -import java.util.Date; import java.util.LinkedHashMap; import java.util.List; import java.util.Locale; @@ -35,7 +36,7 @@ public class SessionsViewModel extends BaseObservable implements ViewModel { private List rooms; - private List stimes; + private List stimes; @Inject SessionsViewModel(SessionsRepository sessionsRepository, MySessionsRepository mySessionsRepository) { @@ -88,7 +89,7 @@ private List adjustViewModels(List sessionVi // Format date that user can see. Ex) 9, March String lastFormattedDate = null; - for (Date stime : stimes) { + for (ZonedDateTime stime : stimes) { if (lastFormattedDate == null) { lastFormattedDate = DateUtil.getMonthDate(stime, context); } @@ -136,11 +137,11 @@ private List adjustViewModels(List sessionVi return adjustedViewModels; } - private String generateStimeRoomKey(@NonNull Date stime, @NonNull String roomName) { + private String generateStimeRoomKey(@NonNull ZonedDateTime stime, @NonNull String roomName) { return DateUtil.getLongFormatDate(stime) + "_" + roomName; } - private List extractStimes(List sessions) { + private List extractStimes(List sessions) { return Stream.of(sessions) .map(session -> session.stime) .sorted() @@ -161,7 +162,7 @@ public List getRooms() { return rooms; } - public List getStimes() { + public List getStimes() { return stimes; } From 529ab324a71e0264bc8d7060f7bc82cc4be10f78 Mon Sep 17 00:00:00 2001 From: Pluulove Date: Fri, 17 Feb 2017 17:29:09 +0900 Subject: [PATCH 2/3] Modify, DateTime Convert - Support, Device Zone Change - Support, Display Time On/Off --- .../confsched2017/util/AlarmUtil.java | 4 +-- .../confsched2017/util/DateUtil.java | 33 +++++++++++++++---- .../viewmodel/MySessionViewModel.java | 4 +-- .../viewmodel/SessionDetailViewModel.java | 4 +-- .../viewmodel/SessionViewModel.java | 3 +- .../viewmodel/SessionsViewModel.java | 8 ++--- 6 files changed, 38 insertions(+), 18 deletions(-) diff --git a/app/src/main/java/io/github/droidkaigi/confsched2017/util/AlarmUtil.java b/app/src/main/java/io/github/droidkaigi/confsched2017/util/AlarmUtil.java index 808248a1..367be8b6 100644 --- a/app/src/main/java/io/github/droidkaigi/confsched2017/util/AlarmUtil.java +++ b/app/src/main/java/io/github/droidkaigi/confsched2017/util/AlarmUtil.java @@ -52,8 +52,8 @@ private static PendingIntent createAlarmIntent(@NonNull Context context, @NonNul room = session.room.name; } String text = context.getString(R.string.notification_message, - DateUtil.getHourMinute(displaySTime), - DateUtil.getHourMinute(displayETime), + DateUtil.getHourMinute(displaySTime, context), + DateUtil.getHourMinute(displayETime, context), room); Intent intent = NotificationReceiver.createIntent(context, session.id, title, text); return PendingIntent.getBroadcast(context, session.id, diff --git a/app/src/main/java/io/github/droidkaigi/confsched2017/util/DateUtil.java b/app/src/main/java/io/github/droidkaigi/confsched2017/util/DateUtil.java index 6d5145d4..c37e0ce0 100644 --- a/app/src/main/java/io/github/droidkaigi/confsched2017/util/DateUtil.java +++ b/app/src/main/java/io/github/droidkaigi/confsched2017/util/DateUtil.java @@ -1,6 +1,10 @@ package io.github.droidkaigi.confsched2017.util; import org.threeten.bp.DateTimeUtils; +import org.threeten.bp.Instant; +import org.threeten.bp.LocalDateTime; +import org.threeten.bp.ZoneId; +import org.threeten.bp.ZoneOffset; import org.threeten.bp.ZonedDateTime; import org.threeten.bp.temporal.ChronoUnit; @@ -16,6 +20,9 @@ import java.util.Locale; import java.util.TimeZone; +import io.github.droidkaigi.confsched2017.BuildConfig; +import io.github.droidkaigi.confsched2017.pref.DefaultPrefs; + public class DateUtil { private static final String FORMAT_MMDD = "MMMd"; @@ -26,18 +33,29 @@ public class DateUtil { private static final String FORMAT_PROGRAM_START_DATE = "MM/dd(E) kk:mm"; + private static final ZoneOffset CONFERENCE_ZONE_OFFSET = LocalDateTime.now().atZone(ZoneId.of(BuildConfig.CONFERENCE_TIMEZONE)).getOffset(); + private DateUtil() { throw new AssertionError("no instance!"); } @NonNull - private static Date convertZoneDateTime(ZonedDateTime date) { - return DateTimeUtils.toDate(date.toInstant()); + private static Date convertZoneDateTime(ZonedDateTime date, Context context) { + boolean shouldShowLocalTime = DefaultPrefs.get(context).getShowLocalTimeFlag(); + Instant instant; + if (!shouldShowLocalTime) { + instant = date.withZoneSameInstant(ZoneId.systemDefault()) + .minusSeconds(CONFERENCE_ZONE_OFFSET.compareTo(ZonedDateTime.now().getOffset())) + .toInstant(); + } else { + instant = date.toInstant(); + } + return DateTimeUtils.toDate(instant); } @NonNull public static String getMonthDate(ZonedDateTime zonedDateTime, Context context) { - Date date = convertZoneDateTime(zonedDateTime); + Date date = convertZoneDateTime(zonedDateTime, context); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR2) { String pattern = DateFormat.getBestDateTimePattern(Locale.getDefault(), FORMAT_MMDD); return new SimpleDateFormat(pattern, Locale.getDefault()).format(date); @@ -48,8 +66,9 @@ public static String getMonthDate(ZonedDateTime zonedDateTime, Context context) } @NonNull - public static String getHourMinute(ZonedDateTime zonedDateTime) { - Date date = convertZoneDateTime(zonedDateTime); + public static String getHourMinute(ZonedDateTime zonedDateTime, Context context) { + Date date = convertZoneDateTime(zonedDateTime, context); +// Timber.tag("TIME").d("Current Date : %s ==> %s", zonedDateTime, date); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR2) { String pattern = DateFormat.getBestDateTimePattern(Locale.getDefault(), FORMAT_KKMM); return new SimpleDateFormat(pattern, Locale.getDefault()).format(date); @@ -59,11 +78,11 @@ public static String getHourMinute(ZonedDateTime zonedDateTime) { } @NonNull - public static String getLongFormatDate(@Nullable ZonedDateTime zonedDateTime) { + public static String getLongFormatDate(@Nullable ZonedDateTime zonedDateTime, Context context) { if (zonedDateTime == null) { return ""; } - Date date = convertZoneDateTime(zonedDateTime); + Date date = convertZoneDateTime(zonedDateTime, context); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR2) { String pattern = DateFormat.getBestDateTimePattern(Locale.getDefault(), FORMAT_YYYYMMDDKKMM); return new SimpleDateFormat(pattern, Locale.getDefault()).format(date); diff --git a/app/src/main/java/io/github/droidkaigi/confsched2017/viewmodel/MySessionViewModel.java b/app/src/main/java/io/github/droidkaigi/confsched2017/viewmodel/MySessionViewModel.java index a2807c64..a2c83812 100644 --- a/app/src/main/java/io/github/droidkaigi/confsched2017/viewmodel/MySessionViewModel.java +++ b/app/src/main/java/io/github/droidkaigi/confsched2017/viewmodel/MySessionViewModel.java @@ -65,8 +65,8 @@ private String decideSessionTimeRange(Context context, Session session) { ZonedDateTime displayETime = LocaleUtil.getDisplayDate(session.etime, context); return context.getString(R.string.session_time_range, - DateUtil.getLongFormatDate(displaySTime), - DateUtil.getHourMinute(displayETime), + DateUtil.getLongFormatDate(displaySTime, context), + DateUtil.getHourMinute(displayETime, context), DateUtil.getMinutes(displaySTime, displayETime)); } diff --git a/app/src/main/java/io/github/droidkaigi/confsched2017/viewmodel/SessionDetailViewModel.java b/app/src/main/java/io/github/droidkaigi/confsched2017/viewmodel/SessionDetailViewModel.java index be96ec4d..57688b4e 100644 --- a/app/src/main/java/io/github/droidkaigi/confsched2017/viewmodel/SessionDetailViewModel.java +++ b/app/src/main/java/io/github/droidkaigi/confsched2017/viewmodel/SessionDetailViewModel.java @@ -160,8 +160,8 @@ private String decideSessionTimeRange(Context context, Session session) { ZonedDateTime displayETime = LocaleUtil.getDisplayDate(session.etime, context); return context.getString(R.string.session_time_range, - DateUtil.getLongFormatDate(displaySTime), - DateUtil.getHourMinute(displayETime), + DateUtil.getLongFormatDate(displaySTime, context), + DateUtil.getHourMinute(displayETime, context), session.durationMin); } diff --git a/app/src/main/java/io/github/droidkaigi/confsched2017/viewmodel/SessionViewModel.java b/app/src/main/java/io/github/droidkaigi/confsched2017/viewmodel/SessionViewModel.java index 70e4adb1..c4492581 100644 --- a/app/src/main/java/io/github/droidkaigi/confsched2017/viewmodel/SessionViewModel.java +++ b/app/src/main/java/io/github/droidkaigi/confsched2017/viewmodel/SessionViewModel.java @@ -70,7 +70,8 @@ public class SessionViewModel extends BaseObservable implements ViewModel { this.session = session; ZonedDateTime displayDate = LocaleUtil.getDisplayDate(session.stime, context); - this.shortStime = DateUtil.getHourMinute(displayDate); +// Timber.tag("TIME").d("Display Date: %s, %s ==> %s", session.title, session.stime, displayDate); + this.shortStime = DateUtil.getHourMinute(displayDate, context); this.formattedDate = DateUtil.getMonthDate(displayDate, context); this.title = session.title; diff --git a/app/src/main/java/io/github/droidkaigi/confsched2017/viewmodel/SessionsViewModel.java b/app/src/main/java/io/github/droidkaigi/confsched2017/viewmodel/SessionsViewModel.java index b1dd361f..9b59f310 100644 --- a/app/src/main/java/io/github/droidkaigi/confsched2017/viewmodel/SessionsViewModel.java +++ b/app/src/main/java/io/github/droidkaigi/confsched2017/viewmodel/SessionsViewModel.java @@ -82,7 +82,7 @@ private List adjustViewModels(List sessionVi // In the case of Welcome talk and lunch time, set dummy room roomName = rooms.get(0).name; } - sessionMap.put(generateStimeRoomKey(viewModel.getStime(), roomName), viewModel); + sessionMap.put(generateStimeRoomKey(viewModel.getStime(), roomName, context), viewModel); } final List adjustedViewModels = new ArrayList<>(); @@ -98,7 +98,7 @@ private List adjustViewModels(List sessionVi int maxRowSpan = 1; for (int i = 0, size = rooms.size(); i < size; i++) { Room room = rooms.get(i); - SessionViewModel viewModel = sessionMap.get(generateStimeRoomKey(stime, room.name)); + SessionViewModel viewModel = sessionMap.get(generateStimeRoomKey(stime, room.name, context)); if (viewModel != null) { if (!lastFormattedDate.equals(viewModel.getFormattedDate())) { // Change the date @@ -137,8 +137,8 @@ private List adjustViewModels(List sessionVi return adjustedViewModels; } - private String generateStimeRoomKey(@NonNull ZonedDateTime stime, @NonNull String roomName) { - return DateUtil.getLongFormatDate(stime) + "_" + roomName; + private String generateStimeRoomKey(@NonNull ZonedDateTime stime, @NonNull String roomName, Context context) { + return DateUtil.getLongFormatDate(stime, context) + "_" + roomName; } private List extractStimes(List sessions) { From e9639cbc7a38c499459ab1dc12449de813cb0d09 Mon Sep 17 00:00:00 2001 From: Pluu Date: Fri, 17 Feb 2017 23:22:16 +0900 Subject: [PATCH 3/3] Fixed More Refactoring --- .../confsched2017/util/AlarmUtil.java | 7 ++- .../confsched2017/util/DateUtil.java | 50 +++++-------------- .../confsched2017/util/LocaleUtil.java | 20 ++++++-- .../viewmodel/MySessionViewModel.java | 8 +-- .../viewmodel/SessionDetailViewModel.java | 7 ++- .../viewmodel/SessionViewModel.java | 5 +- .../viewmodel/SessionsViewModel.java | 12 +++-- 7 files changed, 51 insertions(+), 58 deletions(-) diff --git a/app/src/main/java/io/github/droidkaigi/confsched2017/util/AlarmUtil.java b/app/src/main/java/io/github/droidkaigi/confsched2017/util/AlarmUtil.java index 367be8b6..e495087f 100644 --- a/app/src/main/java/io/github/droidkaigi/confsched2017/util/AlarmUtil.java +++ b/app/src/main/java/io/github/droidkaigi/confsched2017/util/AlarmUtil.java @@ -1,7 +1,5 @@ package io.github.droidkaigi.confsched2017.util; -import org.threeten.bp.ZonedDateTime; - import android.app.AlarmManager; import android.app.PendingIntent; import android.content.Context; @@ -9,6 +7,7 @@ import android.os.Build; import android.support.annotation.NonNull; +import java.util.Date; import java.util.concurrent.TimeUnit; import io.github.droidkaigi.confsched2017.R; @@ -45,8 +44,8 @@ public static void unregisterAlarm(@NonNull Context context, @NonNull Session se private static PendingIntent createAlarmIntent(@NonNull Context context, @NonNull Session session) { String title = context.getString(R.string.notification_title, session.title); - ZonedDateTime displaySTime = LocaleUtil.getDisplayDate(session.stime, context); - ZonedDateTime displayETime = LocaleUtil.getDisplayDate(session.etime, context); + Date displaySTime = LocaleUtil.getDisplayDate(session.stime, context); + Date displayETime = LocaleUtil.getDisplayDate(session.etime, context); String room = ""; if (session.room != null) { room = session.room.name; diff --git a/app/src/main/java/io/github/droidkaigi/confsched2017/util/DateUtil.java b/app/src/main/java/io/github/droidkaigi/confsched2017/util/DateUtil.java index c37e0ce0..526007ea 100644 --- a/app/src/main/java/io/github/droidkaigi/confsched2017/util/DateUtil.java +++ b/app/src/main/java/io/github/droidkaigi/confsched2017/util/DateUtil.java @@ -1,13 +1,5 @@ package io.github.droidkaigi.confsched2017.util; -import org.threeten.bp.DateTimeUtils; -import org.threeten.bp.Instant; -import org.threeten.bp.LocalDateTime; -import org.threeten.bp.ZoneId; -import org.threeten.bp.ZoneOffset; -import org.threeten.bp.ZonedDateTime; -import org.threeten.bp.temporal.ChronoUnit; - import android.content.Context; import android.os.Build; import android.support.annotation.NonNull; @@ -19,9 +11,7 @@ import java.util.Date; import java.util.Locale; import java.util.TimeZone; - -import io.github.droidkaigi.confsched2017.BuildConfig; -import io.github.droidkaigi.confsched2017.pref.DefaultPrefs; +import java.util.concurrent.TimeUnit; public class DateUtil { @@ -33,29 +23,12 @@ public class DateUtil { private static final String FORMAT_PROGRAM_START_DATE = "MM/dd(E) kk:mm"; - private static final ZoneOffset CONFERENCE_ZONE_OFFSET = LocalDateTime.now().atZone(ZoneId.of(BuildConfig.CONFERENCE_TIMEZONE)).getOffset(); - private DateUtil() { throw new AssertionError("no instance!"); } @NonNull - private static Date convertZoneDateTime(ZonedDateTime date, Context context) { - boolean shouldShowLocalTime = DefaultPrefs.get(context).getShowLocalTimeFlag(); - Instant instant; - if (!shouldShowLocalTime) { - instant = date.withZoneSameInstant(ZoneId.systemDefault()) - .minusSeconds(CONFERENCE_ZONE_OFFSET.compareTo(ZonedDateTime.now().getOffset())) - .toInstant(); - } else { - instant = date.toInstant(); - } - return DateTimeUtils.toDate(instant); - } - - @NonNull - public static String getMonthDate(ZonedDateTime zonedDateTime, Context context) { - Date date = convertZoneDateTime(zonedDateTime, context); + public static String getMonthDate(Date date, Context context) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR2) { String pattern = DateFormat.getBestDateTimePattern(Locale.getDefault(), FORMAT_MMDD); return new SimpleDateFormat(pattern, Locale.getDefault()).format(date); @@ -66,9 +39,7 @@ public static String getMonthDate(ZonedDateTime zonedDateTime, Context context) } @NonNull - public static String getHourMinute(ZonedDateTime zonedDateTime, Context context) { - Date date = convertZoneDateTime(zonedDateTime, context); -// Timber.tag("TIME").d("Current Date : %s ==> %s", zonedDateTime, date); + public static String getHourMinute(Date date, Context context) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR2) { String pattern = DateFormat.getBestDateTimePattern(Locale.getDefault(), FORMAT_KKMM); return new SimpleDateFormat(pattern, Locale.getDefault()).format(date); @@ -78,11 +49,10 @@ public static String getHourMinute(ZonedDateTime zonedDateTime, Context context) } @NonNull - public static String getLongFormatDate(@Nullable ZonedDateTime zonedDateTime, Context context) { - if (zonedDateTime == null) { + public static String getLongFormatDate(@Nullable Date date, Context context) { + if (date == null) { return ""; } - Date date = convertZoneDateTime(zonedDateTime, context); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR2) { String pattern = DateFormat.getBestDateTimePattern(Locale.getDefault(), FORMAT_YYYYMMDDKKMM); return new SimpleDateFormat(pattern, Locale.getDefault()).format(date); @@ -97,7 +67,13 @@ public static String getLongFormatDate(@Nullable ZonedDateTime zonedDateTime, Co } } - public static int getMinutes(ZonedDateTime stime, ZonedDateTime etime) { - return (int) ChronoUnit.MINUTES.between(stime, etime); + public static int getMinutes(Date stime, Date etime) { + long range = etime.getTime() - stime.getTime(); + + if (range > 0) { + return (int) (range / TimeUnit.MINUTES.toMillis(1L)); + } else { + return 0; + } } } diff --git a/app/src/main/java/io/github/droidkaigi/confsched2017/util/LocaleUtil.java b/app/src/main/java/io/github/droidkaigi/confsched2017/util/LocaleUtil.java index 88ca1aa7..0b1ac03f 100644 --- a/app/src/main/java/io/github/droidkaigi/confsched2017/util/LocaleUtil.java +++ b/app/src/main/java/io/github/droidkaigi/confsched2017/util/LocaleUtil.java @@ -1,6 +1,10 @@ package io.github.droidkaigi.confsched2017.util; +import org.threeten.bp.DateTimeUtils; +import org.threeten.bp.Instant; +import org.threeten.bp.LocalDateTime; import org.threeten.bp.ZoneId; +import org.threeten.bp.ZoneOffset; import org.threeten.bp.ZonedDateTime; import android.content.Context; @@ -11,6 +15,7 @@ import android.text.TextUtils; import java.util.Arrays; +import java.util.Date; import java.util.List; import java.util.Locale; import java.util.TimeZone; @@ -29,6 +34,10 @@ public class LocaleUtil { private static final TimeZone CONFERENCE_TIMEZONE = TimeZone.getTimeZone(BuildConfig.CONFERENCE_TIMEZONE); + private static final ZoneOffset CONFERENCE_ZONE_OFFSET = LocalDateTime.now() + .atZone(ZoneId.of(BuildConfig.CONFERENCE_TIMEZONE)) + .getOffset(); + public static void initLocale(Context context) { setLocale(context, getCurrentLanguageId(context)); } @@ -104,11 +113,16 @@ public static int getLanguage(@NonNull String languageId) { } } - public static ZonedDateTime getDisplayDate(@NonNull ZonedDateTime date, Context context) { + public static Date getDisplayDate(@NonNull ZonedDateTime date, Context context) { + Instant instant; if (DefaultPrefs.get(context).getShowLocalTimeFlag()) { - return date.withZoneSameInstant(ZoneId.systemDefault()); + instant = date.toInstant(); + } else { + instant = date.withZoneSameInstant(ZoneId.systemDefault()) + .minusSeconds(CONFERENCE_ZONE_OFFSET.compareTo(ZonedDateTime.now().getOffset())) + .toInstant(); } - return date; + return DateTimeUtils.toDate(instant); } public static TimeZone getDisplayTimeZone(Context context) { diff --git a/app/src/main/java/io/github/droidkaigi/confsched2017/viewmodel/MySessionViewModel.java b/app/src/main/java/io/github/droidkaigi/confsched2017/viewmodel/MySessionViewModel.java index a2c83812..386fd1e3 100644 --- a/app/src/main/java/io/github/droidkaigi/confsched2017/viewmodel/MySessionViewModel.java +++ b/app/src/main/java/io/github/droidkaigi/confsched2017/viewmodel/MySessionViewModel.java @@ -1,12 +1,12 @@ package io.github.droidkaigi.confsched2017.viewmodel; -import org.threeten.bp.ZonedDateTime; - import android.content.Context; import android.databinding.BaseObservable; import android.support.annotation.NonNull; import android.view.View; +import java.util.Date; + import io.github.droidkaigi.confsched2017.R; import io.github.droidkaigi.confsched2017.model.MySession; import io.github.droidkaigi.confsched2017.model.Session; @@ -61,8 +61,8 @@ public int getRoomVisibility() { } private String decideSessionTimeRange(Context context, Session session) { - ZonedDateTime displaySTime = LocaleUtil.getDisplayDate(session.stime, context); - ZonedDateTime displayETime = LocaleUtil.getDisplayDate(session.etime, context); + Date displaySTime = LocaleUtil.getDisplayDate(session.stime, context); + Date displayETime = LocaleUtil.getDisplayDate(session.etime, context); return context.getString(R.string.session_time_range, DateUtil.getLongFormatDate(displaySTime, context), diff --git a/app/src/main/java/io/github/droidkaigi/confsched2017/viewmodel/SessionDetailViewModel.java b/app/src/main/java/io/github/droidkaigi/confsched2017/viewmodel/SessionDetailViewModel.java index 57688b4e..d76fd80d 100644 --- a/app/src/main/java/io/github/droidkaigi/confsched2017/viewmodel/SessionDetailViewModel.java +++ b/app/src/main/java/io/github/droidkaigi/confsched2017/viewmodel/SessionDetailViewModel.java @@ -1,7 +1,5 @@ package io.github.droidkaigi.confsched2017.viewmodel; -import org.threeten.bp.ZonedDateTime; - import android.content.Context; import android.databinding.BaseObservable; import android.support.annotation.ColorRes; @@ -11,6 +9,7 @@ import android.text.TextUtils; import android.view.View; +import java.util.Date; import java.util.Locale; import javax.inject.Inject; @@ -156,8 +155,8 @@ public void onClickFab(@SuppressWarnings("unused") View view) { } private String decideSessionTimeRange(Context context, Session session) { - ZonedDateTime displaySTime = LocaleUtil.getDisplayDate(session.stime, context); - ZonedDateTime displayETime = LocaleUtil.getDisplayDate(session.etime, context); + Date displaySTime = LocaleUtil.getDisplayDate(session.stime, context); + Date displayETime = LocaleUtil.getDisplayDate(session.etime, context); return context.getString(R.string.session_time_range, DateUtil.getLongFormatDate(displaySTime, context), diff --git a/app/src/main/java/io/github/droidkaigi/confsched2017/viewmodel/SessionViewModel.java b/app/src/main/java/io/github/droidkaigi/confsched2017/viewmodel/SessionViewModel.java index c4492581..60d18ab8 100644 --- a/app/src/main/java/io/github/droidkaigi/confsched2017/viewmodel/SessionViewModel.java +++ b/app/src/main/java/io/github/droidkaigi/confsched2017/viewmodel/SessionViewModel.java @@ -10,6 +10,8 @@ import android.support.annotation.NonNull; import android.view.View; +import java.util.Date; + import io.github.droidkaigi.confsched2017.BR; import io.github.droidkaigi.confsched2017.R; import io.github.droidkaigi.confsched2017.model.Session; @@ -69,8 +71,7 @@ public class SessionViewModel extends BaseObservable implements ViewModel { MySessionsRepository mySessionsRepository) { this.session = session; - ZonedDateTime displayDate = LocaleUtil.getDisplayDate(session.stime, context); -// Timber.tag("TIME").d("Display Date: %s, %s ==> %s", session.title, session.stime, displayDate); + Date displayDate = LocaleUtil.getDisplayDate(session.stime, context); this.shortStime = DateUtil.getHourMinute(displayDate, context); this.formattedDate = DateUtil.getMonthDate(displayDate, context); this.title = session.title; diff --git a/app/src/main/java/io/github/droidkaigi/confsched2017/viewmodel/SessionsViewModel.java b/app/src/main/java/io/github/droidkaigi/confsched2017/viewmodel/SessionsViewModel.java index 9b59f310..1bcca273 100644 --- a/app/src/main/java/io/github/droidkaigi/confsched2017/viewmodel/SessionsViewModel.java +++ b/app/src/main/java/io/github/droidkaigi/confsched2017/viewmodel/SessionsViewModel.java @@ -12,6 +12,7 @@ import android.view.View; import java.util.ArrayList; +import java.util.Date; import java.util.LinkedHashMap; import java.util.List; import java.util.Locale; @@ -26,6 +27,7 @@ import io.github.droidkaigi.confsched2017.repository.sessions.MySessionsRepository; import io.github.droidkaigi.confsched2017.repository.sessions.SessionsRepository; import io.github.droidkaigi.confsched2017.util.DateUtil; +import io.github.droidkaigi.confsched2017.util.LocaleUtil; import io.reactivex.Single; public class SessionsViewModel extends BaseObservable implements ViewModel { @@ -82,23 +84,25 @@ private List adjustViewModels(List sessionVi // In the case of Welcome talk and lunch time, set dummy room roomName = rooms.get(0).name; } - sessionMap.put(generateStimeRoomKey(viewModel.getStime(), roomName, context), viewModel); + sessionMap.put(generateStimeRoomKey(LocaleUtil.getDisplayDate(viewModel.getStime(), context), roomName, context), viewModel); } final List adjustedViewModels = new ArrayList<>(); // Format date that user can see. Ex) 9, March String lastFormattedDate = null; + Date displayDate; for (ZonedDateTime stime : stimes) { + displayDate = LocaleUtil.getDisplayDate(stime, context); if (lastFormattedDate == null) { - lastFormattedDate = DateUtil.getMonthDate(stime, context); + lastFormattedDate = DateUtil.getMonthDate(displayDate, context); } final List sameTimeViewModels = new ArrayList<>(); int maxRowSpan = 1; for (int i = 0, size = rooms.size(); i < size; i++) { Room room = rooms.get(i); - SessionViewModel viewModel = sessionMap.get(generateStimeRoomKey(stime, room.name, context)); + SessionViewModel viewModel = sessionMap.get(generateStimeRoomKey(displayDate, room.name, context)); if (viewModel != null) { if (!lastFormattedDate.equals(viewModel.getFormattedDate())) { // Change the date @@ -137,7 +141,7 @@ private List adjustViewModels(List sessionVi return adjustedViewModels; } - private String generateStimeRoomKey(@NonNull ZonedDateTime stime, @NonNull String roomName, Context context) { + private String generateStimeRoomKey(@NonNull Date stime, @NonNull String roomName, Context context) { return DateUtil.getLongFormatDate(stime, context) + "_" + roomName; }