package com.masterofcode.android.magreader.bookmarks; import java.util.ArrayList; import java.util.Collections; import java.util.List; import org.kroz.activerecord.ActiveRecordBase; import org.kroz.activerecord.ActiveRecordException; import org.kroz.activerecord.EntitiesHelper; import android.app.Activity; import android.content.Context; import android.util.Log; import com.masterofcode.android.magreader.application.JtjApplication; import com.masterofcode.android.magreader.db.entity.BookmarksItem; import com.masterofcode.android.magreader.db.entity.FeedItem; import com.masterofcode.android.magreader.utils.constants.Constants; public class BookmarksManager<curBookmark> { private static BookmarksManager instance = null; private ActiveRecordBase dbBookmarks; public BookmarksManager() { super(); this.dbBookmarks = JtjApplication.getInstance().getBookmarksDatabase(); } static public BookmarksManager GetInstance() { if(instance==null) { instance = new BookmarksManager(); } return instance; } public boolean removeBookmark(BookmarksItem bookmark) { if (bookmark==null) return false; if(bookmark.item_type==Constants.BOOKMARKS_ITEM_TYPE_FEED) { FeedItem feedItem = bookmark.feedItem; if (feedItem==null) return false; feedItem.isBookmarked = false; try { ActiveRecordBase _db = JtjApplication.getInstance().getDatabase(); if(!_db.isOpen())_db.open(); feedItem.update(); //_db.close(); } catch (ActiveRecordException e1) { e1.printStackTrace(); return false; } } else if(bookmark.item_type==Constants.BOOKMARKS_ITEM_TYPE_MAGAZINE) { } else return false; // remove bookmark from db try { if(!dbBookmarks.isOpen()) dbBookmarks.open(); bookmark.delete(); dbBookmarks.close(); } catch (ActiveRecordException e) { e.printStackTrace(); return false; } return true; } private void removeBookmarks(Context context, List<BookmarksItem> bookmarks) { if (bookmarks==null) return; // remove bookmarks from db try { if(!dbBookmarks.isOpen()) dbBookmarks.open(); for(BookmarksItem curBookmark : bookmarks) { curBookmark.delete(); } dbBookmarks.close(); } catch (ActiveRecordException e) { e.printStackTrace(); } } public void BoomarkFeed(Context context, FeedItem feedItem) { BookmarksItem newBookmark = new BookmarksItem(feedItem.channel_id, feedItem.guid); try { if(!dbBookmarks.isOpen()) dbBookmarks.open(); BookmarksItem newDbBookmark = dbBookmarks.newEntity(BookmarksItem.class); EntitiesHelper.copyFieldsWithoutID(newDbBookmark, newBookmark); newDbBookmark.save(); dbBookmarks.close(); } catch (ActiveRecordException e) { e.printStackTrace(); } // Log.i("---", "bookmark feed with title="+feedItem.title); feedItem.isBookmarked = true; feedItem.bookmarking_date = newBookmark.bookmarking_date; try { feedItem.update(); } catch (ActiveRecordException e1) { e1.printStackTrace(); } setFeedsBookmarkedStatus(context, feedItem.guid, newBookmark.bookmarking_date); } private void setFeedsBookmarkedStatus(Context context, String guid, long date) { // TODO: all feeds with this uuid will be marked as bookmarked ActiveRecordBase database; database = ((JtjApplication) ((Activity)context).getApplication()).getDatabase(); try { List<FeedItem> feeds = database.find(FeedItem.class, "GUID=?", new String [] { String.valueOf(guid) }); for(FeedItem current : feeds) { current.isBookmarked = true; current.bookmarking_date = date; current.update(); } } catch (ActiveRecordException e) { e.printStackTrace(); } } public void BookmarkMagazine(String magazine_title, String magazine_name, String magazine_path, String magazine_cover_path, String magazine_topic_path, String magazine_topic_title, int topic_index, float topic_offset) { BookmarksItem newBookmark = new BookmarksItem(magazine_title, magazine_name, magazine_path, magazine_cover_path, magazine_topic_path, magazine_topic_title, topic_index, topic_offset); try { if(!dbBookmarks.isOpen()) dbBookmarks.open(); BookmarksItem newDbBookmark = dbBookmarks.newEntity(BookmarksItem.class); EntitiesHelper.copyFieldsWithoutID(newDbBookmark, newBookmark); newDbBookmark.save(); dbBookmarks.close(); } catch (ActiveRecordException e) { e.printStackTrace(); } Log.i("---", "bookmark topic path="+magazine_topic_path); } public ArrayList<Integer> queryBookmarkedTopics(String magazineName) { try { if(!dbBookmarks.isOpen()) dbBookmarks.open(); List<BookmarksItem> bookmarks = dbBookmarks.find(BookmarksItem.class, false, "ITEMTYPE=? AND MAGAZINENAME=?", new String[] { String.valueOf(Constants.BOOKMARKS_ITEM_TYPE_MAGAZINE), magazineName }, null, null, "BOOKMARKINGDATE DESC", null); dbBookmarks.close(); ArrayList<Integer> result = new ArrayList<Integer>(); for(BookmarksItem cur : bookmarks) { result.add(Integer.valueOf(cur.magazine_topic_index)); } return result; } catch (ActiveRecordException e) { e.printStackTrace(); } return null; } public List<BookmarksItem> queryBookmarkedMagazines(Context context) { try { if(!dbBookmarks.isOpen()) dbBookmarks.open(); List<BookmarksItem> bookmarks = dbBookmarks.find(BookmarksItem.class, false, "ITEMTYPE=?", new String[] { String.valueOf(Constants.BOOKMARKS_ITEM_TYPE_MAGAZINE) }, null, null, "BOOKMARKINGDATE DESC", null); dbBookmarks.close(); return bookmarks; } catch (ActiveRecordException e) { e.printStackTrace(); } return null; } public List<BookmarksItem> queryBookmarkedFeedsAndMagazines(Context context) { List<BookmarksItem> bookmarkedFeeds = queryBookmarkedFeeds(context); List<BookmarksItem> bookmarkedMagazines = queryBookmarkedMagazines(context); if(bookmarkedFeeds!=null) { if(bookmarkedMagazines!=null) { bookmarkedFeeds.addAll(bookmarkedMagazines); Collections.sort(bookmarkedFeeds); return bookmarkedFeeds; } else { return bookmarkedFeeds; // there is no bookmaked magazines } } else { return bookmarkedMagazines; // if no bookmarked feeds, returns bookmarked magazines (or null, if no magazines) } } public List<BookmarksItem> queryBookmarkedFeeds(Context context) { ActiveRecordBase _db; List<FeedItem> bookmarkedFeeds = null; List<BookmarksItem> bookmarks = null; // getting bookmarked feeds from feeds database _db = JtjApplication.getInstance().getDatabase(); try { if(!_db.isOpen())_db.open(); bookmarkedFeeds = _db.find(FeedItem.class, false, "IS_BOOKMARKED=?", new String[] { "true" }, null, null, "BOOKMARKINGDATE DESC", null); //_db.close(); } catch (ActiveRecordException e) { e.printStackTrace(); } // getting bookmarked objects from bookmarks database try { if(!dbBookmarks.isOpen()) dbBookmarks.open(); bookmarks = dbBookmarks.find(BookmarksItem.class, false, "ITEMTYPE=?", new String[] { String.valueOf(Constants.BOOKMARKS_ITEM_TYPE_FEED) }, null, null, "BOOKMARKINGDATE DESC", null); dbBookmarks.close(); for(BookmarksItem cur : bookmarks) { Log.i("---", "bookmarked feed, channel_id="+cur.channel_id+", guid="+cur.guid); } } catch (ActiveRecordException e) { e.printStackTrace(); } // set feed objects for according bookmarks objects if(bookmarkedFeeds!=null && bookmarks!=null) { int normalItemsCount = 0; for(BookmarksItem curBookmark : bookmarks) { FeedItem appropriateFeedItem = null; for(FeedItem curFeedItem : bookmarkedFeeds) { if(curFeedItem.channel_id.equalsIgnoreCase(curBookmark.channel_id) && curFeedItem.guid.equalsIgnoreCase(curBookmark.guid)) { appropriateFeedItem = curFeedItem; break; } } if(appropriateFeedItem!=null) { curBookmark.setFeedItem(appropriateFeedItem); normalItemsCount++; } } if(normalItemsCount==bookmarks.size() && normalItemsCount>0) return bookmarks; if(normalItemsCount>0) { List<BookmarksItem> result = new ArrayList<BookmarksItem>(normalItemsCount); for(BookmarksItem curBookmark : bookmarks) { if(curBookmark.getFeedItem()!=null) result.add(curBookmark); } return result; } } return null; } public boolean isMagazineHasBookmarks(Context context, String magazineName) { try { if(!dbBookmarks.isOpen()) dbBookmarks.open(); List<BookmarksItem> bookmarks = dbBookmarks.find(BookmarksItem.class, false, "ITEMTYPE=? AND MAGAZINENAME=?", new String[] { String.valueOf(Constants.BOOKMARKS_ITEM_TYPE_MAGAZINE), magazineName }, null, null, "BOOKMARKINGDATE DESC", null); dbBookmarks.close(); if(bookmarks!=null) { if(bookmarks.size()>0) { return true; } } return false; } catch (ActiveRecordException e) { e.printStackTrace(); } return false; } public void removeMagazineBookmarks(Context context, String magazineName) { try { if(!dbBookmarks.isOpen()) dbBookmarks.open(); List<BookmarksItem> bookmarks = dbBookmarks.find(BookmarksItem.class, false, "ITEMTYPE=? AND MAGAZINENAME=?", new String[] { String.valueOf(Constants.BOOKMARKS_ITEM_TYPE_MAGAZINE), magazineName }, null, null, "BOOKMARKINGDATE DESC", null); dbBookmarks.close(); removeBookmarks(context, bookmarks); } catch (ActiveRecordException e) { e.printStackTrace(); } } }