damo.three.ie.prepayusage.BasicUsageItemsGrouped.java Source code

Java tutorial

Introduction

Here is the source code for damo.three.ie.prepayusage.BasicUsageItemsGrouped.java

Source

/*
 * This file is part of Prepay Credit for Android
 *
 * Copyright  2013  Damien O'Reilly
 *
 * Prepay Credit for Android 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.
 *
 * Prepay Credit for Android 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 Prepay Credit for Android.  If not, see <http://www.gnu.org/licenses/>.
 *
 * Report bugs or new features at: https://github.com/DamienOReilly/PrepayCredit
 * Contact the author at:          damienreilly@gmail.com
 */

package damo.three.ie.prepayusage;

import damo.three.ie.util.DateUtils;
import org.joda.time.DateTime;
import org.joda.time.Days;
import org.ocpsoft.prettytime.PrettyTime;

import java.util.List;

/**
 * Class deals with encapsulating a similar group of usage items and adding meta data.
 */
public class BasicUsageItemsGrouped implements Comparable<BasicUsageItemsGrouped> {

    private final List<BasicUsageItem> basicUsageItems;
    private final DateTime dateTimeNow;
    private String expireGroup;
    private ExpireGroupType expireGroupType;
    private DateTime groupDateTime;

    /**
     * Constructor taking in list of basic usage items.
     *
     * @param basicUsageItems List of basic usage items.
     */
    public BasicUsageItemsGrouped(List<BasicUsageItem> basicUsageItems) {
        this.basicUsageItems = basicUsageItems;
        dateTimeNow = new DateTime();
        updateGroupName();
    }

    /**
     * Add some meta-data to the usage groups.
     */
    private void updateGroupName() {
        long date = basicUsageItems.get(0).getExpireDate();
        if (date == DateUtils.WONT_EXPIRE) {
            expireGroup = "Won't expire";
            expireGroupType = ExpireGroupType.GOOD;
            groupDateTime = new DateTime(DateUtils.WONT_EXPIRE);
        } else if (date == DateUtils.QUEUED) {
            expireGroup = "Queued";
            expireGroupType = ExpireGroupType.GOOD;
            groupDateTime = new DateTime(DateUtils.QUEUED);
        } else {
            // Falling down this far.. must be a date so!
            groupDateTime = new DateTime(date);
            int daysRemaining = Days.daysBetween(dateTimeNow.withTimeAtStartOfDay(), getAbsoluteExpireyDateTime())
                    .getDays() - 1;

            if (daysRemaining > 5) {
                expireGroupType = ExpireGroupType.GOOD;
            } else if (daysRemaining >= 3 && daysRemaining <= 5) {
                expireGroupType = ExpireGroupType.WARNING;
            } else {
                expireGroupType = ExpireGroupType.BAD;
            }

            expireGroup = "Expires: " + DateUtils.formatDate(date);
            expireGroup += " (" + new PrettyTime().format(getAbsoluteExpireyDateTime().toDate()) + ")";
        }
    }

    /**
     * Get the group expire description.
     *
     * @return Expire description.
     */
    public String getExpireGroup() {
        //TODO: update ExpireGroupType to include the descriptive strings.
        return expireGroup;
    }

    /**
     * Return usage items in this group.
     *
     * @return List of usage items.
     */
    public List<BasicUsageItem> getBasicUsageItems() {
        return basicUsageItems;
    }

    /**
     * Return group expire type, e.g. expiring on a date or doesn't expire.
     *
     * @return Expire type.
     */
    public ExpireGroupType getExpireGroupType() {
        return expireGroupType;
    }

    /**
     * Compare the UsageItemsGrouped based on date expiring, if any.
     *
     * @param that To compare against/
     * @return Compare result.
     */
    @Override
    public int compareTo(BasicUsageItemsGrouped that) {
        return this.getGroupDateTime().compareTo(that.getGroupDateTime());
    }

    /**
     * The add-on in fact expires at midnight on the following day.
     * e.g. an add-on expiring on 23rd August really expires on 24th August at 00:00:00
     * day lights savings is took into consideration. 00:00:00 may not exist twice a year in some TZ's.
     *
     * @return {@link DateTime} of when the UsageGroup exactly expires
     */
    private DateTime getAbsoluteExpireyDateTime() {
        return groupDateTime.plusDays(1).withTimeAtStartOfDay();
    }

    /**
     * Returns whether this UsageGroup is actually no longer relevant based on the current date.
     * i.e expired!
     *
     * @return boolean
     */
    public boolean isNotExpired() {
        DateTime now = new DateTime().withTimeAtStartOfDay();
        return getAbsoluteExpireyDateTime().compareTo(now) > 0;
    }

    /**
     * Get the group's expire time.
     *
     * @return Expire time.
     */
    DateTime getGroupDateTime() {
        return groupDateTime;
    }
}