added poll duration time, layout fix, bug fix

This commit is contained in:
nuclearfog 2023-04-17 12:19:36 +02:00
parent 20079c4ec2
commit ae349e0125
No known key found for this signature in database
GPG Key ID: 03488A185C476379
16 changed files with 134 additions and 68 deletions

View File

@ -94,7 +94,7 @@ public class MastodonPoll implements Poll {
@Override
public long expirationTime() {
public long getEndTime() {
return exTime;
}
@ -127,7 +127,7 @@ public class MastodonPoll implements Poll {
optionsBuf.append(option).append(',');
optionsBuf.deleteCharAt(optionsBuf.length() - 1).append(')');
}
return "id=" + getId() + " expired=" + expirationTime() + optionsBuf;
return "id=" + getId() + " expired=" + getEndTime() + optionsBuf;
}
/**

View File

@ -81,7 +81,7 @@ public class PollV2 implements Poll {
@Override
public long expirationTime() {
public long getEndTime() {
return expiredAt;
}
@ -114,7 +114,7 @@ public class PollV2 implements Poll {
optionsBuf.append(option).append(',');
optionsBuf.deleteCharAt(optionsBuf.length() - 1).append(')');
}
return "id=" + getId() + " expired=" + expirationTime() + optionsBuf;
return "id=" + getId() + " expired=" + getEndTime() + optionsBuf;
}
/**

View File

@ -24,7 +24,7 @@ public class LinkUtils {
/**
* regex pattern of a status URL
*/
public static final Pattern TWITTER_LINK_PATTERN = Pattern.compile("https://twitter.com/\\w+/status/\\d+");
private static final Pattern TWITTER_LINK_PATTERN = Pattern.compile("https://twitter.com/\\w+/status/\\d+");
private LinkUtils() {}

View File

@ -90,27 +90,58 @@ public class StringUtils {
}
if (diff > 604800000L) { // more than a week
int number = (int) (diff / 604800000L);
return resources.getQuantityString(R.plurals.n_weeks, number, number);
return resources.getQuantityString(R.plurals.weeks_ago, number, number);
}
if (diff > 86400000L) { // more than a day
int number = (int) (diff / 86400000L);
return resources.getQuantityString(R.plurals.n_days, number, number);
return resources.getQuantityString(R.plurals.days_ago, number, number);
}
if (diff > 3600000L) { // more than a hour
int number = (int) (diff / 3600000L);
return resources.getQuantityString(R.plurals.n_hours, number, number);
return resources.getQuantityString(R.plurals.hours_ago, number, number);
}
if (diff / 60000L > 0L) { // more than a minute
int number = (int) (diff / 60000L);
return resources.getQuantityString(R.plurals.n_minutes, number, number);
return resources.getQuantityString(R.plurals.minutes_ago, number, number);
}
if (diff / 1000L > 0L) {
int number = (int) (diff / 1000L);
return resources.getQuantityString(R.plurals.n_seconds, number, number);
return resources.getQuantityString(R.plurals.seconds_ago, number, number);
}
return resources.getString(R.string.time_now);
}
/**
* creates a time string from the difference between the current time and the given time
*
* @param time time value from which to create a difference
* @return time string showing the time difference
*/
public static String formatExpirationTime(Resources resources, long time) {
time = time - System.currentTimeMillis();
if (time > 604800000L) { // more than a week
int number = (int) (time / 604800000L);
return resources.getQuantityString(R.plurals.weeks_remain, number, number);
}
if (time > 86400000L) { // more than a day
int number = (int) (time / 86400000L);
return resources.getQuantityString(R.plurals.days_remain, number, number);
}
if (time > 3600000L) { // more than a hour
int number = (int) (time / 3600000L);
return resources.getQuantityString(R.plurals.hours_remain, number, number);
}
if (time / 60000L > 0L) { // more than a minute
int number = (int) (time / 60000L);
return resources.getQuantityString(R.plurals.minutes_remain, number, number);
}
if (time / 1000L > 0L) {
int number = (int) (time / 1000L);
return resources.getQuantityString(R.plurals.seconds_remain, number, number);
}
return "";
}
/**
* un-escape html based text
*

View File

@ -160,13 +160,4 @@ public class ConfigAccount implements Account {
return getUser().equals(account.getUser());
return false;
}
/**
* override hostname
*
* @param hostname new hostname
*/
public void setHost(String hostname) {
this.hostname = hostname;
}
}

View File

