package it.angelic.soulissclient.model.db;
import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.util.Log;
import java.sql.SQLDataException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
import it.angelic.soulissclient.Constants;
import it.angelic.soulissclient.R;
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.util.LauncherElementEnum;
/**
* Classe helper per l'esecuzione di interrogazioni al DB, Inserimenti eccetera
*
* @author Ale
*/
public class SoulissDBLauncherHelper extends SoulissDBHelper {
private static final String MAP = "map";
// private static SharedPreferences prefs = MyApplication.getContext().getSharedPreferences(PREFS_NAME, Context.MODE_PRIVATE);
private static List<LauncherElement> launcherElementList;
private final Context context;
public SoulissDBLauncherHelper(Context context) {
super(context);
this.context = context;
open();
// Database fields
launcherElementList = getDBLauncherElements(context);
///init sse vuoto
if (launcherElementList.isEmpty()) {
List<LauncherElement> launcherElementtemp = getDefaultStaticDBLauncherElements();
for (LauncherElement lau : launcherElementtemp) {
try {
Log.w(Constants.TAG, "Launcher empty, adding def: " + lau.getTitle());
addElement(lau);
} catch (SoulissModelException e) {
e.printStackTrace();
}
}
// preferences.edit().putStringSet("launcher_elems", visibili).apply();
}
recomputeOrder();
}
public LauncherElement addElement(LauncherElement lau) throws SoulissModelException {
launcherElementList.add(lau);
recomputeOrder();
long id = createLauncherElement(lau);
lau.setId(id);
//SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(context);
Log.i(Constants.TAG, "tile creato: " + lau.getId() + " = " + lau.getTitle());
return lau;
}
/**
* campi singoli altrimenti side effects
*
* @param nodeIN
* @return
*/
private long createLauncherElement(LauncherElement nodeIN) throws SoulissModelException {
ContentValues values = fillcontentValues(nodeIN);
// int upd = database.update(SoulissDB.TABLE_LAUNCHER, values, SoulissDB.COLUMN_LAUNCHER_ID + " = " + nodeIN.getSceneId(),
// null);
// if (upd == 0) {
long insertId = database.insert(SoulissDB.TABLE_LAUNCHER, null, values);
// }
return insertId;
}
private int deleteLauncher(LauncherElement toRename) {
if (!database.isOpen())
open();
return database.delete(SoulissDB.TABLE_LAUNCHER, SoulissDB.COLUMN_LAUNCHER_ID + " = " + toRename.getId(), null);
}
private List<LauncherElement> getDBLauncherElements(Context context) {
List<LauncherElement> comments = new ArrayList<>();
if (!database.isOpen())
open();
Cursor cursor = database.query(SoulissDB.TABLE_LAUNCHER, SoulissDB.ALLCOLUMNS_LAUNCHER,
null, null, null, null, SoulissDB.COLUMN_LAUNCHER_ORDER + ", " + SoulissDB.COLUMN_LAUNCHER_ID);
cursor.moveToFirst();
while (!cursor.isAfterLast()) {
LauncherElement dto = new LauncherElement();
dto.setId(cursor.getLong(cursor.getColumnIndex(SoulissDB.COLUMN_LAUNCHER_ID)));
dto.setTitle(cursor.getString(cursor.getColumnIndex(SoulissDB.COLUMN_LAUNCHER_TITLE)));
dto.setDesc(cursor.getString(cursor.getColumnIndex(SoulissDB.COLUMN_LAUNCHER_DESC)));
dto.setOrder(cursor.getShort(cursor.getColumnIndex(SoulissDB.COLUMN_LAUNCHER_ORDER)));
dto.setIsFullSpan(cursor.getInt(cursor.getColumnIndex(SoulissDB.COLUMN_LAUNCHER_FULL_SPAN)) == 1);
dto.setComponentEnum(LauncherElementEnum.values()[cursor.getInt(cursor.getColumnIndex(SoulissDB.COLUMN_LAUNCHER_TYPE))]);
ISoulissObject isoulissObj = null;
switch (dto.getComponentEnum()) {
case STATIC_LOCATION:
//dto.setDesc(context.getString(R.string.opt_homepos_err));
break;
case STATIC_MANUAL:
int cntTyp = countTypicals();
int cntN = countNodes();
dto.setDesc(context.getResources().getQuantityString(R.plurals.Nodes,
cntN, cntN)
+ "\n"
+ context.getResources().getQuantityString(R.plurals.Devices,
cntTyp, cntTyp));
break;
case STATIC_TAGS:
dto.setDesc(context.getResources().getQuantityString(R.plurals.tags_plur,
countTags(), countTags()));
break;
case STATIC_SCENES:
dto.setDesc(context.getResources().getQuantityString(R.plurals.scenes_plur,
countScenes(), countScenes()) + " " + context.getString(R.string.string_configured));
break;
case STATIC_PROGRAMS:
dto.setDesc(context.getResources().getQuantityString(R.plurals.programs_plur,
countTriggers(), countTriggers()));//FIXME count progs
break;
case NODE:
isoulissObj = getSoulissNode(cursor.getInt(cursor.getColumnIndex(SoulissDB.COLUMN_LAUNCHER_NODE_ID)));
break;
case TYPICAL:
isoulissObj = getTypical(cursor.getInt(cursor.getColumnIndex(SoulissDB.COLUMN_LAUNCHER_NODE_ID)),
cursor.getShort(cursor.getColumnIndex(SoulissDB.COLUMN_LAUNCHER_SLOT_ID)));
break;
case TAG:
try {
isoulissObj = getTag(cursor.getLong(cursor.getColumnIndex(SoulissDB.COLUMN_LAUNCHER_TAG_ID)));
} catch (SQLDataException e) {
e.printStackTrace();
}
break;
case SCENE:
isoulissObj = getScene(cursor.getInt(cursor.getColumnIndex(SoulissDB.COLUMN_LAUNCHER_SCENE_ID)));
break;
default:
break;
}
dto.setLinkedObject(isoulissObj);
Log.d(Constants.TAG, "retrieving LAUNCHER item:" + dto.getTitle() + " ID:" + dto.getId() + " ORDER:" + dto.getOrder());
comments.add(dto);
cursor.moveToNext();
}
cursor.close();
return comments;
}
public List<LauncherElement> getDefaultStaticDBLauncherElements() {
List<LauncherElement> ret = new ArrayList<>();
LauncherElement scenari = new LauncherElement(LauncherElementEnum.STATIC_SCENES);
scenari.setTitle(context.getString(R.string.scenes_title));
scenari.setOrder((short) 0);
scenari.setDesc(context.getResources().getQuantityString(R.plurals.scenes_plur,
countScenes(), countScenes()) + " " + context.getString(R.string.string_configured));
ret.add(scenari);
LauncherElement prob = new LauncherElement(LauncherElementEnum.STATIC_TAGS);
prob.setDesc(context.getResources().getQuantityString(R.plurals.tags_plur,
countTags(), countTags()));
prob.setTitle(context.getString(R.string.tags));
prob.setOrder((short) 1);
ret.add(prob);
LauncherElement prop = new LauncherElement(LauncherElementEnum.STATIC_STATUS);
prop.setTitle(context.getString(R.string.status_souliss));
prop.setIsFullSpan(true);
prop.setOrder((short) 2);
ret.add(prop);
LauncherElement man = new LauncherElement(LauncherElementEnum.STATIC_MANUAL);
man.setTitle(context.getString(R.string.manual_typicals));
man.setOrder((short) 3);
int tNodes = countNodes();
man.setDesc(tNodes + context.getResources().getQuantityString(R.plurals.Nodes,
tNodes, tNodes));
ret.add(man);
LauncherElement pro = new LauncherElement(LauncherElementEnum.STATIC_PROGRAMS);
pro.setTitle(context.getString(R.string.programs_title));
pro.setOrder((short) 4);
pro.setDesc(context.getResources().getQuantityString(R.plurals.programs_plur,
countTriggers(), countTriggers()));//FIXME count progs
ret.add(pro);
LauncherElement loc = new LauncherElement(LauncherElementEnum.STATIC_LOCATION);
loc.setTitle(context.getString(R.string.position));
loc.setOrder((short) 5);
loc.setDesc("");//dopo
ret.add(loc);
return ret;
}
public List<LauncherElement> getLauncherItems(Context context) {
Collections.sort(launcherElementList, new Comparator<LauncherElement>() {
@Override
public int compare(final LauncherElement lhs, LauncherElement rhs) {
return lhs.getOrder() - rhs.getOrder();
}
});
// sorted by order from DB
return launcherElementList;
}
private void recomputeOrder() {
for (int t = 0; t < launcherElementList.size(); t++) {
launcherElementList.get(t).setOrder((short) t);
}
}
public void refreshMapFromDB() {
Log.d(Constants.TAG, "refresh launcher from DB");
launcherElementList = getDBLauncherElements(context);
recomputeOrder();
}
public void remove(LauncherElement launcherElement) {
launcherElementList.remove(launcherElement);
deleteLauncher(launcherElement);
//non serve togliero, la lista e` in sottrazione
//visibili.remove("" + launcherElement.getId());
//preferences.edit().putStringSet("launcher_elems", visibili).apply();
recomputeOrder();
}
public void updateLauncherElement(LauncherElement nodeIN) {
try {
if (launcherElementList.contains(nodeIN)) {
updateLauncherElementImpl(nodeIN);
launcherElementList.set(launcherElementList.indexOf(nodeIN), nodeIN);
recomputeOrder();
} else {
throw new SoulissModelException("Nodo non trovato: " + nodeIN.getTitle());
}
} catch (SoulissModelException e) {
Log.e(Constants.TAG, e.getMessage());
}
}
/**
* campi singoli altrimenti side effects
*
* @param nodeIN
* @return
*/
private long updateLauncherElementImpl(LauncherElement nodeIN) throws SoulissModelException {
// wrap values from object
ContentValues values = fillcontentValues(nodeIN);
int upd = database.update(SoulissDB.TABLE_LAUNCHER, values, SoulissDB.COLUMN_LAUNCHER_ID + " = " + nodeIN.getId(),
null);
if (upd == 0) {
Log.e(Constants.TAG, "updateLauncherElement() NO ROW UPDATED!!");
}
return upd;
}
private ContentValues fillcontentValues(LauncherElement nodeIN) {
ContentValues values = new ContentValues();
values.put(SoulissDB.COLUMN_LAUNCHER_ID, nodeIN.getId());
values.put(SoulissDB.COLUMN_LAUNCHER_TITLE, nodeIN.getTitle());
values.put(SoulissDB.COLUMN_LAUNCHER_DESC, nodeIN.getDesc());
values.put(SoulissDB.COLUMN_LAUNCHER_TYPE, nodeIN.getComponentEnum().ordinal());
values.put(SoulissDB.COLUMN_LAUNCHER_ORDER, nodeIN.getOrder());
values.put(SoulissDB.COLUMN_LAUNCHER_FULL_SPAN, nodeIN.isFullSpan() ? 1 : 0);
if (nodeIN.getLinkedObject() != null) {
if (nodeIN.getLinkedObject() instanceof SoulissNode)
values.put(SoulissDB.COLUMN_LAUNCHER_NODE_ID, ((SoulissNode) nodeIN.getLinkedObject()).getNodeId());
else if (nodeIN.getLinkedObject() instanceof SoulissTypical) {
values.put(SoulissDB.COLUMN_LAUNCHER_NODE_ID, ((SoulissTypical) nodeIN.getLinkedObject()).getNodeId());
values.put(SoulissDB.COLUMN_LAUNCHER_SLOT_ID, ((SoulissTypical) nodeIN.getLinkedObject()).getSlot());
} else if (nodeIN.getLinkedObject() instanceof SoulissScene)
values.put(SoulissDB.COLUMN_LAUNCHER_SCENE_ID, ((SoulissScene) nodeIN.getLinkedObject()).getSceneId());
else if (nodeIN.getLinkedObject() instanceof SoulissTag)
values.put(SoulissDB.COLUMN_LAUNCHER_TAG_ID, ((SoulissTag) nodeIN.getLinkedObject()).getTagId());
else
throw new SoulissModelException("Missing ISoulissObject cast");
}
return values;
}
}