/**
* Odoo, Open Source Management Solution
* Copyright (C) 2012-today Odoo SA (<http:www.odoo.com>)
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero 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 Affero General Public License for more details
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <http:www.gnu.org/licenses/>
*
* Created on 9/1/15 5:46 PM
*/
package com.odoo.addons.calendar;
import android.graphics.Color;
import android.graphics.drawable.ColorDrawable;
import android.os.Bundle;
import android.support.v7.app.ActionBar;
import android.support.v7.app.ActionBarActivity;
import android.text.format.DateUtils;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.ImageView;
import android.widget.Toast;
import com.odoo.addons.calendar.models.CalendarEvent;
import com.odoo.addons.calendar.utils.CalendarUtils;
import com.odoo.addons.calendar.utils.EventColorDialog;
import com.odoo.addons.calendar.utils.ReminderDialog;
import com.odoo.core.orm.ODataRow;
import com.odoo.core.orm.OValues;
import com.odoo.core.orm.fields.OColumn;
import com.odoo.core.utils.OActionBarUtils;
import com.odoo.core.utils.OAlert;
import com.odoo.core.utils.OControls;
import com.odoo.core.utils.ODateUtils;
import com.odoo.core.utils.OResource;
import com.odoo.core.utils.notification.ONotificationBuilder;
import com.odoo.core.utils.reminder.ReminderReceiver;
import com.odoo.core.utils.reminder.ReminderUtils;
import com.odoo.R;
import java.util.Date;
import odoo.controls.OField;
import odoo.controls.OForm;
public class EventDetail extends ActionBarActivity implements View.OnClickListener,
EventColorDialog.OnColorSelectListener, OField.IOnFieldValueChangeListener, ReminderDialog.OnReminderValueSelectListener {
public static final String TAG = EventDetail.class.getSimpleName();
private ActionBar actionBar;
public static final String KEY_RESCHEDULE = "key_reschedule";
private static final String KEY_EXTRA_EVENT_COLOR = "event_color";
private static final String KEY_COLOR_DATA = "color_data";
private String mEventColor = CalendarUtils.getBackgroundColors()[0];
private OForm eventForm;
private Integer mEventColorCode = 0;
private ReminderDialog.ReminderItem mReminder;
private ODataRow color_data = null;
private Boolean mAllDay = false;
private View mView = null;
private CalendarEvent calendarEvent;
private int row_id = -1;
private OField event_date_end, event_date_start, event_time_end, event_time_start, allDay;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.calendar_event_detail_form);
OActionBarUtils.setActionBar(this, true);
calendarEvent = new CalendarEvent(this, null);
actionBar = getSupportActionBar();
actionBar.setHomeAsUpIndicator(R.drawable.ic_action_mark_undone);
actionBar.setTitle(R.string.label_new_meeting);
mView = findViewById(R.id.eventForm);
event_date_end = (OField) findViewById(R.id.event_date_end);
event_time_end = (OField) findViewById(R.id.event_end_time);
event_date_start = (OField) findViewById(R.id.event_date_start);
event_time_start = (OField) findViewById(R.id.event_start_time);
allDay = (OField) findViewById(R.id.fieldAllDay);
if (savedInstanceState != null) {
mEventColor = savedInstanceState.getString(KEY_EXTRA_EVENT_COLOR);
color_data = savedInstanceState.getParcelable(KEY_COLOR_DATA);
colorSelected(color_data);
} else {
setThemeColor(mEventColor);
}
allDay.setOnValueChangeListener(this);
((OField) findViewById(R.id.event_date_start)).setOnValueChangeListener(this);
((OField) findViewById(R.id.event_start_time)).setOnValueChangeListener(this);
// OnClicks
findViewById(R.id.event_color).setOnClickListener(this);
findViewById(R.id.reminderForEvent).setOnClickListener(this);
Bundle extra = getIntent().getExtras();
eventForm = (OForm) mView;
eventForm.setModel(calendarEvent.getModelName());
if (extra != null) {
row_id = getIntent().getIntExtra(OColumn.ROW_ID, -1);
if (row_id != -1) {
findViewById(R.id.meetingDeleteLayout).setVisibility(View.VISIBLE);
findViewById(R.id.meetingDeleteLayout).setOnClickListener(this);
actionBar.setTitle(R.string.label_edit_meeting);
ODataRow record = calendarEvent.browse(row_id);
eventForm.initForm(record);
allDay.setValue(record.getBoolean("allday"));
String dateFormat = (record.getBoolean("allday")) ? ODateUtils.DEFAULT_DATE_FORMAT :
ODateUtils.DEFAULT_FORMAT;
event_date_start.setValue(ODateUtils.parseDate(record.getString("date_start"),
dateFormat,
ODateUtils.DEFAULT_DATE_FORMAT));
event_date_end.setValue(ODateUtils.parseDate(record.getString("date_end"),
dateFormat,
ODateUtils.DEFAULT_DATE_FORMAT));
event_time_start.setValue(ODateUtils.parseDate(record.getString("date_start"),
dateFormat,
ODateUtils.DEFAULT_TIME_FORMAT));
event_time_end.setValue(ODateUtils.parseDate(record.getString("date_end"),
dateFormat,
ODateUtils.DEFAULT_TIME_FORMAT));
colorSelected(CalendarUtils.getColorData(record.getInt("color_index")));
} else {
ODataRow opp_data = new ODataRow();
if (extra.containsKey(CalendarDashboard.KEY_DATE)) {
event_date_start.setValue(extra.getString(CalendarDashboard.KEY_DATE));
event_date_end.setValue(extra.getString(CalendarDashboard.KEY_DATE));
}
OField opp_field = (OField) findViewById(R.id.opportunity_id);
if (extra.containsKey("opp_id")) {
opp_field.setVisibility(View.VISIBLE);
opp_data.put("opportunity_id", extra.getInt("opp_id"));
}
eventForm.initForm(opp_data);
opp_field.setEditable(false);
}
} else {
eventForm.initForm(null);
}
String action = getIntent().getAction();
if (action != null && (action.equals(ReminderReceiver.ACTION_EVENT_REMINDER_DONE) ||
action.equals(ReminderReceiver.ACTION_EVENT_REMINDER_RE_SCHEDULE))) {
ONotificationBuilder.cancelNotification(this, getIntent().getExtras().
getInt(OColumn.ROW_ID));
if (action.equals(ReminderReceiver.ACTION_EVENT_REMINDER_DONE)) {
int row_id = getIntent().getExtras().getInt(OColumn.ROW_ID);
OValues values = new OValues();
values.put("is_done", 1);
calendarEvent.update(row_id, values);
Toast.makeText(this, R.string.toast_event_marked_done, Toast.LENGTH_LONG).show();
extra.remove(KEY_RESCHEDULE);
}
}
}
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.event_color:
CalendarUtils.colorDialog(this, mEventColor, this).show();
break;
case R.id.reminderForEvent:
ReminderDialog dialog = new ReminderDialog(this,
(mAllDay) ? ReminderDialog.ReminderType.FullDayEvent :
ReminderDialog.ReminderType.TimeBasedEvent);
dialog.setOnReminderValueSelectListener(this);
dialog.show();
break;
case R.id.meetingDeleteLayout:
OAlert.showConfirm(this, "Are you sure want to delete meeting ?",
new OAlert.OnAlertConfirmListener() {
@Override
public void onConfirmChoiceSelect(OAlert.ConfirmType type) {
switch (type) {
case POSITIVE:
calendarEvent.delete(row_id);
Toast.makeText(EventDetail.this, "Meeting deleted",
Toast.LENGTH_LONG).show();
finish();
break;
case NEGATIVE:
}
}
});
break;
}
}
@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
outState.putString(KEY_EXTRA_EVENT_COLOR, mEventColor);
outState.putParcelable(KEY_COLOR_DATA, color_data);
}
@Override
public void colorSelected(ODataRow color_data) {
if (color_data != null) {
mEventColor = color_data.getString("code");
this.color_data = color_data;
ImageView event_color_view = (ImageView) findViewById(R.id.event_color_view);
event_color_view.setColorFilter(Color.parseColor(mEventColor));
OControls.setText(mView, R.id.event_color_label,
color_data.getString("label"));
mEventColorCode = color_data.getInt("index");
setThemeColor(mEventColor);
}
}
private void setThemeColor(String color_code) {
int color = Color.parseColor(color_code);
actionBar.setBackgroundDrawable(new ColorDrawable(color));
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.menu_calendar_detail, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case android.R.id.home:
finish();
break;
case R.id.menu_calendar_detail_save:
OValues values = eventForm.getValues();
if (values != null) {
createMeeting(values);
}
break;
}
return super.onOptionsItemSelected(item);
}
private void createMeeting(OValues values) {
OValues meeting = new OValues();
meeting.put("name", values.get("name"));
meeting.put("allday", values.get("allday"));
meeting.put("location", values.get("location"));
meeting.put("description", values.get("description"));
meeting.put("class", values.get("class"));
meeting.put("color_index", mEventColorCode);
if (values.contains("opportunity_id")) {
meeting.put("opportunity_id", values.get("opportunity_id"));
}
if (calendarEvent.getColumn("date") == null) {
//v7+
if (values.getBoolean("allday")) {
meeting.put("start_date", values.get("event_date_start"));
meeting.put("stop_date", values.get("event_date_end"));
meeting.put("date_start", meeting.get("start_date"));
meeting.put("date_end", meeting.get("stop_date"));
} else {
String start_datetime = values.get("event_date_start") + " " + values.get("event_time_start");
String stop_datetime = values.get("event_date_end") + " " + values.get("event_time_end");
meeting.put("start_datetime", start_datetime);
meeting.put("stop_datetime", stop_datetime);
meeting.put("date_start", meeting.get("start_datetime"));
meeting.put("date_end", meeting.get("stop_datetime"));
}
} else {
//v7
String start_datetime = values.get("event_date_start") + " " +
values.get("event_time_start");
String stop_datetime = values.get("event_date_end") + " " +
values.get("event_time_end");
meeting.put("date", start_datetime);
meeting.put("date_deadline", stop_datetime);
meeting.put("date_start", meeting.get("date"));
meeting.put("date_end", meeting.get("date_deadline"));
}
String format = (meeting.getBoolean("allday")) ? ODateUtils.DEFAULT_DATE_FORMAT :
ODateUtils.DEFAULT_FORMAT;
Date date_start = ODateUtils.createDateObject(meeting.getString("date_start"),
format, false);
Date date_end = ODateUtils.createDateObject(meeting.getString("date_end"),
format, false);
if (date_end.compareTo(date_start) < 0) {
OAlert.showWarning(this, OResource.string(this,
R.string.error_end_date_small_than_start_date));
} else {
Date now = new Date();
Date reminderDate = null;
int diff = 99;
if (meeting.getBoolean("allday")) {
if (DateUtils.isToday(date_start.getTime())) {
diff = 0;
}
}
if (diff == 0 || now.compareTo(date_start) <= 0) {
meeting.put("has_reminder", "true");
if (mReminder == null) {
mReminder = ReminderDialog.getDefault(this, meeting.getBoolean("allday"));
}
reminderDate = ReminderDialog.getReminderDateTime(meeting.getString("date_start"),
meeting.getBoolean("allday"), mReminder);
if (reminderDate != null) {
meeting.put("reminder_datetime", ODateUtils.getDate(reminderDate,
ODateUtils.DEFAULT_FORMAT));
}
}
if (row_id != -1) {
Log.i(TAG, "Event updated");
calendarEvent.update(row_id, meeting);
} else {
Log.i(TAG, "Event created");
row_id = calendarEvent.insert(meeting);
}
Bundle extra = new Bundle();
extra.putInt(OColumn.ROW_ID, row_id);
extra.putString(ReminderUtils.KEY_REMINDER_TYPE, "event");
if (reminderDate != null) {
if (ReminderUtils.get(getApplicationContext()).resetReminder(reminderDate, extra)) {
Log.i(TAG, "Reminder added.");
}
}
finish();
}
}
public void onCheckedChanged(boolean isChecked) {
mAllDay = isChecked;
if (isChecked) {
OControls.setText(mView, R.id.reminderTypeName,
String.format(OResource.string(this, R.string.on_the_day_at), "9 AM"));
findViewById(R.id.event_start_time).setVisibility(View.GONE);
findViewById(R.id.event_end_time).setVisibility(View.GONE);
} else {
OControls.setText(mView, R.id.reminderTypeName, OResource.string(this,
R.string.at_the_time_of_event));
findViewById(R.id.event_start_time).setVisibility(View.VISIBLE);
findViewById(R.id.event_end_time).setVisibility(View.VISIBLE);
}
}
@Override
public void onFieldValueChange(OField field, Object value) {
if (field.getFieldName().equals("allday"))
onCheckedChanged(Boolean.parseBoolean(value.toString()));
if (field.getFieldName().equals("event_date_start")) {
event_date_end.setValue(value);
}
if (field.getFieldName().equals("event_time_start")) {
event_time_end.setValue(value);
}
}
@Override
public void onReminderItemSelect(ReminderDialog.ReminderItem value) {
OControls.setText(mView, R.id.reminderTypeName, value.getTitle());
mReminder = value;
}
}