package com.vladstoick.DataModel; import android.app.Application; import android.content.Context; import android.content.SharedPreferences; import android.util.Log; import com.android.volley.Request; import com.android.volley.Response; import com.android.volley.VolleyError; import com.android.volley.toolbox.JsonObjectRequest; import com.android.volley.toolbox.StringRequest; import com.google.android.gms.internal.r; import com.loopj.android.http.AsyncHttpClient; import com.loopj.android.http.AsyncHttpResponseHandler; import com.loopj.android.http.RequestParams; import com.squareup.otto.Subscribe; import com.vladstoick.DialogFragment.RenameDialogFragment; import com.vladstoick.OttoBus.BusProvider; import com.vladstoick.OttoBus.DataLoadedEvent; import com.vladstoick.OttoBus.NewsItemLoadedEvent; import com.vladstoick.OttoBus.SearchResultsEvent; import com.vladstoick.Utils.Utils; import com.vladstoick.stiridinromania.StiriApp; import org.json.JSONArray; import org.json.JSONObject; import java.util.ArrayList; /** * Created by vlad on 7/20/13. */ public class NewsDataSource { private static NewsDataSource instance; public int unparsedFeeds = 0; public ArrayList<NewsSource> feeds; public boolean isDataLoaded = true; public ArrayList<Integer> unreadIds; public AsyncHttpClient client; private String BASE_URL = "http://37.139.26.80/user/"; private int userId; private String token; private SqlHelper sqlHelper; //CONSTRUCTORS //0. constructor is called //1. loadUnreadNews is called //2. loadGroupsAndSources is called; //3. Once groups and sourcesa are added loadNewsItems in called //4. For each news source getNewsItems is being called //5. after they are done addNewsSourceInDb is called public NewsDataSource(Application app, SharedPreferences settings) { this.userId = settings.getInt("user_id", 0); this.token = settings.getString("key", ""); if (Utils.isOnline(app)) { loadFeeds(); loadData(); } sqlHelper = new SqlHelper(app); BusProvider.getInstance().register(this); NewsDataSource.instance = this; } public static NewsDataSource getInstance(){ return instance; } public static void setInstance(NewsDataSource newsDataSource){ instance = newsDataSource; } public void loadFeeds(){ JsonObjectRequest jsonObjectRequest = new JsonObjectRequest("http://37.139.26.80/newssource", null, new Response.Listener<JSONObject>() { @Override public void onResponse(JSONObject jsonObject) { feeds = JSONParsing.parseFeeds(jsonObject); loadData(); } }, new Response.ErrorListener() { @Override public void onErrorResponse(VolleyError volleyError) { volleyError.printStackTrace(); } }); StiriApp.queue.add(jsonObjectRequest); } public void loadData() { loadUnreadNews(); } public void loadUnreadNews() { JsonObjectRequest jsonObjectRequest = new JsonObjectRequest(BASE_URL + userId + "/unread" + Utils.tokenWithoutAnd(token), null, new Response.Listener<JSONObject>() { @Override public void onResponse(JSONObject jsonObject) { unreadIds = JSONParsing.parseUnreadIds(jsonObject); loadGroupsAndSources(); } }, new Response.ErrorListener() { @Override public void onErrorResponse(VolleyError volleyError) { volleyError.printStackTrace(); } } ); StiriApp.queue.add(jsonObjectRequest); } public void loadGroupsAndSources() { isDataLoaded = false; StringRequest request = new StringRequest(Request.Method.GET, BASE_URL + userId + Utils.tokenWithoutAnd(token), new Response.Listener<String>() { @Override public void onResponse(String s) { ArrayList<NewsGroup> allNewsGroups = JSONParsing.parseNewsDataSource(s); sqlHelper.deleteOldNewsGroupsAndSources(allNewsGroups); for (int i = 0; i < allNewsGroups.size(); i++) { for (int j = 0; j < allNewsGroups.get(i).newsSources.size(); j++) { sqlHelper.insertNewsSourceInDb(allNewsGroups.get(i).newsSources.get(j)); unparsedFeeds++; } sqlHelper.insertNewsGroupInDb(allNewsGroups.get(i)); } loadNewsItems(); isDataLoaded = true; } }, new Response.ErrorListener() { @Override public void onErrorResponse(VolleyError volleyError) { volleyError.printStackTrace(); } } ); StiriApp.queue.add(request); } public void loadNewsItems() { ArrayList<NewsSource> newsSources = sqlHelper.getAllNewsSources(); for (int j = 0; j < newsSources.size(); j++) { NewsSource ns = newsSources.get(j); getNewsItems(ns); } } public void getNewsItems(NewsSource ns) { String url = NewsSource.BASE_URL + ns.getId(); // +"&date="+dateString; StringRequest stringRequest = new StringRequest( Request.Method.GET, url, new Response.Listener<String>() { @Override public void onResponse(String response) { addNewsSourceInDb(response); } }, new Response.ErrorListener() { @Override public void onErrorResponse(VolleyError volleyError) { volleyError.printStackTrace(); } } ); StiriApp.queue.add(stringRequest); } public void addNewsSourceInDb(String response) { try { JSONObject jsonObject = new JSONObject(response); String sFeedId = jsonObject.getString("feedId"); int feedId = Integer.parseInt(sFeedId); JSONArray feedArray = jsonObject.getJSONArray("articles"); ArrayList<NewsItem> newsItems = JSONParsing.parseFeed(feedArray); NewsSource ns = getNewsSource(feedId); ns.news = newsItems; sqlHelper.insertNewsSourceInDb(ns); sqlHelper.insertNewsItemsInDb(ns); newsItems = sqlHelper.getNewsItems(ns.getId()); for (int i = 0; i < newsItems.size(); i++) if (newsItems.get(i).getDescription() == "null") paperizeNewsItem(newsItems.get(i)); BusProvider.getInstance().post(new DataLoadedEvent(DataLoadedEvent.TAG_NEWSDATASOURCE_MODIFIED)); unparsedFeeds--; if (unparsedFeeds == 0) { sqlHelper.updateUnreadNews(unreadIds); BusProvider.getInstance().post(new DataLoadedEvent( DataLoadedEvent.TAG_NEWSDATASOURCE)); } } catch (Exception e) { e.printStackTrace(); } } //MULTIPLE @Subscribe public void renameElement(RenameDialogFragment.ElementRenamedEvent event) { String url; if (event.type == RenameDialogFragment.GROUP_TAG) { sqlHelper.renameNewsGroup(event); url = BASE_URL + userId + "/" + event.id; } else { sqlHelper.renameNewsSource(event); NewsSource ns = getNewsSource(event.id); url = BASE_URL + userId + "/" + ns.getGroupId() + "/" + ns.getId(); } StringRequest request = new StringRequest(Request.Method.PUT, url + Utils.tokenWithoutAnd(token) + "&title=" + event.newName, new Response.Listener<String>() { @Override public void onResponse(String s) { } }, new Response.ErrorListener() { @Override public void onErrorResponse(VolleyError volleyError) { volleyError.printStackTrace(); } } ); StiriApp.queue.add(request); BusProvider.getInstance().post(new DataLoadedEvent( DataLoadedEvent.TAG_NEWSDATASOURCE_MODIFIED)); } public void addNewsGroupAndNewsSource(final String groupTitle, final NewsSource ns) { StringRequest request = new StringRequest(Request.Method.POST, BASE_URL + userId + Utils.tokenWithoutAnd(token) + "&title=" + groupTitle, new Response.Listener<String>() { @Override public void onResponse(String s) { NewsGroup ng = new NewsGroup(groupTitle, JSONParsing.parseAddNewsGroupResponse(s)); sqlHelper.insertNewsGroupInDb(ng); addNewsSource(ns, ng.getId()); BusProvider.getInstance().post(new DataLoadedEvent(DataLoadedEvent.TAG_NEWSDATASOURCE_MODIFIED)); } }, new Response.ErrorListener() { @Override public void onErrorResponse(VolleyError volleyError) { volleyError.printStackTrace(); } } ); StiriApp.queue.add(request); } //NEWSGROUP public ArrayList<NewsGroup> getAllNewsGroups() { return sqlHelper.getAllNewsGroups(); } public NewsGroup getNewsGroup(int id) { return sqlHelper.getNewsGroup(id); } public void deleteNewsGroup(final int id) { sqlHelper.deleteNewsGroup(id); BusProvider.getInstance().post(new DataLoadedEvent( DataLoadedEvent.TAG_NEWSDATASOURCE_MODIFIED)); StringRequest request = new StringRequest(Request.Method.DELETE, BASE_URL + userId + "/" + id + Utils.tokenWithoutAnd(token), new Response.Listener<String>() { @Override public void onResponse(String s) { } }, new Response.ErrorListener() { @Override public void onErrorResponse(VolleyError volleyError) { volleyError.printStackTrace(); } } ); StiriApp.queue.add(request); } //NewsSource public NewsSource getNewsSource(int id) { return sqlHelper.getNewsSource(id); } public void addNewsSource(final NewsSource newsSource, final int groupId) { StringRequest request = new StringRequest(Request.Method.POST, BASE_URL + userId + "/" + groupId + Utils.tokenWithoutAnd(token) + "&url=" + newsSource.getRssLink(), new Response.Listener<String>() { @Override public void onResponse(String s) { JSONParsing.parseAddNewsSource(newsSource, s); newsSource.setGroupId(groupId); sqlHelper.insertNewsSourceInDb(newsSource); getNewsItems(newsSource); sqlHelper.updateNewsGroupNoFeeds(groupId); } }, new Response.ErrorListener() { @Override public void onErrorResponse(VolleyError volleyError) { volleyError.printStackTrace(); } } ); StiriApp.queue.add(request); } public void deleteNewsSource(NewsSource ns) { sqlHelper.deleteNewsSource(ns.getId()); sqlHelper.updateNewsGroupNoFeeds(ns.getGroupId()); BusProvider.getInstance().post(new DataLoadedEvent( DataLoadedEvent.TAG_NEWSDATASOURCE_MODIFIED)); String url = BASE_URL + userId + "/" + ns.getGroupId() + "/" + ns.getId() + Utils.tokenWithoutAnd(token); StringRequest request = new StringRequest(Request.Method.DELETE, url, new Response.Listener<String>() { @Override public void onResponse(String s) { } }, new Response.ErrorListener() { @Override public void onErrorResponse(VolleyError volleyError) { volleyError.printStackTrace(); } } ); StiriApp.queue.add(request); } public int getNumberOfNewsForNewsSource(int id) { return sqlHelper.getNumberOfNewsForNewsSource(id); } //NEWSITEM public void makeNewsRead(String url, int newsId) { StringRequest request = new StringRequest(Request.Method.DELETE, BASE_URL + userId + "/unread?article_id=" + newsId + Utils.tokenWithAnd(token) , new Response.Listener<String>() { @Override public void onResponse(String s) { } }, new Response.ErrorListener() { @Override public void onErrorResponse(VolleyError volleyError) { volleyError.printStackTrace(); } } ); StiriApp.queue.add(request); sqlHelper.makeNewsRead(url); } public NewsItem getNewsItem(String url) { return sqlHelper.getNewsItem(url); } public ArrayList<NewsItem> searchNewsItemsLocal(String query) { return sqlHelper.searchNewsItem(query); } public void searchNewsItemOnline(final String query) { String url = "http://37.139.8.146:8983/solr/collection1/select?start=0&rows=20" + "&wt=json&indent=true&fl=title,content,url&q=description:" + query; JsonObjectRequest request = new JsonObjectRequest(Request.Method.GET, url, null, new Response.Listener<JSONObject>() { @Override public void onResponse(JSONObject jobj) { ArrayList<NewsItem> searchResults = JSONParsing.parseSearchResults(jobj); BusProvider.getInstance() .post(new SearchResultsEvent(searchResults, query)); } }, new Response.ErrorListener() { @Override public void onErrorResponse(VolleyError volleyError) { volleyError.printStackTrace(); } } ); StiriApp.queue.add(request); } public void paperizeNewsItem(NewsItem ni) { String url = "http://37.139.8.146:8080/?url=" + ni.getUrlLink(); JsonObjectRequest request = new JsonObjectRequest(Request.Method.GET, url, null, new Response.Listener<JSONObject>() { @Override public void onResponse(JSONObject jsonObject) { try { String url = jsonObject.getString("url"); addPaperizedStringToNewsItem(url, jsonObject.getString("response")); BusProvider.getInstance().post( new NewsItemLoadedEvent(getNewsItem(url))); } catch (Exception e) { e.printStackTrace(); } } }, new Response.ErrorListener() { @Override public void onErrorResponse(VolleyError volleyError) { volleyError.printStackTrace(); } } ); StiriApp.queue.add(request); } public void addPaperizedStringToNewsItem(String url, String paperized) { sqlHelper.updateNewsItem(url, paperized); } }