/**
* Copyright (C) 2016 by Johan von Forstner under the MIT license:
*
* Permission is hereby granted, free of charge, to any person obtaining a copy of this software and
* associated documentation files (the "Software"), to deal in the Software without restriction,
* including without limitation the rights to use, copy, modify, merge, publish, distribute,
* sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in all copies or
* substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT
* NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
* DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*/
package de.geeksfactory.opacclient.webservice;
import android.app.IntentService;
import android.content.Context;
import android.content.Intent;
import android.support.v4.content.LocalBroadcastManager;
import android.util.Log;
import org.acra.ACRA;
import org.joda.time.DateTime;
import org.json.JSONException;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import de.geeksfactory.opacclient.BuildConfig;
import de.geeksfactory.opacclient.OpacClient;
import de.geeksfactory.opacclient.storage.JsonSearchFieldDataSource;
import de.geeksfactory.opacclient.storage.PreferenceDataSource;
import de.geeksfactory.opacclient.utils.ErrorReporter;
public class LibraryConfigUpdateService extends IntentService {
private static final String NAME = "LibraryConfigUpdateService";
public static final String ACTION_SUCCESS = NAME + "_success";
public static final String ACTION_FAILURE = NAME + "_failure";
public static final String EXTRA_UPDATE_COUNT = "update_count";
public static final String LIBRARIES_DIR = "libraries";
public LibraryConfigUpdateService() {
super(NAME);
}
@Override
protected void onHandleIntent(Intent intent) {
WebService service = WebServiceManager.getInstance();
PreferenceDataSource prefs = new PreferenceDataSource(this);
File filesDir = new File(getFilesDir(), LIBRARIES_DIR);
filesDir.mkdirs();
try {
int count = ((OpacClient) getApplication()).getUpdateHandler().updateConfig(
service, prefs, new FileOutput(filesDir), new JsonSearchFieldDataSource(this));
if (!BuildConfig.DEBUG) {
DateTime lastUpdate = prefs.getLastLibraryConfigUpdate();
ACRA.getErrorReporter().putCustomData("data_version", lastUpdate != null ?
lastUpdate.toString() : "null");
}
if (BuildConfig.DEBUG) {
Log.d("LibraryConfigUpdate",
"updated config for " + String.valueOf(count) + " libraries");
}
Intent broadcast = new Intent(ACTION_SUCCESS).putExtra(EXTRA_UPDATE_COUNT, count);
LocalBroadcastManager.getInstance(this).sendBroadcast(broadcast);
((OpacClient) getApplication()).resetCache();
} catch (IOException e) {
Intent broadcast = new Intent(ACTION_FAILURE);
LocalBroadcastManager.getInstance(this).sendBroadcast(broadcast);
} catch (JSONException e) {
Intent broadcast = new Intent(ACTION_FAILURE);
LocalBroadcastManager.getInstance(this).sendBroadcast(broadcast);
ErrorReporter.handleException(e);
}
}
public static class FileOutput {
private final File dir;
public FileOutput(File dir) {
this.dir = dir;
}
public void writeFile(String filename, String data) throws IOException {
File file = new File(dir, filename);
FileWriter writer = null;
try {
writer = new FileWriter(file);
writer.write(data);
} finally {
if (writer != null) writer.close();
}
}
public void clearFiles() {
File[] files = dir.listFiles();
for (File file : files) {
file.delete();
}
}
}
public static void clearConfigurationUpdates(Context context) {
File filesDir = new File(context.getFilesDir(), LIBRARIES_DIR);
filesDir.mkdirs();
File[] files = filesDir.listFiles();
for (File file : files) {
file.delete();
}
PreferenceDataSource prefs = new PreferenceDataSource(context);
prefs.clearLastLibraryConfigUpdate();
}
}