diff --git a/app/src/main/java/eu/faircode/email/AdapterMessage.java b/app/src/main/java/eu/faircode/email/AdapterMessage.java index 99cc721c72..ca437baec9 100644 --- a/app/src/main/java/eu/faircode/email/AdapterMessage.java +++ b/app/src/main/java/eu/faircode/email/AdapterMessage.java @@ -101,7 +101,6 @@ import java.text.NumberFormat; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Arrays; -import java.util.Calendar; import java.util.Collections; import java.util.Comparator; import java.util.Date; @@ -129,10 +128,6 @@ import androidx.recyclerview.widget.LinearLayoutManager; import androidx.recyclerview.widget.RecyclerView; import androidx.recyclerview.widget.StaggeredGridLayoutManager; -import static android.text.format.DateUtils.DAY_IN_MILLIS; -import static android.text.format.DateUtils.FORMAT_SHOW_DATE; -import static android.text.format.DateUtils.FORMAT_SHOW_WEEKDAY; - public class AdapterMessage extends RecyclerView.Adapter { private Context context; private LayoutInflater inflater; @@ -180,7 +175,6 @@ public class AdapterMessage extends RecyclerView.Adapter list) { - if (date && "time".equals(sort)) { - TupleMessageEx prev = null; - for (int i = 0; i < list.size(); i++) { - TupleMessageEx message = list.get(i); - if (message != null) - if (i == 0) - message.day = true; - else if (prev != null) { - Calendar cal0 = Calendar.getInstance(); - Calendar cal1 = Calendar.getInstance(); - cal0.setTimeInMillis(prev.received); - cal1.setTimeInMillis(message.received); - int year0 = cal0.get(Calendar.YEAR); - int year1 = cal1.get(Calendar.YEAR); - int day0 = cal0.get(Calendar.DAY_OF_YEAR); - int day1 = cal1.get(Calendar.DAY_OF_YEAR); - message.day = (year0 != year1 || day0 != day1); - } - prev = message; - } - } - differ.submitList(list); } @@ -3086,6 +3016,10 @@ public class AdapterMessage extends RecyclerView.Adapter 0 ? adapter.getCurrentList().get(pos - 1) : null); + TupleMessageEx message = adapter.getCurrentList().get(pos); + if (pos > 0 && prev == null) + return null; + if (message == null) + return null; + + if (pos > 0) { + Calendar cal0 = Calendar.getInstance(); + Calendar cal1 = Calendar.getInstance(); + cal0.setTimeInMillis(prev.received); + cal1.setTimeInMillis(message.received); + int year0 = cal0.get(Calendar.YEAR); + int year1 = cal1.get(Calendar.YEAR); + int day0 = cal0.get(Calendar.DAY_OF_YEAR); + int day1 = cal1.get(Calendar.DAY_OF_YEAR); + if (year0 == year1 && day0 == day1) + return null; + } + + View header = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_message_date, parent, false); + TextView tvDate = header.findViewById(R.id.tvDate); + tvDate.setTextSize(TypedValue.COMPLEX_UNIT_PX, Helper.getTextSize(parent.getContext(), adapter.getZoom())); + + Calendar cal = Calendar.getInstance(); + cal.setTime(new Date()); + cal.set(Calendar.HOUR_OF_DAY, 0); + cal.set(Calendar.MINUTE, 0); + cal.set(Calendar.SECOND, 0); + cal.set(Calendar.MILLISECOND, 0); + cal.add(Calendar.DAY_OF_MONTH, -2); + if (message.received <= cal.getTimeInMillis()) + tvDate.setText( + DateUtils.formatDateRange( + parent.getContext(), + message.received, + message.received, + FORMAT_SHOW_WEEKDAY | FORMAT_SHOW_DATE)); + else + tvDate.setText( + DateUtils.getRelativeTimeSpanString( + message.received, + new Date().getTime(), + DAY_IN_MILLIS, 0)); + + header.measure(View.MeasureSpec.makeMeasureSpec(parent.getWidth(), View.MeasureSpec.EXACTLY), + View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED)); + header.layout(0, 0, header.getMeasuredWidth(), header.getMeasuredHeight()); + + return header; + } + }; + rvMessage.addItemDecoration(dateDecorator); + boolean compact = prefs.getBoolean("compact", false); int zoom = prefs.getInt("zoom", compact ? 0 : 1); String sort = prefs.getString("sort", "time"); @@ -729,8 +826,7 @@ public class FragmentMessages extends FragmentBase { public void onChildDraw( @NonNull Canvas canvas, @NonNull RecyclerView recyclerView, @NonNull RecyclerView.ViewHolder viewHolder, float dX, float dY, int actionState, boolean isCurrentlyActive) { - AdapterMessage.ViewHolder holder = ((AdapterMessage.ViewHolder) viewHolder); - holder.setDisplacement(dX); + super.onChildDraw(canvas, recyclerView, viewHolder, dX, dY, actionState, isCurrentlyActive); if (selectionPredicate != null) { handler.removeCallbacks(enableSelection); @@ -748,6 +844,7 @@ public class FragmentMessages extends FragmentBase { if (swipes == null) return; + AdapterMessage.ViewHolder holder = ((AdapterMessage.ViewHolder) viewHolder); Rect rect = holder.getItemRect(); int margin = Helper.dp2pixels(getContext(), 12); int size = Helper.dp2pixels(getContext(), 24); diff --git a/app/src/main/res/layout/item_message_compact.xml b/app/src/main/res/layout/item_message_compact.xml index 3d14987a67..77634a602f 100644 --- a/app/src/main/res/layout/item_message_compact.xml +++ b/app/src/main/res/layout/item_message_compact.xml @@ -13,29 +13,6 @@ android:focusable="true" android:focusableInTouchMode="true"> - - - - + app:layout_constraintTop_toTopOf="parent" /> + app:layout_constraintTop_toTopOf="parent" /> + app:layout_constraintTop_toTopOf="parent" /> + app:layout_constraintTop_toTopOf="parent" /> - - + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/item_message_normal.xml b/app/src/main/res/layout/item_message_normal.xml index 6c48a4f584..d639b62dab 100644 --- a/app/src/main/res/layout/item_message_normal.xml +++ b/app/src/main/res/layout/item_message_normal.xml @@ -13,29 +13,6 @@ android:focusable="true" android:focusableInTouchMode="true"> - - - - + app:layout_constraintTop_toTopOf="parent" /> + app:layout_constraintTop_toTopOf="parent" /> + app:layout_constraintTop_toTopOf="parent" /> + app:layout_constraintTop_toTopOf="parent" /> - -