Add absolute/relative time format setting

* Added setting to toggle precise date as default display

* Applied spotless

* Improved time format setting with a ListPreference

* Fixed default time format value in list preference

Co-authored-by: Rémi Rigal <remi.rigal@orange.com>
This commit is contained in:
RemiRigal
2021-02-14 09:51:19 +01:00
committed by GitHub
parent 107810dcb7
commit 21e49d0852
5 changed files with 66 additions and 15 deletions

View File

@@ -3,6 +3,8 @@ package com.github.gotify.messages;
import android.content.ClipData;
import android.content.ClipboardManager;
import android.content.Context;
import android.content.SharedPreferences;
import android.text.format.DateUtils;
import android.text.util.Linkify;
import android.view.LayoutInflater;
import android.view.View;
@@ -12,6 +14,7 @@ import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;
import androidx.annotation.NonNull;
import androidx.preference.PreferenceManager;
import androidx.recyclerview.widget.RecyclerView;
import butterknife.BindView;
import butterknife.ButterKnife;
@@ -26,9 +29,10 @@ import io.noties.markwon.core.CorePlugin;
import io.noties.markwon.ext.tables.TablePlugin;
import io.noties.markwon.image.picasso.PicassoImagesPlugin;
import io.noties.markwon.movement.MovementMethodPlugin;
import java.text.DateFormat;
import java.util.Date;
import java.util.List;
import org.threeten.bp.OffsetDateTime;
import org.threeten.bp.temporal.ChronoUnit;
public class ListMessageAdapter extends RecyclerView.Adapter<ListMessageAdapter.ViewHolder> {
@@ -39,6 +43,9 @@ public class ListMessageAdapter extends RecyclerView.Adapter<ListMessageAdapter.
private Settings settings;
private Markwon markwon;
private final String TIME_FORMAT_RELATIVE;
private final String TIME_FORMAT_PREFS_KEY;
ListMessageAdapter(
Context context,
Settings settings,
@@ -59,6 +66,10 @@ public class ListMessageAdapter extends RecyclerView.Adapter<ListMessageAdapter.
.usePlugin(PicassoImagesPlugin.create(picasso))
.usePlugin(TablePlugin.create(context))
.build();
TIME_FORMAT_RELATIVE =
context.getResources().getString(R.string.time_format_value_relative);
TIME_FORMAT_PREFS_KEY = context.getResources().getString(R.string.setting_key_time_format);
}
public List<MessageWithImage> getItems() {
@@ -94,8 +105,10 @@ public class ListMessageAdapter extends RecyclerView.Adapter<ListMessageAdapter.
.placeholder(R.drawable.ic_placeholder)
.into(holder.image);
holder.setDateTime(message.message.getDate());
holder.date.setOnClickListener((ignored) -> holder.switchPreciseDate());
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context);
String timeFormat = prefs.getString(TIME_FORMAT_PREFS_KEY, TIME_FORMAT_RELATIVE);
holder.setDateTime(message.message.getDate(), timeFormat.equals(TIME_FORMAT_RELATIVE));
holder.date.setOnClickListener((ignored) -> holder.switchTimeFormat());
holder.delete.setOnClickListener(
(ignored) -> delete.delete(holder.getAdapterPosition(), message.message, false));
@@ -128,35 +141,45 @@ public class ListMessageAdapter extends RecyclerView.Adapter<ListMessageAdapter.
@BindView(R.id.message_delete)
ImageButton delete;
private boolean preciseDate;
private boolean relativeTimeFormat;
private OffsetDateTime dateTime;
ViewHolder(final View view) {
super(view);
ButterKnife.bind(this, view);
preciseDate = false;
relativeTimeFormat = true;
dateTime = null;
enableCopyToClipboard();
}
void switchPreciseDate() {
preciseDate = !preciseDate;
void switchTimeFormat() {
relativeTimeFormat = !relativeTimeFormat;
updateDate();
}
void setDateTime(OffsetDateTime dateTime) {
void setDateTime(OffsetDateTime dateTime, boolean relativeTimeFormatPreference) {
this.dateTime = dateTime;
preciseDate = false;
relativeTimeFormat = relativeTimeFormatPreference;
updateDate();
}
void updateDate() {
String text = "?";
if (dateTime != null) {
if (preciseDate) {
text = dateTime.truncatedTo(ChronoUnit.SECONDS).toString();
} else {
if (relativeTimeFormat) {
// Relative time format
text = Utils.dateToRelative(dateTime);
} else {
// Absolute time format
long time = dateTime.toInstant().toEpochMilli();
Date date = new Date(time);
if (DateUtils.isToday(time)) {
text = DateFormat.getTimeInstance(DateFormat.SHORT).format(date);
} else {
text =
DateFormat.getDateTimeInstance(DateFormat.MEDIUM, DateFormat.SHORT)
.format(date);
}
}
}
date.setText(text);

View File

@@ -123,6 +123,8 @@ public class MessagesActivity extends AppCompatActivity
private PicassoHandler picassoHandler;
private ListMessageAdapter listMessageAdapter;
// we need to keep the target references otherwise they get gc'ed before they can be called.
@SuppressWarnings("MismatchedQueryAndUpdateOfCollection")
private final List<Target> targetReferences = new ArrayList<>();
@@ -150,7 +152,7 @@ public class MessagesActivity extends AppCompatActivity
DividerItemDecoration dividerItemDecoration =
new DividerItemDecoration(
messagesView.getContext(), layoutManager.getOrientation());
ListMessageAdapter adapter =
listMessageAdapter =
new ListMessageAdapter(
this, settings, picassoHandler.get(), emptyList(), this::scheduleDeletion);
@@ -158,9 +160,10 @@ public class MessagesActivity extends AppCompatActivity
messagesView.setHasFixedSize(true);
messagesView.setLayoutManager(layoutManager);
messagesView.addOnScrollListener(new MessageListOnScrollListener());
messagesView.setAdapter(adapter);
messagesView.setAdapter(listMessageAdapter);
ItemTouchHelper itemTouchHelper = new ItemTouchHelper(new SwipeToDeleteCallback(adapter));
ItemTouchHelper itemTouchHelper =
new ItemTouchHelper(new SwipeToDeleteCallback(listMessageAdapter));
itemTouchHelper.attachToRecyclerView(messagesView);
swipeRefreshLayout.setOnRefreshListener(this::onRefresh);
@@ -357,6 +360,8 @@ public class MessagesActivity extends AppCompatActivity
}
}
listMessageAdapter.notifyDataSetChanged();
navigationView.getMenu().findItem(selectedIndex).setChecked(true);
super.onResume();
}