package com.kickstarter.libs.utils;
import android.content.Context;
import android.support.annotation.NonNull;
import android.view.View;
import android.widget.Button;
import com.kickstarter.R;
import com.kickstarter.libs.KSString;
import com.kickstarter.models.Project;
import com.kickstarter.models.User;
import org.joda.time.DateTime;
import org.joda.time.Duration;
public final class ProjectUtils {
private ProjectUtils() {}
/**
* Returns time until project reaches deadline along with the unit,
* e.g. `25 minutes`, `8 days`.
*/
public static @NonNull String deadlineCountdown(final @NonNull Project project, final @NonNull Context context) {
return new StringBuilder().append(deadlineCountdownValue(project))
.append(" ")
.append(deadlineCountdownUnit(project, context))
.toString();
}
/*
* Returns unit of time remaining in a readable string, e.g. `days to go`, `hours to go`.
*/
public static @NonNull String deadlineCountdownDetail(final @NonNull Project project, final @NonNull Context context,
final @NonNull KSString ksString) {
return ksString.format(context.getString(R.string.discovery_baseball_card_time_left_to_go),
"time_left", deadlineCountdownUnit(project, context)
);
}
/**
* Returns the most appropriate unit for the time remaining until the project
* reaches its deadline.
*
* @param context an Android context.
* @return the String unit.
*/
public static @NonNull String deadlineCountdownUnit(final @NonNull Project project, final @NonNull Context context) {
final Long seconds = timeInSecondsUntilDeadline(project);
if (seconds <= 1.0 && seconds > 0.0) {
return context.getString(R.string.discovery_baseball_card_deadline_units_secs);
} else if (seconds <= 120.0) {
return context.getString(R.string.discovery_baseball_card_deadline_units_secs);
} else if (seconds <= 120.0 * 60.0) {
return context.getString(R.string.discovery_baseball_card_deadline_units_mins);
} else if (seconds <= 72.0 * 60.0 * 60.0) {
return context.getString(R.string.discovery_baseball_card_deadline_units_hours);
}
return context.getString(R.string.discovery_baseball_card_deadline_units_days);
}
/**
* Returns time remaining until project reaches deadline in either seconds,
* minutes, hours or days. A time unit is chosen such that the number is
* readable, e.g. 5 minutes would be preferred to 300 seconds.
*
* @return the Integer time remaining.
*/
public static int deadlineCountdownValue(final @NonNull Project project) {
final Long seconds = timeInSecondsUntilDeadline(project);
if (seconds <= 120.0) {
return seconds.intValue(); // seconds
} else if (seconds <= 120.0 * 60.0) {
return (int) Math.floor(seconds / 60.0); // minutes
} else if (seconds < 72.0 * 60.0 * 60.0) {
return (int) Math.floor(seconds / 60.0 / 60.0); // hours
}
return (int) Math.floor(seconds / 60.0 / 60.0 / 24.0); // days
}
/**
* Returns `true` if the project is no longer live, `false` otherwise.
*/
public static boolean isCompleted(final @NonNull Project project) {
final String state = project.state();
return Project.STATE_CANCELED.equals(state) ||
Project.STATE_FAILED.equals(state) ||
Project.STATE_SUCCESSFUL.equals(state) ||
Project.STATE_PURGED.equals(state) ||
Project.STATE_SUSPENDED.equals(state);
}
/**
* Returns 16:9 height relative to input width.
*/
public static int photoHeightFromWidthRatio(final int width) {
return width * 9 / 16;
}
/**
* Set correct button view based on project and backing status.
*/
public static void setActionButton(final @NonNull Project project, final @NonNull Button backProjectButton,
final @NonNull Button managePledgeButton, final @NonNull Button viewPledgeButton) {
if (!project.isBacking() && project.isLive()) {
backProjectButton.setVisibility(View.VISIBLE);
} else {
backProjectButton.setVisibility(View.GONE);
}
if (project.isBacking() && project.isLive()) {
managePledgeButton.setVisibility(View.VISIBLE);
} else {
managePledgeButton.setVisibility(View.GONE);
}
if (project.isBacking() && !project.isLive()) {
viewPledgeButton.setVisibility(View.VISIBLE);
} else {
viewPledgeButton.setVisibility(View.GONE);
}
}
/**
* Returns time until project reaches deadline in seconds, or 0 if the
* project has already finished.
*/
public static @NonNull Long timeInSecondsUntilDeadline(final @NonNull Project project) {
return Math.max(0L,
new Duration(new DateTime(), project.deadline()).getStandardSeconds());
}
public static boolean userIsCreator(final @NonNull Project project, final @NonNull User user) {
return project.creator().id() == user.id();
}
public static boolean isUSUserViewingNonUSProject(final @NonNull String userCountry, final @NonNull String projectCountry) {
return I18nUtils.isCountryUS(userCountry) && !I18nUtils.isCountryUS(projectCountry);
}
}