Replace some usages of Date with LocalDateTime. austinhuang0131/barinsta#1309

This commit is contained in:
Ammar Githam 2021-05-23 21:58:19 +09:00
parent c784ca937d
commit b273bff738
11 changed files with 51 additions and 68 deletions

View File

@ -1,6 +1,5 @@
package awais.instagrabber.adapters;
import android.text.format.DateFormat;
import android.view.LayoutInflater;
import android.view.ViewGroup;
@ -13,8 +12,10 @@ import androidx.recyclerview.widget.AsyncListDiffer;
import androidx.recyclerview.widget.DiffUtil;
import androidx.recyclerview.widget.RecyclerView;
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import java.time.format.FormatStyle;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Objects;
import java.util.function.Function;
@ -57,7 +58,6 @@ import awais.instagrabber.repositories.responses.User;
import awais.instagrabber.repositories.responses.directmessages.DirectItem;
import awais.instagrabber.repositories.responses.directmessages.DirectItemStoryShare;
import awais.instagrabber.repositories.responses.directmessages.DirectThread;
import awais.instagrabber.utils.DateUtils;
public final class DirectItemsAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
private static final String TAG = DirectItemsAdapter.class.getSimpleName();
@ -292,12 +292,15 @@ public final class DirectItemsAdapter extends RecyclerView.Adapter<RecyclerView.
private List<DirectItemOrHeader> sectionAndSort(final List<DirectItem> list) {
final List<DirectItemOrHeader> itemOrHeaders = new ArrayList<>();
Date prevSectionDate = null;
LocalDate prevSectionDate = null;
for (int i = 0; i < list.size(); i++) {
final DirectItem item = list.get(i);
if (item == null) continue;
if (item == null || item.getDate() == null) continue;
final DirectItemOrHeader prev = itemOrHeaders.isEmpty() ? null : itemOrHeaders.get(itemOrHeaders.size() - 1);
if (prev != null && prev.item != null && DateUtils.isSameDay(prev.item.getDate(), item.getDate())) {
if (prev != null
&& prev.item != null
&& prev.item.getDate() != null
&& prev.item.getDate().toLocalDate().isEqual(item.getDate().toLocalDate())) {
// just add item
final DirectItemOrHeader itemOrHeader = new DirectItemOrHeader();
itemOrHeader.item = item;
@ -320,7 +323,7 @@ public final class DirectItemsAdapter extends RecyclerView.Adapter<RecyclerView.
final DirectItemOrHeader itemOrHeader = new DirectItemOrHeader();
itemOrHeader.item = item;
itemOrHeaders.add(itemOrHeader);
prevSectionDate = DateUtils.dateAtZeroHours(item.getDate());
prevSectionDate = item.getDate().toLocalDate();
}
return itemOrHeaders;
}
@ -352,7 +355,7 @@ public final class DirectItemsAdapter extends RecyclerView.Adapter<RecyclerView.
}
public static class DirectItemOrHeader {
Date date;
LocalDate date;
public DirectItem item;
public boolean isHeader() {
@ -377,12 +380,13 @@ public final class DirectItemsAdapter extends RecyclerView.Adapter<RecyclerView.
this.binding = binding;
}
public void bind(final Date date) {
public void bind(final LocalDate date) {
if (date == null) {
binding.header.setText("");
return;
}
binding.header.setText(DateFormat.getDateFormat(itemView.getContext()).format(date));
final DateTimeFormatter dateFormatter = DateTimeFormatter.ofLocalizedDate(FormatStyle.SHORT);
binding.header.setText(dateFormatter.format(date));
}
}

View File

@ -5,7 +5,6 @@ import android.content.res.ColorStateList;
import android.content.res.Resources;
import android.graphics.Point;
import android.graphics.drawable.Drawable;
import android.text.format.DateFormat;
import android.view.Gravity;
import android.view.View;
import android.view.ViewConfiguration;
@ -25,6 +24,8 @@ import androidx.transition.TransitionManager;
import com.google.android.material.transition.MaterialFade;
import com.google.common.collect.ImmutableList;
import java.time.format.DateTimeFormatter;
import java.time.format.FormatStyle;
import java.util.List;
import java.util.stream.Collectors;
@ -194,7 +195,8 @@ public abstract class DirectItemViewHolder extends RecyclerView.ViewHolder imple
binding.messageInfo.setVisibility(View.VISIBLE);
binding.deliveryStatus.setVisibility(messageDirection == MessageDirection.OUTGOING ? View.VISIBLE : View.GONE);
if (item.getDate() != null) {
binding.messageTime.setText(DateFormat.getTimeFormat(itemView.getContext()).format(item.getDate()));
final DateTimeFormatter dateFormatter = DateTimeFormatter.ofLocalizedTime(FormatStyle.SHORT);
binding.messageTime.setText(dateFormatter.format(item.getDate()));
}
if (messageDirection == MessageDirection.OUTGOING) {
if (item.isPending()) {

View File

@ -15,8 +15,10 @@ import androidx.room.TypeConverters;
import androidx.room.migration.Migration;
import androidx.sqlite.db.SupportSQLiteDatabase;
import java.time.Instant;
import java.time.LocalDateTime;
import java.time.ZoneId;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import awais.instagrabber.db.dao.AccountDao;
@ -195,14 +197,18 @@ public abstract class AppDatabase extends RoomDatabase {
if (favoriteTypeQueryPair == null) continue;
final FavoriteType type = favoriteTypeQueryPair.first;
final String query = favoriteTypeQueryPair.second;
final long epochMillis = cursor.getLong(cursor.getColumnIndex("date_added"));
final LocalDateTime localDateTime = LocalDateTime.ofInstant(
Instant.ofEpochMilli(epochMillis),
ZoneId.systemDefault()
);
oldModels.add(new Favorite(
0,
query,
type,
queryDisplayExists ? cursor.getString(cursor.getColumnIndex("query_display"))
: null,
queryDisplayExists ? cursor.getString(cursor.getColumnIndex("query_display")) : null,
null,
new Date(cursor.getLong(cursor.getColumnIndex("date_added")))
localDateTime
));
} catch (Exception e) {
Log.e(TAG, "onUpgrade", e);
@ -222,7 +228,7 @@ public abstract class AppDatabase extends RoomDatabase {
values.put(Favorite.COL_TYPE, model.getType().toString());
values.put(Favorite.COL_DISPLAY_NAME, model.getDisplayName());
values.put(Favorite.COL_PIC_URL, model.getPicUrl());
values.put(Favorite.COL_DATE_ADDED, model.getDateAdded().getTime());
values.put(Favorite.COL_DATE_ADDED, model.getDateAdded().atZone(ZoneId.systemDefault()).toInstant().toEpochMilli());
int rows;
if (model.getId() >= 1) {
rows = db.update(Favorite.TABLE_NAME,

View File

@ -6,7 +6,7 @@ import androidx.room.ColumnInfo;
import androidx.room.Entity;
import androidx.room.PrimaryKey;
import java.util.Date;
import java.time.LocalDateTime;
import awais.instagrabber.models.enums.FavoriteType;
@ -37,14 +37,14 @@ public class Favorite {
private final String picUrl;
@ColumnInfo(name = COL_DATE_ADDED)
private final Date dateAdded;
private final LocalDateTime dateAdded;
public Favorite(final int id,
final String query,
final FavoriteType type,
final String displayName,
final String picUrl,
final Date dateAdded) {
final LocalDateTime dateAdded) {
this.id = id;
this.query = query;
this.type = type;
@ -73,7 +73,7 @@ public class Favorite {
return picUrl;
}
public Date getDateAdded() {
public LocalDateTime getDateAdded() {
return dateAdded;
}

View File

@ -38,7 +38,7 @@ import com.google.android.material.snackbar.BaseTransientBottomBar;
import com.google.android.material.snackbar.Snackbar;
import com.google.common.collect.ImmutableList;
import java.util.Date;
import java.time.LocalDateTime;
import java.util.List;
import java.util.Set;
@ -531,7 +531,7 @@ public class HashTagFragment extends Fragment implements SwipeRefreshLayout.OnRe
FavoriteType.HASHTAG,
hashtagModel.getName(),
"res:/" + R.drawable.ic_hashtag,
new Date()
LocalDateTime.now()
), new RepositoryCallback<Void>() {
@Override
public void onSuccess(final Void result) {

View File

@ -36,7 +36,7 @@ import com.google.android.material.snackbar.BaseTransientBottomBar;
import com.google.android.material.snackbar.Snackbar;
import com.google.common.collect.ImmutableList;
import java.util.Date;
import java.time.LocalDateTime;
import java.util.List;
import java.util.Set;
@ -539,7 +539,7 @@ public class LocationFragment extends Fragment implements SwipeRefreshLayout.OnR
FavoriteType.LOCATION,
locationModel.getName(),
"res:/" + R.drawable.ic_location,
new Date()
LocalDateTime.now()
), new RepositoryCallback<Void>() {
@Override
public void onSuccess(final Void result) {

View File

@ -45,8 +45,8 @@ import com.google.android.material.snackbar.BaseTransientBottomBar;
import com.google.android.material.snackbar.Snackbar;
import com.google.common.collect.ImmutableList;
import java.time.LocalDateTime;
import java.util.Collections;
import java.util.Date;
import java.util.List;
import java.util.Objects;
import java.util.Set;
@ -722,7 +722,7 @@ public class ProfileFragment extends Fragment implements SwipeRefreshLayout.OnRe
FavoriteType.USER,
profileModel.getFullName(),
profileModel.getProfilePicUrl(),
new Date()
LocalDateTime.now()
), new RepositoryCallback<Void>() {
@Override
public void onSuccess(final Void result) {

View File

@ -8,7 +8,6 @@ import java.io.Serializable
import java.time.Instant
import java.time.LocalDateTime
import java.time.ZoneId
import java.util.*
data class DirectItem(
var itemId: String? = null,
@ -40,9 +39,8 @@ data class DirectItem(
val hideInThread: Int? = 0,
val showForwardAttribution: Boolean = false
) : Cloneable, Serializable {
private var date: Date? = null
var isPending = false
var localDateTime: LocalDateTime? = null
var date: LocalDateTime? = null
get() {
if (field == null) {
field = Instant.ofEpochMilli(timestamp / 1000).atZone(ZoneId.systemDefault()).toLocalDateTime()
@ -60,13 +58,6 @@ data class DirectItem(
date = null
}
fun getDate(): Date? {
if (date == null) {
date = Date(timestamp / 1000)
}
return date
}
@Throws(CloneNotSupportedException::class)
public override fun clone(): Any {
return super.clone()

View File

@ -112,7 +112,7 @@ public class DMSyncService extends LifecycleService {
final DirectItem latestItem = unreadItems.get(unreadItems.size() - 1);
lastNotifiedListBuilder.add(new DMLastNotified(0,
unreadMessagesEntry.getKey(),
latestItem.getLocalDateTime(),
latestItem.getDate(),
now));
}
dmLastNotifiedRepository.insertOrUpdateDMLastNotified(
@ -145,8 +145,8 @@ public class DMSyncService extends LifecycleService {
if (item.getUserId() == viewerId) break; // Reached a message from the viewer, it is assumed the viewer has read the next messages
final boolean read = DMUtils.isRead(item, lastSeenAt, Collections.singletonList(viewerId));
if (read) break;
if (dmLastNotified != null && dmLastNotified.getLastNotifiedMsgTs() != null) {
if (count == 0 && DateUtils.isBeforeOrEqual(item.getLocalDateTime(), dmLastNotified.getLastNotifiedMsgTs())) {
if (dmLastNotified != null && dmLastNotified.getLastNotifiedMsgTs() != null && item.getDate() != null) {
if (count == 0 && DateUtils.isBeforeOrEqual(item.getDate(), dmLastNotified.getLastNotifiedMsgTs())) {
// The first unread item has been notified and hence all subsequent items can be ignored
// since the items are in desc timestamp order
break;

View File

@ -4,39 +4,15 @@ import androidx.annotation.NonNull;
import java.time.LocalDateTime;
import java.util.Calendar;
import java.util.Date;
import java.util.Locale;
public final class DateUtils {
public static boolean isSameDay(final Date date1, final Date date2) {
if (date1 == null || date2 == null) {
return false;
}
Calendar calendar1 = Calendar.getInstance();
calendar1.setTime(date1);
Calendar calendar2 = Calendar.getInstance();
calendar2.setTime(date2);
return calendar1.get(Calendar.YEAR) == calendar2.get(Calendar.YEAR)
&& calendar1.get(Calendar.MONTH) == calendar2.get(Calendar.MONTH)
&& calendar1.get(Calendar.DAY_OF_MONTH) == calendar2.get(Calendar.DAY_OF_MONTH);
}
public static Date dateAtZeroHours(@NonNull final Date date) {
final Calendar cal = Calendar.getInstance();
cal.setTime(date);
cal.set(Calendar.HOUR_OF_DAY, 0);
cal.set(Calendar.MINUTE, 0);
cal.set(Calendar.SECOND, 0);
cal.set(Calendar.MILLISECOND, 0);
return cal.getTime();
}
public static int getTimezoneOffset() {
final Calendar calendar = Calendar.getInstance(Locale.getDefault());
return -(calendar.get(Calendar.ZONE_OFFSET) + calendar.get(Calendar.DST_OFFSET)) / (60 * 1000);
}
public static boolean isBeforeOrEqual(final LocalDateTime localDateTime, final LocalDateTime comparedTo) {
public static boolean isBeforeOrEqual(@NonNull final LocalDateTime localDateTime, @NonNull final LocalDateTime comparedTo) {
return localDateTime.isBefore(comparedTo) || localDateTime.isEqual(comparedTo);
}
}

View File

@ -23,8 +23,10 @@ import org.json.JSONObject;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.time.Instant;
import java.time.LocalDateTime;
import java.time.ZoneId;
import java.util.ArrayList;
import java.util.Date;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
@ -147,13 +149,15 @@ public final class ExportImportUtils {
if (query == null || favoriteType == null) {
continue;
}
final long epochMillis = favsObject.getLong("d");
final Favorite favorite = new Favorite(
0,
query,
favoriteType,
favsObject.optString("s"),
favoriteType == FavoriteType.USER ? favsObject.optString("pic_url") : null,
new Date(favsObject.getLong("d")));
LocalDateTime.ofInstant(Instant.ofEpochMilli(epochMillis), ZoneId.systemDefault())
);
// Log.d(TAG, "importJson: favoriteModel: " + favoriteModel);
final FavoriteRepository favRepo = FavoriteRepository.getInstance(FavoriteDataSource.getInstance(context));
favRepo.getFavorite(query, favoriteType, new RepositoryCallback<Favorite>() {
@ -370,7 +374,7 @@ public final class ExportImportUtils {
jsonObject.put("type", favorite.getType().toString());
jsonObject.put("s", favorite.getDisplayName());
jsonObject.put("pic_url", favorite.getPicUrl());
jsonObject.put("d", favorite.getDateAdded().getTime());
jsonObject.put("d", favorite.getDateAdded().atZone(ZoneId.systemDefault()).toInstant().toEpochMilli());
jsonArray.put(jsonObject);
}
} catch (Exception e) {