/**
* Copyright (c) 2012 Todoroo Inc
*
* See the file "LICENSE" for the full license governing this code.
*/
package com.todoroo.astrid.reminders;
import java.util.ArrayList;
import java.util.Date;
import java.util.LinkedHashSet;
import java.util.List;
import java.util.concurrent.atomic.AtomicBoolean;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import android.app.Activity;
import android.app.Dialog;
import android.app.TimePickerDialog.OnTimeSetListener;
import android.content.Intent;
import android.content.res.Resources;
import android.text.TextUtils;
import android.util.DisplayMetrics;
import android.view.View;
import android.view.ViewGroup.LayoutParams;
import android.widget.LinearLayout;
import android.widget.TextView;
import android.widget.TimePicker;
import android.widget.Toast;
import com.timsu.astrid.R;
import com.todoroo.andlib.data.TodorooCursor;
import com.todoroo.andlib.service.Autowired;
import com.todoroo.andlib.service.DependencyInjectionService;
import com.todoroo.andlib.sql.Criterion;
import com.todoroo.andlib.sql.Query;
import com.todoroo.andlib.utility.DateUtilities;
import com.todoroo.andlib.utility.Preferences;
import com.todoroo.astrid.actfm.sync.ActFmPreferenceService;
import com.todoroo.astrid.actfm.sync.ActFmSyncService;
import com.todoroo.astrid.activity.AstridActivity;
import com.todoroo.astrid.api.AstridApiConstants;
import com.todoroo.astrid.core.PluginServices;
import com.todoroo.astrid.dao.UserDao;
import com.todoroo.astrid.data.TagData;
import com.todoroo.astrid.data.TagMetadata;
import com.todoroo.astrid.data.Task;
import com.todoroo.astrid.data.User;
import com.todoroo.astrid.helper.AsyncImageView;
import com.todoroo.astrid.service.StatisticsConstants;
import com.todoroo.astrid.service.StatisticsService;
import com.todoroo.astrid.service.TaskService;
import com.todoroo.astrid.tags.TagMemberMetadata;
import com.todoroo.astrid.tags.TagService;
import com.todoroo.astrid.utility.ResourceDrawableCache;
/**
* A dialog that shows your task reminder
*
* @author sbosley
*
*/
public class ReminderDialog extends Dialog {
private static final int MAX_FACES = 4;
@Autowired
private TaskService taskService;
@Autowired
private TagService tagService;
@Autowired
private UserDao userDao;
public ReminderDialog(final AstridActivity activity, final long taskId,
String title) {
super(activity, R.style.ReminderDialog);
DependencyInjectionService.getInstance().inject(this);
final SnoozeCallback dialogSnooze = new SnoozeCallback() {
@Override
public void snoozeForTime(long time) {
Task task = new Task();
task.setId(taskId);
task.setValue(Task.REMINDER_SNOOZE, time);
PluginServices.getTaskService().save(task);
dismiss();
StatisticsService.reportEvent(StatisticsConstants.TASK_SNOOZE);
}
};
final OnTimeSetListener onTimeSet = new OnTimeSetListener() {
@Override
public void onTimeSet(TimePicker view, int hours, int minutes) {
Date alarmTime = new Date();
alarmTime.setHours(hours);
alarmTime.setMinutes(minutes);
if(alarmTime.getTime() < DateUtilities.now())
alarmTime.setDate(alarmTime.getDate() + 1);
dialogSnooze.snoozeForTime(alarmTime.getTime());
}
};
if (Preferences.getBoolean(R.string.p_rmd_nagging, true)) {
setContentView(R.layout.astrid_reminder_view);
setupSpeechBubble(activity, taskId);
} else {
setContentView(R.layout.astrid_reminder_view_portrait);
title = activity.getString(R.string.rmd_NoA_dlg_title) + " " + title; //$NON-NLS-1$
removeSpeechBubble();
}
// set up listeners
findViewById(R.id.dismiss).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View arg0) {
dismiss();
}
});
findViewById(R.id.reminder_snooze).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View arg0) {
NotificationFragment.snooze(activity, onTimeSet, dialogSnooze);
}
});
findViewById(R.id.reminder_complete).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View arg0) {
Task task = taskService.fetchById(taskId, Task.ID, Task.REMINDER_LAST, Task.SOCIAL_REMINDER);
if (task != null)
taskService.setComplete(task, true);
activity.sendBroadcast(new Intent(AstridApiConstants.BROADCAST_EVENT_REFRESH));
Toast.makeText(activity,
R.string.rmd_NoA_completed_toast,
Toast.LENGTH_LONG).show();
dismiss();
}
});
findViewById(R.id.reminder_edit).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
dismiss();
activity.onTaskListItemClicked(taskId);
}
});
((TextView) findViewById(R.id.reminder_title)).setText(title);
setOwnerActivity(activity);
}
private void removeSpeechBubble() {
LinearLayout container = (LinearLayout) findViewById(R.id.speech_bubble_container);
container.setVisibility(View.GONE);
}
private void setupSpeechBubble(Activity activity, long taskId) {
((TextView) findViewById(R.id.reminder_message)).setText(
Notifications.getRandomReminder(activity.getResources().getStringArray(R.array.reminder_responses)));
if (Preferences.getBoolean(R.string.p_rmd_social, true)) {
Task task = new Task();
task.setId(taskId);
addFacesToReminder(activity, task);
}
}
private void addFacesToReminder(Activity activity, Task task) {
if (task == null)
return;
Resources resources = activity.getResources();
LinkedHashSet<String> pictureUrls = new LinkedHashSet<String>();
List<String> names = new ArrayList<String>();
AtomicBoolean isSharedTask = new AtomicBoolean(false);
if (pictureUrls.size() < MAX_FACES) {
addTagFaces(task.getId(), pictureUrls, names, isSharedTask);
}
if (pictureUrls.size() > 0) {
DisplayMetrics metrics = activity.getResources().getDisplayMetrics();
LinearLayout layout = new LinearLayout(activity);
LinearLayout.LayoutParams containerParams = new LinearLayout.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
containerParams.setMargins((int) (-7 * metrics.density), 0, 0, 0);
layout.setLayoutParams(containerParams);
int padding = (int) (8 * metrics.density);
int count = 0;
for (String url : pictureUrls) {
AsyncImageView image = new AsyncImageView(activity);
image.setDefaultImageDrawable(ResourceDrawableCache.getImageDrawableFromId(resources, R.drawable.icn_default_person_image));
image.setUrl(url);
LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams((int) (35 * metrics.density), (int) (35 * metrics.density));
lp.setMargins(padding, padding, 0, padding);
image.setLayoutParams(lp);
layout.addView(image);
if (++count >= MAX_FACES)
break;
}
LinearLayout container = (LinearLayout) findViewById(R.id.speech_bubble_content);
container.setOrientation(LinearLayout.VERTICAL);
container.addView(layout, 0);
String text;
if (names.size() == 0)
text = activity.getString(R.string.reminders_social);
else if (names.size() == 1)
text = activity.getString(R.string.reminders_social_one, names.get(0));
else
text = activity.getString(R.string.reminders_social_multiple, names.get(0), names.get(1));
((TextView) findViewById(R.id.reminder_message)).setText(text);
task.setValue(Task.SOCIAL_REMINDER, Task.REMINDER_SOCIAL_FACES);
} else {
if (isSharedTask.get())
task.setValue(Task.SOCIAL_REMINDER, Task.REMINDER_SOCIAL_NO_FACES);
else
task.setValue(Task.SOCIAL_REMINDER, Task.REMINDER_SOCIAL_PRIVATE);
}
}
private void addPicturesFromJSONArray(JSONArray array, LinkedHashSet<String> pictureUrls, List<String> names, AtomicBoolean isSharedTask) throws JSONException {
for (int i = 0; i < array.length(); i++) {
JSONObject person = array.getJSONObject(i);
if (person.has("picture")) { //$NON-NLS-1$
if (ActFmPreferenceService.userId().equals(Long.toString(person.optLong("id")))) //$NON-NLS-1$
continue;
isSharedTask.set(true);
String pictureUrl = person.getString("picture"); //$NON-NLS-1$
if (!TextUtils.isEmpty(pictureUrl)) {
pictureUrls.add(pictureUrl);
}
String name = person.optString("first_name"); //$NON-NLS-1$
if (!TextUtils.isEmpty(name))
names.add(name);
else {
name = person.optString("name"); //$NON-NLS-1$
if (!TextUtils.isEmpty(name))
names.add(name);
}
}
}
}
private void addTagFaces(long taskId, LinkedHashSet<String> pictureUrls, List<String> names, AtomicBoolean isSharedTask) {
TodorooCursor<TagData> tags = tagService.getTagDataForTask(taskId, Criterion.all, TagData.UUID, TagData.MEMBERS);
try {
TagData td = new TagData();
for (tags.moveToFirst(); !tags.isAfterLast() && pictureUrls.size() < MAX_FACES; tags.moveToNext()) {
td.readFromCursor(tags);
try {
JSONArray people = new JSONArray(td.getValue(TagData.MEMBERS));
addPicturesFromJSONArray(people, pictureUrls, names, isSharedTask);
} catch (JSONException e) {
JSONArray people = new JSONArray();
TodorooCursor<User> users = userDao.query(Query.select(User.PROPERTIES)
.where(User.UUID.in(
Query.select(TagMemberMetadata.USER_UUID)
.from(TagMetadata.TABLE)
.where(TagMetadata.TAG_UUID.eq(td.getUuid())))));
try {
User user = new User();
for (users.moveToFirst(); !users.isAfterLast(); users.moveToNext()) {
user.clear();
user.readFromCursor(users);
try {
JSONObject userJson = new JSONObject();
ActFmSyncService.JsonHelper.jsonFromUser(userJson, user);
people.put(userJson);
} catch (JSONException e2) {
//
}
}
try {
addPicturesFromJSONArray(people, pictureUrls, names, isSharedTask);
} catch (JSONException e2) {
//
}
} finally {
users.close();
}
}
}
} finally {
tags.close();
}
}
}