Show expiration time exactly as set instead of rounding.

This commit is contained in:
Cody Henthorne
2020-07-16 15:51:30 -04:00
committed by Greyson Parrelli
parent 4482391574
commit 70977e5228
6 changed files with 276 additions and 51 deletions

View File

@@ -1,14 +1,17 @@
package org.thoughtcrime.securesms;
import android.content.Context;
import androidx.annotation.NonNull;
import androidx.appcompat.app.AlertDialog;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.appcompat.app.AlertDialog;
import org.thoughtcrime.securesms.util.ExpirationUtil;
import java.util.Arrays;
import cn.carbswang.android.numberpickerview.library.NumberPickerView;
public class ExpirationDialog extends AlertDialog {
@@ -36,7 +39,7 @@ public class ExpirationDialog extends AlertDialog {
builder.setView(view);
builder.setPositiveButton(android.R.string.ok, (dialog, which) -> {
int selected = ((NumberPickerView)view.findViewById(R.id.expiration_number_picker)).getValue();
listener.onClick(context.getResources().getIntArray(R.array.expiration_times)[selected]);
listener.onClick(getExpirationTimes(context, currentExpiration)[selected]);
});
builder.setNegativeButton(android.R.string.cancel, null);
builder.show();
@@ -47,7 +50,7 @@ public class ExpirationDialog extends AlertDialog {
final View view = inflater.inflate(R.layout.expiration_dialog, null);
final NumberPickerView numberPickerView = view.findViewById(R.id.expiration_number_picker);
final TextView textView = view.findViewById(R.id.expiration_details);
final int[] expirationTimes = context.getResources().getIntArray(R.array.expiration_times);
final int[] expirationTimes = getExpirationTimes(context, currentExpiration);
final String[] expirationDisplayValues = new String[expirationTimes.length];
int selectedIndex = expirationTimes.length - 1;
@@ -80,6 +83,19 @@ public class ExpirationDialog extends AlertDialog {
return view;
}
private static int[] getExpirationTimes(Context context, int currentExpiration) {
int[] expirationTimes = context.getResources().getIntArray(R.array.expiration_times);
int location = Arrays.binarySearch(expirationTimes, currentExpiration);
if (location < 0) {
int[] temp = Arrays.copyOf(expirationTimes, expirationTimes.length + 1);
temp[temp.length - 1] = currentExpiration;
Arrays.sort(temp);
expirationTimes = temp;
}
return expirationTimes;
}
public interface OnClickListener {
public void onClick(int expirationTime);
}

View File

@@ -2,49 +2,101 @@ package org.thoughtcrime.securesms.util;
import android.content.Context;
import androidx.annotation.PluralsRes;
import androidx.annotation.StringRes;
import org.thoughtcrime.securesms.R;
import java.util.concurrent.TimeUnit;
public class ExpirationUtil {
public final class ExpirationUtil {
private static final int SECONDS_IN_WEEK = (int) TimeUnit.DAYS.toSeconds(7);
private static final int SECONDS_IN_DAY = (int) TimeUnit.DAYS.toSeconds(1);
private static final int SECONDS_IN_HOUR = (int) TimeUnit.HOURS.toSeconds(1);
private static final int SECONDS_IN_MINUTE = (int) TimeUnit.MINUTES.toSeconds(1);
public static String getExpirationDisplayValue(Context context, int expirationTime) {
if (expirationTime <= 0) {
return context.getString(R.string.expiration_off);
} else if (expirationTime < TimeUnit.MINUTES.toSeconds(1)) {
return context.getResources().getQuantityString(R.plurals.expiration_seconds, expirationTime, expirationTime);
} else if (expirationTime < TimeUnit.HOURS.toSeconds(1)) {
int minutes = expirationTime / (int)TimeUnit.MINUTES.toSeconds(1);
return context.getResources().getQuantityString(R.plurals.expiration_minutes, minutes, minutes);
} else if (expirationTime < TimeUnit.DAYS.toSeconds(1)) {
int hours = expirationTime / (int)TimeUnit.HOURS.toSeconds(1);
return context.getResources().getQuantityString(R.plurals.expiration_hours, hours, hours);
} else if (expirationTime < TimeUnit.DAYS.toSeconds(7)) {
int days = expirationTime / (int)TimeUnit.DAYS.toSeconds(1);
return context.getResources().getQuantityString(R.plurals.expiration_days, days, days);
} else {
int weeks = expirationTime / (int)TimeUnit.DAYS.toSeconds(7);
return context.getResources().getQuantityString(R.plurals.expiration_weeks, weeks, weeks);
}
String displayValue = "";
int secondsRemaining = expirationTime;
int weeks = secondsRemaining / SECONDS_IN_WEEK;
displayValue = getDisplayValue(context, displayValue, R.plurals.expiration_weeks, weeks);
secondsRemaining = secondsRemaining - weeks * SECONDS_IN_WEEK;
int days = secondsRemaining / SECONDS_IN_DAY;
displayValue = getDisplayValue(context, displayValue, R.plurals.expiration_days, days);
secondsRemaining = secondsRemaining - days * SECONDS_IN_DAY;
int hours = secondsRemaining / SECONDS_IN_HOUR;
displayValue = getDisplayValue(context, displayValue, R.plurals.expiration_hours, hours);
secondsRemaining = secondsRemaining - hours * SECONDS_IN_HOUR;
int minutes = secondsRemaining / SECONDS_IN_MINUTE;
displayValue = getDisplayValue(context, displayValue, R.plurals.expiration_minutes, minutes);
secondsRemaining = secondsRemaining - minutes * SECONDS_IN_MINUTE;
displayValue = getDisplayValue(context, displayValue, R.plurals.expiration_seconds, secondsRemaining);
return displayValue;
}
private static String getDisplayValue(Context context, String currentValue, @PluralsRes int plurals, int duration) {
if (duration > 0) {
String durationString = context.getResources().getQuantityString(plurals, duration, duration);
if (currentValue.isEmpty()) {
return durationString;
} else {
return context.getString(R.string.expiration_combined, currentValue, durationString);
}
}
return currentValue;
}
public static String getExpirationAbbreviatedDisplayValue(Context context, int expirationTime) {
if (expirationTime < TimeUnit.MINUTES.toSeconds(1)) {
return context.getResources().getString(R.string.expiration_seconds_abbreviated, expirationTime);
} else if (expirationTime < TimeUnit.HOURS.toSeconds(1)) {
int minutes = expirationTime / (int)TimeUnit.MINUTES.toSeconds(1);
return context.getResources().getString(R.string.expiration_minutes_abbreviated, minutes);
} else if (expirationTime < TimeUnit.DAYS.toSeconds(1)) {
int hours = expirationTime / (int)TimeUnit.HOURS.toSeconds(1);
return context.getResources().getString(R.string.expiration_hours_abbreviated, hours);
} else if (expirationTime < TimeUnit.DAYS.toSeconds(7)) {
int days = expirationTime / (int)TimeUnit.DAYS.toSeconds(1);
return context.getResources().getString(R.string.expiration_days_abbreviated, days);
} else {
int weeks = expirationTime / (int)TimeUnit.DAYS.toSeconds(7);
return context.getResources().getString(R.string.expiration_weeks_abbreviated, weeks);
if (expirationTime <= 0) {
return context.getString(R.string.expiration_off);
}
String displayValue = "";
int secondsRemaining = expirationTime;
int weeks = secondsRemaining / SECONDS_IN_WEEK;
displayValue = getAbbreviatedDisplayValue(context, displayValue, R.string.expiration_weeks_abbreviated, weeks);
secondsRemaining = secondsRemaining - weeks * SECONDS_IN_WEEK;
int days = secondsRemaining / SECONDS_IN_DAY;
displayValue = getAbbreviatedDisplayValue(context, displayValue, R.string.expiration_days_abbreviated, days);
secondsRemaining = secondsRemaining - days * SECONDS_IN_DAY;
int hours = secondsRemaining / SECONDS_IN_HOUR;
displayValue = getAbbreviatedDisplayValue(context, displayValue, R.string.expiration_hours_abbreviated, hours);
secondsRemaining = secondsRemaining - hours * SECONDS_IN_HOUR;
int minutes = secondsRemaining / SECONDS_IN_MINUTE;
displayValue = getAbbreviatedDisplayValue(context, displayValue, R.string.expiration_minutes_abbreviated, minutes);
secondsRemaining = secondsRemaining - minutes * SECONDS_IN_MINUTE;
displayValue = getAbbreviatedDisplayValue(context, displayValue, R.string.expiration_seconds_abbreviated, secondsRemaining);
return displayValue;
}
private static String getAbbreviatedDisplayValue(Context context, String currentValue, @StringRes int abbreviation, int duration) {
if (duration > 0) {
String durationString = context.getString(abbreviation, duration);
if (currentValue.isEmpty()) {
return durationString;
} else {
return context.getString(R.string.expiration_combined, currentValue, durationString);
}
}
return currentValue;
}
}