es.usc.citius.servando.calendula.activities.SummaryCalendarActivity.java Source code

Java tutorial

Introduction

Here is the source code for es.usc.citius.servando.calendula.activities.SummaryCalendarActivity.java

Source

/*
 *    Calendula - An assistant for personal medication management.
 *    Copyright (C) 2016 CITIUS - USC
 *
 *    Calendula 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 software.  If not, see <http://www.gnu.org/licenses/>.
 */

package es.usc.citius.servando.calendula.activities;

import android.graphics.Color;
import android.graphics.drawable.GradientDrawable;
import android.graphics.drawable.StateListDrawable;
import android.os.Build;
import android.os.Bundle;
import android.view.MenuItem;

import com.google.ical.values.DateValue;
import com.squareup.timessquare.CalendarCellDecorator;
import com.squareup.timessquare.CalendarCellView;
import com.squareup.timessquare.CalendarPickerView;

import org.joda.time.DateTime;
import org.joda.time.LocalDate;
import org.joda.time.format.DateTimeFormat;
import org.joda.time.format.DateTimeFormatter;

import java.util.ArrayList;
import java.util.Date;
import java.util.HashSet;
import java.util.List;
import java.util.Set;

import es.usc.citius.servando.calendula.CalendulaActivity;
import es.usc.citius.servando.calendula.R;
import es.usc.citius.servando.calendula.database.DB;
import es.usc.citius.servando.calendula.persistence.RepetitionRule;
import es.usc.citius.servando.calendula.util.ScheduleHelper;

public class SummaryCalendarActivity extends CalendulaActivity {

    public static final String START_DATE_FORMAT = "dd-MM-yyyy";
    DateTimeFormatter fmt = DateTimeFormat.forPattern(START_DATE_FORMAT);
    CalendarPickerView calendar;
    int color;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        color = DB.patients().getActive(this).color();
        setContentView(R.layout.activity_summary_calendar);
        int color = DB.patients().getActive(this).color();
        setupToolbar(getString(R.string.title_activity_calendar), color);
        setupStatusBar(color);
        setupCalendar();
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        switch (item.getItemId()) {
        default:
            finish();
            return true;
        }
    }

    private void setupCalendar() {

        calendar = (CalendarPickerView) findViewById(R.id.calendar_view);
        calendar.setVerticalScrollBarEnabled(false);

        RepetitionRule r;
        String rule = getIntent().getStringExtra("rule");
        String date = getIntent().getStringExtra("start");

        int activeDays = getIntent().getIntExtra("active_days", -1);
        int restDays = getIntent().getIntExtra("rest_days", -1);

        LocalDate from = date != null ? LocalDate.parse(date, fmt) : LocalDate.now();
        LocalDate to = from.plusMonths(6);

        if (rule != null) {
            r = new RepetitionRule(rule);
            List<DateTime> dates = r.occurrencesBetween(from.toDateTimeAtStartOfDay(), to.toDateTimeAtStartOfDay(),
                    from.toDateTimeAtStartOfDay());
            Set<Date> hdates = new HashSet<>();
            for (DateTime d : dates)
                hdates.add(d.toDate());

            List<CalendarCellDecorator> decorators = new ArrayList<>();

            DateValue v = r.iCalRule().getUntil();
            Date start = date != null ? from.toDate() : null;
            Date end = v != null ? new LocalDate(v.year(), v.month(), v.day()).toDate() : null;

            decorators.add(new HighlightDecorator(new ArrayList<>(hdates), start, end, color));
            calendar.setDecorators(decorators);
        } else if (activeDays > 0 && restDays > 0) {

            List<Date> hdates = new ArrayList<>();

            LocalDate d = from.plusDays(0); // copy

            while (d.isBefore(to)) {
                if (ScheduleHelper.cycleEnabledForDate(d, from, activeDays, restDays)) {
                    hdates.add(d.toDate());
                }
                d = d.plusDays(1);
            }

            List<CalendarCellDecorator> decorators = new ArrayList<>();
            //DateValue v = r.iCalRule().getUntil();
            //Date start = date != null ? from.toDate() : null;
            //Date end = v != null ? new LocalDate(v.year(), v.month(), v.day()).toDate() : null;
            decorators.add(new HighlightDecorator(hdates, from.toDate(), to.toDate(), color));
            calendar.setDecorators(decorators);
        }

        calendar.init(from.toDate(), to.toDate())
                .setShortWeekdays(getResources().getStringArray(R.array.calendar_weekday_names));
    }

    private void updateStatusBarColor() {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
            getWindow().setStatusBarColor(getResources().getColor(R.color.dark_grey_home));
        }
    }

    private static class HighlightDecorator implements CalendarCellDecorator {

        Date today = LocalDate.now().toDateTimeAtStartOfDay().toDate();

        List<Date> days;
        Date start;
        Date end;
        int color;

        public HighlightDecorator(List<Date> days, Date start, Date end, int color) {
            this.color = color;
            this.days = days;
            this.start = start;
            this.end = end;
        }

        @Override
        public void decorate(final CalendarCellView cellView, Date date) {

            boolean highlight = days.contains(date);

            if (highlight && cellView.isCurrentMonth()) {
                cellView.setBackgroundResource(R.drawable.summary_calendar_day_hightlighted);
                cellView.setTextAppearance(cellView.getContext(), R.style.calendar_day_highlighted);
                StateListDrawable sld = (StateListDrawable) cellView.getBackground();
                GradientDrawable shape = (GradientDrawable) sld.getCurrent();
                shape.setColor(Color.parseColor("#dadada"));

            } else if (!cellView.isEnabled()) {
                cellView.setBackgroundResource(R.color.white);
                cellView.setTextAppearance(cellView.getContext(), R.style.calendar_day_disabled);
            } else if (date.equals(today)) {
                cellView.setBackgroundResource(R.drawable.calendar_today_selector);
                cellView.setTextAppearance(cellView.getContext(), R.style.calendar_day_today);
            } else {
                cellView.setBackgroundResource(R.color.white);
                cellView.setTextAppearance(cellView.getContext(), R.style.calendar_day);
            }

            if (cellView.isCurrentMonth()) {
                if (date.equals(start)) {
                    //cellView.setBackgroundColor(Color.parseColor("#bebebe"));
                    cellView.setTextAppearance(cellView.getContext(), R.style.calendar_day_today);
                    cellView.setText("[ " + cellView.getText());
                } else if (date.equals(end)) {
                    //cellView.setBackgroundColor(Color.parseColor("#bebebe"));
                    cellView.setText(cellView.getText() + " ]");
                    cellView.setTextAppearance(cellView.getContext(), R.style.calendar_day_today);
                }
            }
        }
    }
}