package org.theotech.ceaselessandroid.note;
import android.app.Activity;
import android.content.ContentResolver;
import org.theotech.ceaselessandroid.person.PersonManager;
import org.theotech.ceaselessandroid.person.PersonManagerImpl;
import org.theotech.ceaselessandroid.realm.Note;
import org.theotech.ceaselessandroid.realm.Person;
import org.theotech.ceaselessandroid.realm.pojo.NotePOJO;
import org.theotech.ceaselessandroid.realm.pojo.PersonPOJO;
import org.theotech.ceaselessandroid.util.RealmUtils;
import java.util.Date;
import java.util.List;
import java.util.UUID;
import io.realm.Realm;
import io.realm.RealmList;
/**
* Created by chrislim on 11/3/15.
*/
public class NoteManagerImpl implements NoteManager {
private static final String TAG = NoteManagerImpl.class.getSimpleName();
private static NoteManager instance;
private Activity activity;
private Realm realm;
private ContentResolver contentResolver;
private NoteManagerImpl(Activity activity) {
this.activity = activity;
this.realm = Realm.getDefaultInstance();
this.contentResolver = activity.getContentResolver();
}
public static NoteManager getInstance(Activity activity) {
if (instance == null) {
instance = new NoteManagerImpl(activity);
}
return instance;
}
@Override
public List<NotePOJO> getNotes() {
return RealmUtils.toNotePOJOs(realm.where(Note.class)
.equalTo(Note.Column.ACTIVE, true)
.findAllSorted(Note.Column.LAST_UPDATED_DATE));
}
@Override
public void addNote(String title, String text, List<PersonPOJO> personPOJOs) {
realm.beginTransaction();
Note note = realm.createObject(Note.class);
note.setCreationDate(new Date());
note.setLastUpdatedDate(new Date());
note.setId(UUID.randomUUID().toString());
note.setActive(true);
if (title != null) {
note.setTitle(title);
}
note.setText(text);
PersonManager pm = PersonManagerImpl.getInstance(activity);
RealmList<Person> people = pm.getPersonFromPersonPOJO(personPOJOs);
note.setPeopleTagged(people);
for (PersonPOJO p : personPOJOs) {
pm.getRealmPerson(p.getId()).getNotes().add(note);
}
realm.commitTransaction();
}
@Override
public void editNote(String noteId, String title, String text, List<PersonPOJO> personPOJOs) {
realm.beginTransaction();
Note note = getRealmNote(noteId);
note.setLastUpdatedDate(new Date());
note.setTitle(title);
note.setText(text);
note.setActive(true);
// we need to cleanup people no longer tagged and add people who are new
PersonManager pm = PersonManagerImpl.getInstance(activity);
RealmList<Person> oldPeopleTagged = note.getPeopleTagged();
for (Person p : oldPeopleTagged) {
p.getNotes().remove(note);
}
// tag the new people
RealmList<Person> people = pm.getPersonFromPersonPOJO(personPOJOs);
note.setPeopleTagged(people);
for (PersonPOJO p : personPOJOs) {
pm.getRealmPerson(p.getId()).getNotes().add(note);
}
realm.commitTransaction();
}
@Override
public void removeNote(String noteId) {
realm.beginTransaction();
getRealmNote(noteId).removeFromRealm();
realm.commitTransaction();
}
@Override
public NotePOJO getNote(String noteId) {
return RealmUtils.toNotePOJO(getRealmNote(noteId));
}
private Note getRealmNote(String noteId) {
return realm.where(Note.class)
.equalTo(Note.Column.ID, noteId)
.findFirst();
}
@Override
public void tagNote(String noteId, String personId) {
// TODO: Implement
}
@Override
public void untagNote(String noteId, String personId) {
// TODO: Implement
}
@Override
public List<NotePOJO> queryNotesByText(String query) {
List<Note> results = realm.where(Note.class)
.equalTo(Note.Column.ACTIVE, true)
.contains(Note.Column.TEXT, query, false)
.findAllSorted(Note.Column.LAST_UPDATED_DATE);
return RealmUtils.toNotePOJOs(results);
}
}