@ -1707,7 +1707,7 @@ public class AppDatabase {
}
column.put(PollTable.ID, poll.getId());
column.put(PollTable.LIMIT, poll.getLimit());
column.put(PollTable.EXPIRATION, poll.expirationTime());
column.put(PollTable.EXPIRATION, poll.getEndTime());
column.put(PollTable.OPTIONS, buf.toString());
db.insertWithOnConflict(PollTable.NAME, "", column, SQLiteDatabase.CONFLICT_REPLACE);
}

View File

@ -71,7 +71,7 @@ public class DatabasePoll implements Poll, PollTable {
@Override
public long expirationTime() {
public long getEndTime() {
return expired;
}
@ -104,7 +104,7 @@ public class DatabasePoll implements Poll, PollTable {
optionsBuf.append(option).append(',');
optionsBuf.deleteCharAt(optionsBuf.length() - 1).append(')');
}
return "id=" + getId() + " expired=" + expirationTime() + optionsBuf;
return "id=" + getId() + " expired=" + getEndTime() + optionsBuf;
}
/**

View File

@ -32,7 +32,7 @@ public interface Poll extends Serializable {
/**
* @return time where the poll expires
*/
long expirationTime();
long getEndTime();
/**
* @return total number of votes

View File

@ -70,6 +70,7 @@ import org.nuclearfog.twidda.backend.image.PicassoBuilder;
import org.nuclearfog.twidda.backend.utils.LinkUtils;
import org.nuclearfog.twidda.backend.utils.StringUtils;
import org.nuclearfog.twidda.backend.utils.EmojiUtils;
import org.nuclearfog.twidda.config.Configuration;
import org.nuclearfog.twidda.config.GlobalSettings;
import org.nuclearfog.twidda.model.Relation;
import org.nuclearfog.twidda.model.User;
@ -734,9 +735,12 @@ public class ProfileActivity extends AppCompatActivity implements ActivityResult
tabSelector.setLabel(1, "");
}
if (user_createdAt.getVisibility() != VISIBLE) {
String date = SimpleDateFormat.getDateTimeInstance().format(user.getTimestamp());
user_createdAt.setVisibility(VISIBLE);
user_createdAt.setText(date);
if (settings.getLogin().getConfiguration() == Configuration.MASTODON) {
user_createdAt.setText(SimpleDateFormat.getDateInstance().format(user.getTimestamp()));
} else {
user_createdAt.setText(SimpleDateFormat.getDateTimeInstance().format(user.getTimestamp()));
}
}
if (!user.getDescription().isEmpty()) {
descriptionSpan = Tagger.makeTextWithLinks(user.getDescription(), settings.getHighlightColor(), this);

View File

@ -1,5 +1,6 @@
package org.nuclearfog.twidda.ui.adapter.holder;
import android.content.res.Resources;
import android.graphics.Typeface;
import android.graphics.drawable.ColorDrawable;
import android.text.SpannableString;
@ -52,7 +53,9 @@ public class CardHolder extends ViewHolder implements OnClickListener {
private GlobalSettings settings;
private OnHolderClickListener listener;
/**
*
*/
public CardHolder(ViewGroup parent, GlobalSettings settings, Picasso picasso, OnHolderClickListener listener) {
super(LayoutInflater.from(parent.getContext()).inflate(R.layout.item_card, parent, false));
linkText = itemView.findViewById(R.id.link_preview_text);
@ -61,7 +64,7 @@ public class CardHolder extends ViewHolder implements OnClickListener {
this.settings = settings;
this.listener = listener;
itemView.getLayoutParams().width = parent.getMeasuredHeight() * 16 / 9;
itemView.getLayoutParams().width = Resources.getSystem().getDisplayMetrics().widthPixels * 2 / 3;
linkText.setTypeface(settings.getTypeFace());
linkText.setTextColor(settings.getTextColor());
linkText.setBackgroundColor(settings.getBackgroundColor() & TEXT_TRANSPARENCY);

View File

@ -1,5 +1,6 @@
package org.nuclearfog.twidda.ui.adapter.holder;
import android.content.res.Resources;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
@ -25,7 +26,7 @@ import org.nuclearfog.twidda.ui.adapter.OptionsAdapter;
*/
public class PollHolder extends ViewHolder implements OnClickListener {
private TextView votesCount;
private TextView votesCount, expiration;
private Button voteButton;
private OptionsAdapter adapter;
@ -40,13 +41,16 @@ public class PollHolder extends ViewHolder implements OnClickListener {
RecyclerView optionsList = itemView.findViewById(R.id.item_poll_options_list);
voteButton = itemView.findViewById(R.id.item_poll_vote_button);
votesCount = itemView.findViewById(R.id.item_poll_votes_count);
expiration = itemView.findViewById(R.id.item_poll_expiration);
adapter = new OptionsAdapter(settings);
this.listener = listener;
cardBackground.setCardBackgroundColor(settings.getCardColor());
votesCount.setTextColor(settings.getTextColor());
votesCount.setTypeface(settings.getTypeFace());
itemView.getLayoutParams().width = parent.getMeasuredHeight() * 2; // 2:1 ratio
expiration.setTextColor(settings.getTextColor());
expiration.setTypeface(settings.getTypeFace());
itemView.getLayoutParams().width = Resources.getSystem().getDisplayMetrics().widthPixels * 2 / 3;
optionsList.setAdapter(adapter);
optionsList.setItemAnimator(null); // disable animation
@ -75,12 +79,14 @@ public class PollHolder extends ViewHolder implements OnClickListener {
*/
public void setContent(Poll poll) {
if (poll.closed()) {
votesCount.setText(R.string.poll_finished);
votesCount.setText(R.string.poll_total_votes);
expiration.setText(R.string.poll_finished);
voteButton.setVisibility(View.GONE);
} else {
votesCount.setText(R.string.poll_total_votes);
expiration.setText(StringUtils.formatExpirationTime(expiration.getResources(), poll.getEndTime()));
if (poll.voted()) {
voteButton.setVisibility(View.GONE);
voteButton.setVisibility(View.INVISIBLE);
} else if (poll.getLimit() > 0) {
voteButton.setVisibility(View.VISIBLE);
}

View File

@ -42,16 +42,6 @@ public class ConfirmDialog extends Dialog implements OnClickListener {
*/
public static final int REMOVE_ACCOUNT = 604;
/**
* show "proxy bypass" dialog
*/
public static final int PROXY_CONFIRM = 605;
/**
* show "video error" dialog
*/
public static final int VIDEO_ERROR = 606;
/**
* show dialog to delete status
*/
@ -216,14 +206,6 @@ public class ConfirmDialog extends Dialog implements OnClickListener {
messageRes = R.string.confirm_log_lout;
break;
case VIDEO_ERROR:
titleVis = View.VISIBLE;
messageRes = R.string.error_cant_load_video;
confirmIconRes = 0;
confirmRes = R.string.confirm_open_link;
cancelVis = View.GONE;
break;
case LIST_EDITOR_LEAVE:
case PROFILE_EDITOR_LEAVE:
messageRes = R.string.confirm_discard;
@ -281,12 +263,6 @@ public class ConfirmDialog extends Dialog implements OnClickListener {
case REMOVE_ACCOUNT:
messageRes = R.string.confirm_remove_account;
break;
case PROXY_CONFIRM:
titleVis = View.VISIBLE;
titleRes = R.string.dialog_confirm_warning;
messageRes = R.string.dialog_warning_videoview;
break;
}
// setup title
title.setVisibility(titleVis);

View File

@ -27,14 +27,11 @@ import org.nuclearfog.twidda.ui.activities.ImageViewer;
import org.nuclearfog.twidda.ui.activities.MessageEditor;
import org.nuclearfog.twidda.ui.activities.ProfileActivity;
import org.nuclearfog.twidda.ui.activities.SearchActivity;
import org.nuclearfog.twidda.ui.activities.StatusActivity;
import org.nuclearfog.twidda.ui.adapter.MessageAdapter;
import org.nuclearfog.twidda.ui.adapter.MessageAdapter.OnMessageClickListener;
import org.nuclearfog.twidda.ui.dialogs.ConfirmDialog;
import org.nuclearfog.twidda.ui.dialogs.ConfirmDialog.OnConfirmListener;
import java.util.List;
/**
* Fragment class to show a list of directmessages
*

View File

@ -32,6 +32,14 @@
android:lines="1"
android:layout_weight="1" />
<TextView
android:id="@+id/item_poll_expiration"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:textSize="@dimen/item_poll_text_size"
android:lines="1"
android:layout_weight="1" />
<Button
android:id="@+id/item_poll_vote_button"
android:layout_width="0dp"

View File

@ -1,29 +1,54 @@
<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<plurals name="n_seconds">
<plurals name="seconds_ago">
<item quantity="one">vor <xliff:g id="count">%d</xliff:g> Sek.</item>
<item quantity="other">vor <xliff:g id="count">%d</xliff:g> Sek.</item>
</plurals>
<plurals name="n_minutes">
<plurals name="minutes_ago">
<item quantity="one">vor <xliff:g id="count">%d</xliff:g> Min.</item>
<item quantity="other">vor <xliff:g id="count">%d</xliff:g> Min.</item>
</plurals>
<plurals name="n_hours">
<plurals name="hours_ago">
<item quantity="one">vor <xliff:g id="count">%d</xliff:g> Std.</item>
<item quantity="other">vor <xliff:g id="count">%d</xliff:g> Std.</item>
</plurals>
<plurals name="n_days">
<plurals name="days_ago">
<item quantity="one">vor <xliff:g id="count">%d</xliff:g> Tag</item>
<item quantity="other">vor <xliff:g id="count">%d</xliff:g> Tagen</item>
</plurals>
<plurals name="n_weeks">
<plurals name="weeks_ago">
<item quantity="one">vor <xliff:g id="count">%d</xliff:g> Woche</item>
<item quantity="other">vor <xliff:g id="count">%d</xliff:g> Wochen</item>
</plurals>
<plurals name="seconds_remain">
<item quantity="one">noch <xliff:g id="count">%d</xliff:g> Sekunde</item>
<item quantity="other">noch <xliff:g id="count">%d</xliff:g> Sekunden</item>
</plurals>
<plurals name="minutes_remain">
<item quantity="one">noch <xliff:g id="count">%d</xliff:g> Minute</item>
<item quantity="other">noch <xliff:g id="count">%d</xliff:g> Minuten</item>
</plurals>
<plurals name="hours_remain">
<item quantity="one">noch <xliff:g id="count">%d</xliff:g> Stunde</item>
<item quantity="other">noch <xliff:g id="count">%d</xliff:g> Stunden</item>
</plurals>
<plurals name="days_remain">
<item quantity="one">noch <xliff:g id="count">%d</xliff:g> Tag</item>
<item quantity="other">noch <xliff:g id="count">%d</xliff:g> Tage</item>
</plurals>
<plurals name="weeks_remain">
<item quantity="one">noch <xliff:g id="count">%d</xliff:g> Woche</item>
<item quantity="other">noch <xliff:g id="count">%d</xliff:g> Wochen</item>
</plurals>
</resources>

View File

@ -1,29 +1,54 @@
<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<plurals name="n_seconds">
<plurals name="seconds_ago">
<item quantity="one"><xliff:g id="count">%d</xliff:g> second ago</item>
<item quantity="other"><xliff:g id="count">%d</xliff:g> seconds ago</item>
</plurals>
<plurals name="n_minutes">
<plurals name="minutes_ago">
<item quantity="one"><xliff:g id="count">%d</xliff:g> minute ago</item>
<item quantity="other"><xliff:g id="count">%d</xliff:g> minutes ago</item>
</plurals>
<plurals name="n_hours">
<plurals name="hours_ago">
<item quantity="one"><xliff:g id="count">%d</xliff:g> hour ago</item>
<item quantity="other"><xliff:g id="count">%d</xliff:g> hours ago</item>
</plurals>
<plurals name="n_days">
<plurals name="days_ago">
<item quantity="one"><xliff:g id="count">%d</xliff:g> day ago</item>
<item quantity="other"><xliff:g id="count">%d</xliff:g> days ago</item>
</plurals>
<plurals name="n_weeks">
<plurals name="weeks_ago">
<item quantity="one"><xliff:g id="count">%d</xliff:g> week ago</item>
<item quantity="other"><xliff:g id="count">%d</xliff:g> weeks ago</item>
</plurals>
<plurals name="seconds_remain">
<item quantity="one"><xliff:g id="count">%d</xliff:g> second remains</item>
<item quantity="other"><xliff:g id="count">%d</xliff:g> seconds remain</item>
</plurals>
<plurals name="minutes_remain">
<item quantity="one"><xliff:g id="count">%d</xliff:g> minute remains</item>
<item quantity="other"><xliff:g id="count">%d</xliff:g> minutes remain</item>
</plurals>
<plurals name="hours_remain">
<item quantity="one"><xliff:g id="count">%d</xliff:g> hour remains</item>
<item quantity="other"><xliff:g id="count">%d</xliff:g> hours remain</item>
</plurals>
<plurals name="days_remain">
<item quantity="one"><xliff:g id="count">%d</xliff:g> day remains</item>
<item quantity="other"><xliff:g id="count">%d</xliff:g> days remain</item>
</plurals>
<plurals name="weeks_remain">
<item quantity="one"><xliff:g id="count">%d</xliff:g> week remains</item>
<item quantity="other"><xliff:g id="count">%d</xliff:g> weeks remain</item>
</plurals>
</resources>