Added Android code
[wl-app.git] / Android / folioreader / src / main / java / com / folioreader / model / sqlite / HighLightTable.java
diff --git a/Android/folioreader/src/main/java/com/folioreader/model/sqlite/HighLightTable.java b/Android/folioreader/src/main/java/com/folioreader/model/sqlite/HighLightTable.java
new file mode 100755 (executable)
index 0000000..7f6a2d2
--- /dev/null
@@ -0,0 +1,200 @@
+package com.folioreader.model.sqlite;
+
+import android.content.ContentValues;
+import android.database.Cursor;
+import android.text.TextUtils;
+import android.util.Log;
+
+import com.folioreader.Constants;
+import com.folioreader.model.HighLight;
+import com.folioreader.model.HighlightImpl;
+
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+import java.util.Locale;
+import java.util.UUID;
+
+@SuppressWarnings("PMD.AvoidDuplicateLiterals")
+public class HighLightTable {
+    public static final String TABLE_NAME = "highlight_table";
+
+    public static final String ID = "_id";
+    public static final String COL_BOOK_ID = "bookId";
+    private static final String COL_CONTENT = "content";
+    private static final String COL_DATE = "date";
+    private static final String COL_TYPE = "type";
+    private static final String COL_PAGE_NUMBER = "page_number";
+    private static final String COL_PAGE_ID = "pageId";
+    private static final String COL_RANGY = "rangy";
+    private static final String COL_NOTE = "note";
+    private static final String COL_UUID = "uuid";
+
+    public static final String SQL_CREATE = "CREATE TABLE IF NOT EXISTS " + TABLE_NAME + " ( " + ID
+            + " INTEGER PRIMARY KEY AUTOINCREMENT" + ","
+            + COL_BOOK_ID + " TEXT" + ","
+            + COL_CONTENT + " TEXT" + ","
+            + COL_DATE + " TEXT" + ","
+            + COL_TYPE + " TEXT" + ","
+            + COL_PAGE_NUMBER + " INTEGER" + ","
+            + COL_PAGE_ID + " TEXT" + ","
+            + COL_RANGY + " TEXT" + ","
+            + COL_UUID + " TEXT" + ","
+            + COL_NOTE + " TEXT" + ")";
+
+    public static final String SQL_DROP = "DROP TABLE IF EXISTS " + TABLE_NAME;
+
+    public static final String TAG = HighLightTable.class.getSimpleName();
+
+    public static ContentValues getHighlightContentValues(HighLight highLight) {
+        ContentValues contentValues = new ContentValues();
+        contentValues.put(COL_BOOK_ID, highLight.getBookId());
+        contentValues.put(COL_CONTENT, highLight.getContent());
+        contentValues.put(COL_DATE, getDateTimeString(highLight.getDate()));
+        contentValues.put(COL_TYPE, highLight.getType());
+        contentValues.put(COL_PAGE_NUMBER, highLight.getPageNumber());
+        contentValues.put(COL_PAGE_ID, highLight.getPageId());
+        contentValues.put(COL_RANGY, highLight.getRangy());
+        contentValues.put(COL_NOTE, highLight.getNote());
+        contentValues.put(COL_UUID, highLight.getUUID());
+        return contentValues;
+    }
+
+
+    public static ArrayList<HighlightImpl> getAllHighlights(String bookId) {
+        ArrayList<HighlightImpl> highlights = new ArrayList<>();
+        Cursor highlightCursor = DbAdapter.getHighLightsForBookId(bookId);
+        while (highlightCursor.moveToNext()) {
+            highlights.add(new HighlightImpl(highlightCursor.getInt(highlightCursor.getColumnIndex(ID)),
+                    highlightCursor.getString(highlightCursor.getColumnIndex(COL_BOOK_ID)),
+                    highlightCursor.getString(highlightCursor.getColumnIndex(COL_CONTENT)),
+                    getDateTime(highlightCursor.getString(highlightCursor.getColumnIndex(COL_DATE))),
+                    highlightCursor.getString(highlightCursor.getColumnIndex(COL_TYPE)),
+                    highlightCursor.getInt(highlightCursor.getColumnIndex(COL_PAGE_NUMBER)),
+                    highlightCursor.getString(highlightCursor.getColumnIndex(COL_PAGE_ID)),
+                    highlightCursor.getString(highlightCursor.getColumnIndex(COL_RANGY)),
+                    highlightCursor.getString(highlightCursor.getColumnIndex(COL_NOTE)),
+                    highlightCursor.getString(highlightCursor.getColumnIndex(COL_UUID))));
+        }
+        return highlights;
+    }
+
+    public static HighlightImpl getHighlightId(int id) {
+        Cursor highlightCursor = DbAdapter.getHighlightsForId(id);
+        HighlightImpl highlightImpl = new HighlightImpl();
+        while (highlightCursor.moveToNext()) {
+            highlightImpl = new HighlightImpl(highlightCursor.getInt(highlightCursor.getColumnIndex(ID)),
+                    highlightCursor.getString(highlightCursor.getColumnIndex(COL_BOOK_ID)),
+                    highlightCursor.getString(highlightCursor.getColumnIndex(COL_CONTENT)),
+                    getDateTime(highlightCursor.getString(highlightCursor.getColumnIndex(COL_DATE))),
+                    highlightCursor.getString(highlightCursor.getColumnIndex(COL_TYPE)),
+                    highlightCursor.getInt(highlightCursor.getColumnIndex(COL_PAGE_NUMBER)),
+                    highlightCursor.getString(highlightCursor.getColumnIndex(COL_PAGE_ID)),
+                    highlightCursor.getString(highlightCursor.getColumnIndex(COL_RANGY)),
+                    highlightCursor.getString(highlightCursor.getColumnIndex(COL_NOTE)),
+                    highlightCursor.getString(highlightCursor.getColumnIndex(COL_UUID)));
+
+        }
+        return highlightImpl;
+    }
+
+    public static long insertHighlight(HighlightImpl highlightImpl) {
+        highlightImpl.setUUID(UUID.randomUUID().toString());
+        return DbAdapter.saveHighLight(getHighlightContentValues(highlightImpl));
+    }
+
+    public static boolean deleteHighlight(String rangy) {
+        String query = "SELECT " + ID + " FROM " + TABLE_NAME + " WHERE " + COL_RANGY + " = '" + rangy + "'";
+        int id = DbAdapter.getIdForQuery(query);
+        return id != -1 && deleteHighlight(id);
+    }
+
+    public static boolean deleteHighlight(int highlightId) {
+        return DbAdapter.deleteById(TABLE_NAME, ID, String.valueOf(highlightId));
+    }
+
+    public static List<String> getHighlightsForPageId(String pageId) {
+        String query = "SELECT " + COL_RANGY + " FROM " + TABLE_NAME + " WHERE " + COL_PAGE_ID + " = '" + pageId + "'";
+        Cursor c = DbAdapter.getHighlightsForPageId(query, pageId);
+        List<String> rangyList = new ArrayList<>();
+        while (c.moveToNext()) {
+            rangyList.add(c.getString(c.getColumnIndex(COL_RANGY)));
+        }
+        c.close();
+        return rangyList;
+    }
+
+    public static boolean updateHighlight(HighlightImpl highlightImpl) {
+        return DbAdapter.updateHighLight(getHighlightContentValues(highlightImpl), String.valueOf(highlightImpl.getId()));
+    }
+
+    public static String getDateTimeString(Date date) {
+        SimpleDateFormat dateFormat = new SimpleDateFormat(
+                Constants.DATE_FORMAT, Locale.getDefault());
+        return dateFormat.format(date);
+    }
+
+    public static Date getDateTime(String date) {
+        SimpleDateFormat dateFormat = new SimpleDateFormat(
+                Constants.DATE_FORMAT, Locale.getDefault());
+        Date date1 = new Date();
+        try {
+            date1 = dateFormat.parse(date);
+        } catch (ParseException e) {
+            Log.e(TAG, "Date parsing failed", e);
+        }
+        return date1;
+    }
+
+    public static HighlightImpl updateHighlightStyle(String rangy, String style) {
+        String query = "SELECT " + ID + " FROM " + TABLE_NAME + " WHERE " + COL_RANGY + " = '" + rangy + "'";
+        int id = DbAdapter.getIdForQuery(query);
+        if (id != -1 && update(id, updateRangy(rangy, style), style.replace("highlight_", ""))) {
+            return getHighlightId(id);
+        }
+        return null;
+    }
+
+    public static HighlightImpl getHighlightForRangy(String rangy) {
+        String query = "SELECT " + ID + " FROM " + TABLE_NAME + " WHERE " + COL_RANGY + " = '" + rangy + "'";
+        return getHighlightId(DbAdapter.getIdForQuery(query));
+    }
+
+    private static String updateRangy(String rangy, String style) {
+        /*Pattern p = Pattern.compile("\\highlight_\\w+");
+        Matcher m = p.matcher(rangy);
+        return m.replaceAll(style);*/
+        String[] s = rangy.split("\\$");
+        StringBuilder builder = new StringBuilder();
+        for (String p : s) {
+            if (TextUtils.isDigitsOnly(p)) {
+                builder.append(p);
+                builder.append('$');
+            } else {
+                builder.append(style);
+                builder.append('$');
+            }
+        }
+        return builder.toString();
+    }
+
+    private static boolean update(int id, String s, String color) {
+        HighlightImpl highlightImpl = getHighlightId(id);
+        highlightImpl.setRangy(s);
+        highlightImpl.setType(color);
+        return DbAdapter.updateHighLight(getHighlightContentValues(highlightImpl), String.valueOf(id));
+    }
+
+    public static void saveHighlightIfNotExists(HighLight highLight) {
+        String query = "SELECT " + ID + " FROM " + TABLE_NAME + " WHERE " + COL_UUID + " = '" + highLight.getUUID() + "'";
+        int id = DbAdapter.getIdForQuery(query);
+        if (id == -1) {
+            DbAdapter.saveHighLight(getHighlightContentValues(highLight));
+        }
+    }
+}
+
+
+