/*
* Copyright (C) 2014 Philippine Android Developers Community
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package ph.devcon.android.program.service;
import android.app.LoaderManager;
import android.content.Context;
import android.content.Loader;
import android.os.Bundle;
import com.google.common.base.Optional;
import com.j256.ormlite.dao.ForeignCollection;
import com.path.android.jobqueue.JobManager;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import de.greenrobot.event.EventBus;
import ph.devcon.android.base.db.OrmliteListLoader;
import ph.devcon.android.base.db.OrmliteListLoaderSupport;
import ph.devcon.android.program.api.ProgramAPI;
import ph.devcon.android.program.api.ProgramAPIContainer;
import ph.devcon.android.program.api.ProgramBaseResponse;
import ph.devcon.android.program.db.Program;
import ph.devcon.android.program.db.ProgramDao;
import ph.devcon.android.program.event.FetchedProgramListEvent;
import ph.devcon.android.program.event.FetchedProgramListFailedEvent;
import ph.devcon.android.program.job.FetchProgramListJob;
import ph.devcon.android.speaker.api.SpeakerAPI;
import ph.devcon.android.speaker.db.Speaker;
import ph.devcon.android.speaker.db.SpeakerDao;
/**
* Created by lope on 10/29/14.
*/
public class ProgramServiceImpl implements ProgramService {
ProgramDao programDao;
SpeakerDao speakerDao;
JobManager jobManager;
EventBus eventBus;
Context context;
public ProgramServiceImpl(Context context, JobManager jobManager, EventBus eventBus, ProgramDao programDao, SpeakerDao speakerDao) {
this.context = context;
this.jobManager = jobManager;
this.eventBus = eventBus;
this.programDao = programDao;
this.speakerDao = speakerDao;
}
public synchronized List<Program> createCacheObject(ProgramBaseResponse baseResponse) {
try {
programDao.clear();
} catch (SQLException e) {
e.printStackTrace();
}
Optional<ProgramBaseResponse> baseResponseOptional = Optional.of(baseResponse);
ProgramBaseResponse programBaseResponse = baseResponseOptional.get();
List<Program> programsDBList = new ArrayList<Program>();
for (ProgramAPIContainer container : programBaseResponse.getPrograms()) {
try {
ProgramAPI programAPI = container.getProgram();
ForeignCollection<Speaker> speakers = programDao.getEmptyForeignCollection("speakers");
Program programDb = Program.toProgram(programAPI);
programDb.setSpeakers(speakers);
programDao.create(programDb);
for (SpeakerAPI speakerAPI : programAPI.getSpeakers()) {
Speaker speaker = Speaker.toSpeaker(speakerAPI);
speaker.setProgram(programDb);
speakers.add(speaker);
}
programsDBList.add(programDb);
} catch (SQLException e) {
e.printStackTrace();
}
}
return programsDBList;
}
public void populateFromCache(LoaderManager loaderManager, Bundle savedInstanceState) {
loaderManager.initLoader(0, savedInstanceState,
new LoaderManager.LoaderCallbacks<List<Program>>() {
@Override
public Loader<List<Program>> onCreateLoader(int id, Bundle args) {
try {
return new OrmliteListLoader(context, programDao, programDao.queryBuilder().prepare());
} catch (SQLException e) {
e.printStackTrace();
}
return null;
}
@Override
public void onLoadFinished(Loader<List<Program>> loader, List<Program> data) {
if (data != null) {
eventBus.post(new FetchedProgramListEvent(data));
} else {
eventBus.post(new FetchedProgramListFailedEvent());
}
}
@Override
public void onLoaderReset(Loader<List<Program>> loader) {
}
}
);
}
@Override
public void populateFromCache(android.support.v4.app.LoaderManager loaderManager, Bundle savedInstanceState) {
loaderManager.initLoader(0, savedInstanceState,
new android.support.v4.app.LoaderManager.LoaderCallbacks<List<Program>>() {
@Override
public android.support.v4.content.Loader<List<Program>> onCreateLoader(int id, Bundle args) {
try {
return new OrmliteListLoaderSupport<Program, Integer>(context, programDao, programDao.queryBuilder().prepare());
} catch (SQLException e) {
e.printStackTrace();
}
return null;
}
@Override
public void onLoadFinished(android.support.v4.content.Loader<List<Program>> loader, List<Program> data) {
if (data != null) {
eventBus.post(new FetchedProgramListEvent(data));
} else {
eventBus.post(new FetchedProgramListFailedEvent());
}
}
@Override
public void onLoaderReset(android.support.v4.content.Loader<List<Program>> loader) {
}
}
);
}
@Override
public void populateFromAPI() {
jobManager.addJobInBackground(new FetchProgramListJob());
}
@Override
public boolean isCacheValid() {
try {
return programDao.isCacheValid();
} catch (SQLException e) {
e.printStackTrace();
}
return false;
}
}