package com.rapidftr.service; import com.google.inject.Inject; import com.rapidftr.R; import com.rapidftr.RapidFtrApplication; import com.rapidftr.model.Child; import com.rapidftr.model.User; import com.rapidftr.repository.ChildRepository; import org.apache.http.HttpException; import org.joda.time.DateTime; import org.json.JSONException; import java.io.IOException; import java.util.List; import static com.rapidftr.database.Database.ChildTableColumn.internal_id; public class ChildSyncService implements SyncService<Child> { public static final String CHILDREN_API_PATH = "/api/children"; public static final String CHILDREN_API_PARAMETER = "child"; public static final String UNVERIFIED_USER_CHILDREN_API_PATH = "/api/children/unverified"; private MediaSyncHelper mediaSyncHelper; private RapidFtrApplication context; private ChildRepository childRepository; private static final int NOTIFICATION_ID = 1022; private EntityHttpDao<Child> childEntityHttpDao; @Inject public ChildSyncService(RapidFtrApplication context, EntityHttpDao<Child> childHttpDao, ChildRepository childRepository) { this.context = context; this.childRepository = childRepository; this.childEntityHttpDao = childHttpDao; this.mediaSyncHelper = new MediaSyncHelper(childEntityHttpDao, context); } @Override public Child sync(Child child, User currentUser) throws IOException, JSONException { String syncPath = getSyncPath(child, currentUser); GenericSyncService<Child> syncService = new GenericSyncService<Child>(mediaSyncHelper, childEntityHttpDao, childRepository); return syncService.sync(child, syncPath); } public String getSyncPath(Child child, User currentUser) throws JSONException { if (currentUser.isVerified()) { return child.isNew() ? CHILDREN_API_PATH : new StringBuilder(CHILDREN_API_PATH) .append("/").append(child.get(internal_id.getColumnName())).toString(); } else { return UNVERIFIED_USER_CHILDREN_API_PATH; } } @Override public void setMedia(Child child) throws IOException, JSONException { mediaSyncHelper.setPhoto(child); mediaSyncHelper.setAudio(child); } @Override public int getNotificationId() { return NOTIFICATION_ID; } @Override public String getNotificationTitle() { return context.getString(R.string.child_sync_title); } @Override public void setLastSyncedAt(Child child) { RapidFtrApplication.getApplicationInstance() .getSharedPreferences() .edit() .putLong(RapidFtrApplication.LAST_CHILD_SYNC, child.lastUpdatedAtInMillis()) .commit(); } @Override public Child getRecord(String resourceUrl) throws IOException, JSONException, HttpException { Child child = childEntityHttpDao.get(resourceUrl); GenericSyncService.setAttributes(child); return child; } public List<String> getIdsToDownload() throws IOException, JSONException, HttpException { // Default value is currently epoch long lastUpdateMillis = context.getSharedPreferences().getLong(RapidFtrApplication.LAST_CHILD_SYNC, 0); DateTime lastUpdate = new DateTime(lastUpdateMillis); return childEntityHttpDao.getUpdatedResourceUrls(lastUpdate); } }