/*
* Copyright (C) 2012-2016 The Android Money Manager Ex Project Team
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 3
* of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package com.money.manager.ex.utils;
import android.content.Context;
import android.text.TextUtils;
import android.widget.DatePicker;
import com.money.manager.ex.Constants;
import com.money.manager.ex.MoneyManagerApplication;
import com.money.manager.ex.R;
import com.money.manager.ex.core.DateRange;
import com.money.manager.ex.core.InfoKeys;
import com.money.manager.ex.servicelayer.InfoService;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.Locale;
import javax.inject.Inject;
import timber.log.Timber;
/**
* Date/time utilities using Java standard Date classes.
* Format patterns:
* https://docs.oracle.com/javase/7/docs/api/java/text/SimpleDateFormat.html
*/
public class MmxDateTimeUtils {
private Locale _locale = Locale.ENGLISH;
@Inject
public MmxDateTimeUtils() {
}
public MmxDateTimeUtils(Locale locale) {
_locale = locale;
}
public Date from(int year, int monthOfYear, int dayOfMonth) {
return new MmxDate(year, monthOfYear, dayOfMonth).toDate();
}
public Date from(DatePicker datePicker) {
int day = datePicker.getDayOfMonth();
int month = datePicker.getMonth();
int year = datePicker.getYear();
return new MmxDate(year, month, day).toDate();
}
public String format(Date date, String format) {
return getFormatterFor(format).format(date);
}
/**
*
* @param resourceId String Id for name of the period.
* @return Date range that matches the period selected.
*/
public DateRange getDateRangeForPeriod(Context context, int resourceId) {
String value = context.getString(resourceId);
return getDateRangeForPeriod(context, value);
}
/**
* Creates a date range from the period name. Used when selecting a date range from the
* localized menus.
* @param period Period name in local language.
* @return Date Range object.
*/
public DateRange getDateRangeForPeriod(Context context, String period) {
if (TextUtils.isEmpty(period)) return null;
MmxDate dateFrom = new MmxDate();
MmxDate dateTo = new MmxDate();
// we ignore the minutes at the moment, since the field in the db only stores the date value.
if (period.equalsIgnoreCase(context.getString(R.string.all_transaction)) ||
period.equalsIgnoreCase(context.getString(R.string.all_time))) {
// All transactions.
dateFrom = dateFrom.today().minusYears(1000);
dateTo = dateTo.today().plusYears(1000);
} else if (period.equalsIgnoreCase(context.getString(R.string.today))) {
dateFrom = dateFrom.today();
dateTo = dateTo.today();
} else if (period.equalsIgnoreCase(context.getString(R.string.last7days))) {
dateFrom = dateFrom.today().minusDays(7);
dateTo = dateTo.today();
} else if (period.equalsIgnoreCase(context.getString(R.string.last15days))) {
dateFrom = dateFrom.today().minusDays(14);
dateTo = dateTo.today();
} else if (period.equalsIgnoreCase(context.getString(R.string.current_month))) {
dateFrom = dateFrom.today().firstDayOfMonth();
dateTo = dateTo.today().lastDayOfMonth();
} else if (period.equalsIgnoreCase(context.getString(R.string.last30days))) {
dateFrom = dateFrom.today().minusDays(30);
dateTo = dateTo.today();
} else if (period.equalsIgnoreCase(context.getString(R.string.last3months))) {
dateFrom = dateFrom.today().minusMonths(3)
.firstDayOfMonth();
dateTo = dateTo.today();
} else if (period.equalsIgnoreCase(context.getString(R.string.last6months))) {
dateFrom = dateFrom.today().minusMonths(6)
.firstDayOfMonth();
dateTo = dateTo.today();
} else if (period.equalsIgnoreCase(context.getString(R.string.current_year))) {
dateFrom = dateFrom.today().firstMonthOfYear()
.firstDayOfMonth();
dateTo = dateTo.today().lastMonthOfYear()
.lastDayOfMonth();
} else if (period.equalsIgnoreCase(context.getString(R.string.future_transactions))) {
// Future transactions
dateFrom = dateFrom.today().plusDays(1);
dateTo = dateTo.today().plusYears(1000);
} else {
dateFrom = null;
dateTo = null;
}
DateRange result = new DateRange(dateFrom.toDate(), dateTo.toDate());
return result;
}
public String getDateStringFrom(Date dateTime, String pattern) {
SimpleDateFormat format = getFormatterFor(pattern);
// DateTimeFormatter format = DateTimeFormat.forPattern(pattern);
// String result = format.print(dateTime);
return format.format(dateTime);
// return result;
}
public int getFirstDayOfWeek() {
Locale appLocale = MoneyManagerApplication.getApp().getAppLocale();
Calendar cal = Calendar.getInstance(appLocale);
return cal.getFirstDayOfWeek();
}
/**
* Get pattern defined by the user.
* @return pattern user define
*/
public String getUserDatePattern(Context context) {
InfoService service = new InfoService(context);
String pattern = service.getInfoValue(InfoKeys.DATEFORMAT);
if (!TextUtils.isEmpty(pattern)) {
//replace part of pattern
pattern = pattern.replace("%d", "dd").replace("%m", "MM")
.replace("%y", "yy").replace("%Y", "yyyy")
.replace("'", "''");
}
// && getContext().getResources().getStringArray(R.array.date_format_mask) != null
String[] dateFormats = context.getResources().getStringArray(R.array.date_format_mask);
if (TextUtils.isEmpty(pattern) && dateFormats.length > 0){
pattern = dateFormats[0];
pattern = pattern.replace("%d", "dd").replace("%m", "MM")
.replace("%y", "yy").replace("%Y", "yyyy")
.replace("'", "''");
}
return pattern;
}
public String getUserFormattedDate(Context context, Date date) {
if (date == null) return "";
MmxDate dateTime = new MmxDate(date);
String userDatePattern = new MmxDateTimeUtils().getUserDatePattern(context);
return dateTime.toString(userDatePattern);
}
public Date now() {
return new MmxDate().toDate();
}
public void setDatePicker(Date date, DatePicker datePicker) {
MmxDate dateTime = new MmxDate(date);
datePicker.updateDate(dateTime.getYear(), dateTime.getMonthOfYear(), dateTime.getDayOfMonth());
}
/*
Private
*/
private SimpleDateFormat getFormatterFor(String format) {
return new SimpleDateFormat(format, _locale);
}
}