com.dycody.android.idealnote.utils.date.ReminderPickers.java Source code

Java tutorial

Introduction

Here is the source code for com.dycody.android.idealnote.utils.date.ReminderPickers.java

Source

/*
 * Copyright (C) 2015 Federico Iosue (federico.iosue@gmail.com)
 *
 * 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.dycody.android.idealnote.utils.date;

import android.app.DatePickerDialog.OnDateSetListener;
import android.app.TimePickerDialog.OnTimeSetListener;
import android.os.Bundle;
import android.support.v4.app.DialogFragment;
import android.support.v4.app.FragmentActivity;
import android.widget.DatePicker;

import com.dycody.android.idealnote.models.listeners.OnReminderPickedListener;
import com.dycody.android.idealnote.utils.Constants;
import com.fourmob.datetimepicker.date.DatePickerDialog;
import com.sleepbot.datetimepicker.time.TimePickerDialog;

import java.util.Calendar;

import be.billington.calendar.recurrencepicker.RecurrencePickerDialog;

public class ReminderPickers
        implements OnDateSetListener, OnTimeSetListener, RecurrencePickerDialog.OnRecurrenceSetListener {

    public static final int TYPE_GOOGLE = 0;
    public static final int TYPE_AOSP = 1;

    private FragmentActivity mActivity;
    private OnReminderPickedListener mOnReminderPickedListener;
    private int pickerType;

    private int reminderYear;
    private int reminderMonth;
    private int reminderDay;
    private int hourOfDay;
    private int minutes;

    private boolean timePickerCalledAlready = false;
    private boolean recurrencePickerCalledAlready = false;
    private long presetDateTime;
    private String recurrenceRule;

    public ReminderPickers(FragmentActivity mActivity, OnReminderPickedListener mOnReminderPickedListener,
            int pickerType) {
        this.mActivity = mActivity;
        this.mOnReminderPickedListener = mOnReminderPickedListener;
        this.pickerType = pickerType;
    }

    public void pick() {
        pick(null);
    }

    public void pick(Long presetDateTime) {
        pick(presetDateTime, "");
    }

    public void pick(Long presetDateTime, String recurrenceRule) {
        this.presetDateTime = DateUtils.getCalendar(presetDateTime).getTimeInMillis();
        this.recurrenceRule = recurrenceRule;
        if (pickerType == TYPE_AOSP) {
            timePickerCalledAlready = false;
            // Timepicker will be automatically called after date is inserted by user
            showDatePickerDialog(this.presetDateTime);
        } else {
            showDateTimeSelectors(this.presetDateTime);
        }
    }

    /**
     * Show date and time pickers
     */
    protected void showDateTimeSelectors(long reminder) {

        // Sets actual time or previously saved in note
        final Calendar now = DateUtils.getCalendar(reminder);
        DatePickerDialog mCalendarDatePickerDialog = DatePickerDialog
                .newInstance((dialog, year, monthOfYear, dayOfMonth) -> {
                    reminderYear = year;
                    reminderMonth = monthOfYear;
                    reminderDay = dayOfMonth;
                    TimePickerDialog mRadialTimePickerDialog = TimePickerDialog
                            .newInstance((radialPickerLayout, hour, minute) -> {
                                hourOfDay = hour;
                                minutes = minute;
                                showRecurrencePickerDialog(recurrenceRule);
                            }, now.get(Calendar.HOUR_OF_DAY), now.get(Calendar.MINUTE),
                                    DateUtils.is24HourMode(mActivity));
                    mRadialTimePickerDialog.show(mActivity.getSupportFragmentManager(), Constants.TAG);
                }, now.get(Calendar.YEAR), now.get(Calendar.MONTH), now.get(Calendar.DAY_OF_MONTH));
        mCalendarDatePickerDialog.show(mActivity.getSupportFragmentManager(), Constants.TAG);
    }

    /**
     * Shows fallback date and time pickers for smaller screens
     */

    public void showDatePickerDialog(long presetDateTime) {
        Bundle b = new Bundle();
        b.putLong(DatePickerDialogFragment.DEFAULT_DATE, presetDateTime);
        DialogFragment picker = new DatePickerDialogFragment();
        picker.setArguments(b);
        picker.show(mActivity.getSupportFragmentManager(), Constants.TAG);
    }

    private void showTimePickerDialog(long presetDateTime) {
        TimePickerFragment newFragment = new TimePickerFragment();
        Bundle bundle = new Bundle();
        bundle.putLong(TimePickerFragment.DEFAULT_TIME, presetDateTime);
        newFragment.setArguments(bundle);
        newFragment.show(mActivity.getSupportFragmentManager(), Constants.TAG);
    }

    private void showRecurrencePickerDialog(String recurrenceRule) {
        RecurrencePickerDialog recurrencePickerDialog = new RecurrencePickerDialog();
        if (recurrenceRule != null && recurrenceRule.length() > 0) {
            Bundle bundle = new Bundle();
            bundle.putString(RecurrencePickerDialog.BUNDLE_RRULE, recurrenceRule);
            recurrencePickerDialog.setArguments(bundle);
        }
        recurrencePickerDialog.setOnRecurrenceSetListener(this);
        recurrencePickerDialog.show(mActivity.getSupportFragmentManager(), "recurrencePicker");
    }

    @Override
    public void onDateSet(DatePicker view, int year, int monthOfYear, int dayOfMonth) {
        reminderYear = year;
        reminderMonth = monthOfYear;
        reminderDay = dayOfMonth;
        if (!timePickerCalledAlready) { // Used to avoid native bug that calls onPositiveButtonPressed in the onClose()
            timePickerCalledAlready = true;
            showTimePickerDialog(presetDateTime);
        }
    }

    @Override
    public void onTimeSet(android.widget.TimePicker view, int hourOfDay, int minute) {
        this.hourOfDay = hourOfDay;
        this.minutes = minute;
        if (!recurrencePickerCalledAlready) { // Used to avoid native bug that calls onPositiveButtonPressed in the onClose()
            recurrencePickerCalledAlready = true;
            showRecurrencePickerDialog(recurrenceRule);
        }
    }

    @Override
    public void onRecurrenceSet(final String rrule) {
        Calendar c = Calendar.getInstance();
        c.set(reminderYear, reminderMonth, reminderDay, hourOfDay, minutes, 0);
        if (mOnReminderPickedListener != null) {
            mOnReminderPickedListener.onReminderPicked(c.getTimeInMillis());
            mOnReminderPickedListener.onRecurrenceReminderPicked(rrule);
        }
    }
}