package org.gdg.frisbee.android.chapter;
import android.content.Context;
import android.os.AsyncTask;
import android.support.annotation.Nullable;
import org.gdg.frisbee.android.api.PlusApi;
import org.gdg.frisbee.android.api.model.plus.Person;
import org.gdg.frisbee.android.app.App;
import org.gdg.frisbee.android.cache.ModelCache;
import org.gdg.frisbee.android.utils.Utils;
import org.joda.time.DateTime;
import java.io.IOException;
import retrofit2.Response;
class OrganizerLoader extends AsyncTask<String, Person, Void> {
private final boolean online;
private final PlusApi plusApi;
private final ModelCache modelCache;
private Listener listener;
OrganizerLoader(Context context) {
online = Utils.isOnline(context);
plusApi = App.from(context).getPlusApi();
modelCache = App.from(context).getModelCache();
}
@Override
protected Void doInBackground(String... organizerIds) {
for (String gplusId : organizerIds) {
publishProgress(loadOrganizer(gplusId));
}
return null;
}
@Override
protected void onProgressUpdate(Person... values) {
if (listener == null) {
return;
}
Person organizer = values[0];
if (organizer != null) {
listener.onOrganizerLoaded(organizer);
} else {
listener.onUnknownOrganizerLoaded();
}
}
@Nullable
private Person loadOrganizer(String gplusId) {
Person person = modelCache.get(ModelCache.KEY_PERSON + gplusId, online);
if (person != null) {
return person;
}
try {
Response<Person> response = plusApi.getPerson(gplusId).execute();
if (response.isSuccessful()) {
person = response.body();
putPersonInCache(gplusId, person);
return person;
}
} catch (IOException ignored) {
}
return null;
}
private void putPersonInCache(String plusId, Person person) {
modelCache.putAsync(ModelCache.KEY_PERSON + plusId, person, DateTime.now().plusDays(1));
}
public void setListener(@Nullable Listener listener) {
this.listener = listener;
}
interface Listener {
void onOrganizerLoaded(Person organizer);
void onUnknownOrganizerLoaded();
}
}