package it.angelic.soulissclient.helpers;
import android.app.Activity;
import android.app.ProgressDialog;
import android.content.Intent;
import android.content.SharedPreferences;
import android.os.AsyncTask;
import android.os.Environment;
import android.os.Looper;
import android.preference.PreferenceActivity;
import android.preference.PreferenceManager;
import android.util.Log;
import android.widget.Toast;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.sql.SQLDataException;
import java.util.Calendar;
import java.util.Date;
import it.angelic.soulissclient.Constants;
import it.angelic.soulissclient.PreferencesActivity;
import it.angelic.soulissclient.R;
import it.angelic.soulissclient.SoulissApp;
import it.angelic.soulissclient.model.ISoulissObject;
import it.angelic.soulissclient.model.LauncherElement;
import it.angelic.soulissclient.model.SoulissModelException;
import it.angelic.soulissclient.model.SoulissNode;
import it.angelic.soulissclient.model.SoulissScene;
import it.angelic.soulissclient.model.SoulissTag;
import it.angelic.soulissclient.model.SoulissTypical;
import it.angelic.soulissclient.model.db.SoulissDB;
import it.angelic.soulissclient.model.db.SoulissDBHelper;
import it.angelic.soulissclient.model.db.SoulissDBLauncherHelper;
import it.angelic.soulissclient.model.db.SoulissDBTagHelper;
import it.angelic.soulissclient.model.db.SoulissLogDTO;
import it.angelic.soulissclient.model.db.SoulissTypicalDTO;
import it.angelic.soulissclient.preferences.DbSettingsFragment;
import it.angelic.soulissclient.util.LauncherElementEnum;
import it.angelic.soulissclient.util.SoulissUtils;
public class ImportDatabaseCSVTask extends AsyncTask<String, Void, Boolean>
{
private static final int PHASE_NODES = 1;
private static final int PHASE_TYPICALS = 2;
private static final int PHASE_LOGS = 3;
private static final int PHASE_TAGS = 4;
private static final int PHASE_DASHB = 6;
private static final int PHASE_TAG_TYP = 5;
// private ProgressDialog dialog;
/**
* application context.
*/
private Activity activity;
private SharedPreferences customSharedPreference;
private SoulissDBTagHelper database;
private SoulissDBLauncherHelper databaseLauncher;
private File file;
private ProgressDialog mProgressDialog;
// can use UI thread here
private int totNodes = 0;
private int tottyp = 0;
public ImportDatabaseCSVTask(Activity activity) {
this.activity = activity;
//customSharedPreference = activity.getSharedPreferences("SoulissPrefs", Activity.MODE_PRIVATE);
customSharedPreference = PreferenceManager.getDefaultSharedPreferences(activity);
}
// automatically done on worker thread (separate from UI thread)
protected Boolean doInBackground(final String... args)
{
int linesNum = 0;
// File dbFile = null;// getDatabasePath("excerDB.db");
database = new SoulissDBTagHelper(SoulissApp.getAppContext());
databaseLauncher = new SoulissDBLauncherHelper(SoulissApp.getAppContext());
File importDir;
Looper.prepare();
try {
importDir = new File(Environment.getExternalStorageDirectory(), Constants.EXTERNAL_EXP_FOLDER);
if (!importDir.exists())
Toast.makeText(SoulissApp.getAppContext(), SoulissApp.getAppContext().getString(R.string.dialog_import_nofolder), Toast.LENGTH_SHORT).show();
if (!file.exists()) {
Toast.makeText(SoulissApp.getAppContext(), SoulissApp.getAppContext().getString(R.string.dialog_import_nofile), Toast.LENGTH_SHORT).show();
Log.e(Constants.TAG, "Import file doesn't exist!" + file.getAbsolutePath());
return false;
}
activity.runOnUiThread(new Runnable() {
public void run() {
mProgressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
mProgressDialog.setMessage("Preparing import");
mProgressDialog.show();
}
});
file.createNewFile();
CSVReader csvReader = new CSVReader(new FileReader(file));
String[] temp;
SoulissDBHelper.open();
//forza truncate, ma se non era vuota non stavamo qua
database.truncateImportTables();
SharedPreferences.Editor editor = customSharedPreference.edit();
// sistema configurato
if (customSharedPreference.contains("numNodi"))
editor.remove("numNodi");
if (customSharedPreference.contains("numTipici"))
editor.remove("numTipici");
activity.runOnUiThread(new Runnable() {
public void run() {
mProgressDialog.setMessage("Importing Nodes");
}
});
Thread.sleep(200);
while ((temp = csvReader.readNext()) != null) {
linesNum++;
}
Log.w(Constants.TAG, "Importing " + linesNum + " lines");
csvReader.close();
csvReader = new CSVReader(new FileReader(file));
//import nodes etc.
processCsv(csvReader, editor, linesNum);
editor.apply();
csvReader.close();
Log.i(Constants.TAG, "Import finished");
} catch (IOException e) {
Log.e(Constants.TAG, e.getMessage(), e);
return false;
} catch (Exception es) {
Log.e(Constants.TAG, es.getMessage(), es);
return false;
} finally {
database.close();
mProgressDialog.dismiss();
}
activity.runOnUiThread(new Runnable() {
public void run() {
mProgressDialog.setMessage("Importing Preferences");
}
});
try {
//uguale al dump tranne ultima parte
File filePrefs = new File(importDir, file.getName().substring(0, file.getName().lastIndexOf("_")) + "_SoulissApp.prefs");
SoulissUtils.loadSharedPreferencesFromFile(SoulissApp.getAppContext(), filePrefs);
} catch (Exception e) {
Log.e(Constants.TAG, "Errore import prefs:", e);
}
return true;
}
public File getFile() {
return file;
}
private void insertDashboard(String[] temp) {
try {
LauncherElement reto = new LauncherElement();
reto.setId(Long.parseLong(temp[0]));
reto.setComponentEnum(LauncherElementEnum.valueOf(temp[1]));
reto.setOrder(Short.parseShort(temp[2]));
try {
ISoulissObject assign = null;
if (temp[1].length() > 0 && temp[2].length() == 0) {//nodeId
SoulissNode fat = database.getSoulissNode(Integer.valueOf(temp[1]));
assign = fat;
} else if (temp[2].length() > 0) {//typ
SoulissTypical typ = database.getTypical(Integer.valueOf(temp[1]), Short.valueOf(temp[2]));
assign = typ;
} else if (temp[3].length() > 0) {//typ
SoulissTag tag = database.getTag(Integer.valueOf(temp[3]));
assign = tag;
} else if (temp[4].length() > 0) {//typ
SoulissScene sc = database.getScene(Integer.valueOf(temp[4]));
assign = sc;
} else {
throw new SoulissModelException("Caso non contemplato in immportazione");
}
reto.setLinkedObject(assign);
} catch (Exception e) {
Log.w(Constants.TAG, e.getMessage());
}
try {
if (temp[5].length() > 0)//title
reto.setTitle(temp[5]);
} catch (Exception e) {
Log.w(Constants.TAG, e.getMessage());
}
try {
if (temp[6].length() > 0)//title
reto.setDesc(temp[6]);
} catch (Exception e) {
Log.w(Constants.TAG, e.getMessage());
}
try {
if (temp[7].length() > 0)//title
reto.setIsFullSpan(!"0".equals(temp[7]));
} catch (Exception e) {
Log.w(Constants.TAG, e.getMessage());
}
databaseLauncher.addElement(reto);
} catch (Exception e) {
e.printStackTrace();
}
}
private void insertLog(String[] temp) {
try {
SoulissLogDTO log = new SoulissLogDTO();
log.setLogId(Long.valueOf(temp[0]));
log.setNodeId(Short.valueOf(temp[1]));
log.setSlot(Short.valueOf(temp[2]));
log.setLogValue(Float.valueOf(temp[3]));
Calendar cal = Calendar.getInstance();
cal.setTime(new Date(Long.parseLong(temp[4])));
log.setLogTime(cal);
log.persist();
} catch (Exception e) {
Log.e("skipped log", e.getMessage());
}
}
private void insertNode(String[] temp) {
SoulissNode nit = new SoulissNode(activity, Short.valueOf(temp[1]));
nit.setHealth(Short.valueOf(temp[2]));
try {
nit.setIconResourceId(Integer.valueOf(temp[3]));
} catch (Exception e) {
// null icon
}
try {
nit.setName(temp[4]);
} catch (Exception e) {
// null name
}
try {
Calendar cal = Calendar.getInstance();
cal.setTime(new Date(Long.valueOf(temp[5])));
nit.setRefreshedAt(cal);
} catch (Exception e) {
Log.w("Untimed node", e.getMessage());
}
database.createOrUpdateNode(nit);
}
/*
public static final String[] ALLCOLUMNS_TAGS = {COLUMN_TAG_ID, COLUMN_TAG_NAME,
COLUMN_TAG_ICONID, COLUMN_TAG_IMGPTH, COLUMN_TAG_ORDER};
*/
private void insertTag(String[] temp) {
SoulissTag tIns = new SoulissTag();
tIns.setTagId(Long.parseLong(temp[0]));
try {
if (temp[1].length() > 0)
tIns.setName(temp[1]);
} catch (Exception e) {
Log.w(Constants.TAG, e.getMessage());
}
try {
tIns.setIconResourceId(Integer.valueOf(temp[2]));
} catch (Exception e) {
// NO icon here
}
try {
if (temp[3].length() > 0)
tIns.setImagePath(temp[3]);
} catch (Exception e) {
Log.w(Constants.TAG, e.getMessage());
}
try {
tIns.setTagOrder(Integer.valueOf(temp[4]));
} catch (Exception e) {
Log.w(Constants.TAG, e.getMessage());
}
try {
tIns.setFatherId(Long.valueOf(temp[5]));
} catch (Exception e) {
Log.w(Constants.TAG, e.getMessage());
tIns.setFatherId(null);
}
database.createOrUpdateTag(tIns);
}
/*
public static final String[] ALLCOLUMNS_TAGS_TYPICAL = {COLUMN_TAG_TYP_SLOT,
COLUMN_TAG_TYP_NODE_ID, COLUMN_TAG_TYP_TAG_ID, COLUMN_TAG_TYP_PRIORITY};
*/
private void insertTagTyp(String[] temp) {
try {
SoulissTag hero = database.getTag(Long.parseLong(temp[2]));
SoulissTypical polloTyp = database.getTypical(Short.valueOf(temp[1]), Short.valueOf(temp[0]));
database.createOrUpdateTagTypicalNode(polloTyp, hero, Integer.valueOf(temp[3]));
} catch (SQLDataException e) {
e.printStackTrace();
}
}
private SoulissTypicalDTO insertTypical(String[] temp) {
SoulissTypicalDTO typo = new SoulissTypicalDTO();
typo.setNodeId(Short.valueOf(temp[0]));
typo.setTypical(Short.valueOf(temp[1]));
typo.setSlot(Short.valueOf(temp[2]));
try {
typo.setInput(Byte.valueOf(temp[3]));
} catch (Exception e) {
Log.w("typical W/o input", e.getMessage());
}
typo.setOutput(Short.valueOf(temp[4]));
try {
typo.setIconId(Integer.valueOf(temp[5]));
} catch (Exception e) {
// NO icon here
}
try {
if (temp[6].length() > 0)
typo.setFavourite(temp[6].equals("1"));
} catch (Exception e) {
Log.w("NOT Favourite", e.getMessage());
}
try {
if (temp[7].length() > 0)
typo.setName(temp[7]);
} catch (Exception e) {
Log.w("Unnamed typical", e.getMessage());
}
try {
Calendar cal = Calendar.getInstance();
cal.setTime(new Date(Long.valueOf(temp[8])));
typo.setRefreshedAt(cal);
} catch (Exception e) {
Log.w("Untimed typ", e.getMessage());
}
try {
typo.setWarnDelayMsec(Integer.valueOf(temp[9]));
} catch (Exception e) {
// NO icon here
}
typo.persist();
return typo;
}
@Override
protected void onPostExecute(final Boolean success)
{
if (success) {
String formatStr = activity.getString(R.string.imported_success);
Toast.makeText(activity,
String.format(formatStr, totNodes, tottyp), Toast.LENGTH_SHORT).show();
final Intent preferencesActivity = new Intent(activity, PreferencesActivity.class);
preferencesActivity.putExtra(PreferenceActivity.EXTRA_SHOW_FRAGMENT, DbSettingsFragment.class.getName());
// preferencesActivity.putExtra
// (PreferenceActivity.EXTRA_SHOW_FRAGMENT_ARGUMENTS,com);
preferencesActivity.setAction("db_setup");
preferencesActivity.addFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION);
preferencesActivity.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
activity.startActivity(preferencesActivity);
} else {
Toast.makeText(SoulissApp.getAppContext(), "Import failed", Toast.LENGTH_SHORT).show();
}
}
@Override
protected void onPreExecute()
{
// dialog = new ProgressDialog(context);
// dialog.setMessage("Exporting database...");
// dialog.show();
activity.runOnUiThread(new Runnable() {
public void run() {
mProgressDialog = new ProgressDialog(activity);
mProgressDialog.setIcon(android.R.drawable.ic_dialog_info);
// mProgressDialog.setTitle(SoulissClient.getAppContext().getString(R.string.));
mProgressDialog.setTitle("Importing DB");
}
});
}
private void processCsv(CSVReader csvReader, SharedPreferences.Editor editor, final int lines) throws IOException {
String[] temp;
int loopMode = -1;
while ((temp = csvReader.readNext()) != null) {
// Log.d("Souliss:file import", temp.toString());
if (temp[1].compareToIgnoreCase(SoulissDB.COLUMN_NODE_ID) == 0) {
Log.i(Constants.TAG, "Importing nodes...");
loopMode = PHASE_NODES;
activity.runOnUiThread(new Runnable() {
public void run() {
// lin - 3 head
mProgressDialog.setMax(lines - 3);
}
});
continue;
} else if (temp[0].compareToIgnoreCase(SoulissDB.COLUMN_TYPICAL_NODE_ID) == 0) {
Log.i(Constants.TAG, "Imported " + totNodes + " nodes. Importing typicals...");
editor.putInt("numNodi", totNodes);
loopMode = PHASE_TYPICALS;
activity.runOnUiThread(new Runnable() {
public void run() {
mProgressDialog.setMessage(String.format(activity.getString(R.string.importing_be_patient), activity.getString(R.string.typical)));
}
});
continue;
} else if (temp[0].compareToIgnoreCase(SoulissDB.COLUMN_LOG_ID) == 0) {
editor.putInt("numTipici", database.countTypicals());
Log.i(Constants.TAG, "Imported " + tottyp + " typicals. Importing Logs...");
loopMode = PHASE_LOGS;
activity.runOnUiThread(new Runnable() {
public void run() {
String melo = String.format(activity.getString(R.string.importing_be_patient), activity.getString(R.string.historyof));
mProgressDialog.setMessage(melo);
}
});
continue;
} else if (temp[0].compareToIgnoreCase(SoulissDB.COLUMN_TAG_ID) == 0) {
Log.i(Constants.TAG, "Imported " + tottyp + " typicals. Importing TAGS...");
loopMode = PHASE_TAGS;
activity.runOnUiThread(new Runnable() {
public void run() {
mProgressDialog.setMessage(String.format(activity.getString(R.string.importing_be_patient), activity.getString(R.string.tags)));
}
});
continue;
} else if (temp[0].compareToIgnoreCase(SoulissDB.COLUMN_TAG_TYP_SLOT) == 0) {
Log.i(Constants.TAG, "Imported " + tottyp + " typicals. Importing TAG_TYP...");
loopMode = PHASE_TAG_TYP;
activity.runOnUiThread(new Runnable() {
public void run() {
mProgressDialog.setMessage(String.format(activity.getString(R.string.importing_be_patient), activity.getString(R.string.tags)));
}
});
continue;
} else if (temp[0].compareToIgnoreCase(SoulissDB.COLUMN_LAUNCHER_ID) == 0) {
Log.i(Constants.TAG, "Imported " + tottyp + " typicals. Importing DASHBOARD...");
loopMode = PHASE_DASHB;
activity.runOnUiThread(new Runnable() {
public void run() {
mProgressDialog.setMessage("Importing Dashboard Data, please be patient");
}
});
continue;
}
activity.runOnUiThread(new Runnable() {
public void run() {
mProgressDialog.setProgress(mProgressDialog.getProgress() + 1);
}
});
switch (loopMode) {
case PHASE_NODES:
insertNode(temp);
totNodes++;
break;
case PHASE_TYPICALS:
SoulissTypicalDTO ret = insertTypical(temp);
tottyp++;
break;
case PHASE_LOGS:
insertLog(temp);
break;
case PHASE_TAGS:
insertTag(temp);
break;
case PHASE_TAG_TYP:
insertTagTyp(temp);
break;
case PHASE_DASHB:
insertDashboard(temp);
break;
default:
break;
}
}
}
// can use UI thread here
public void setImportFile(File file) {
this.file = file;
}
}