/*
* Copyright 2012 Javier Pérez Pacheco and Francisco Díaz Rodriguez
* TweetTopics 2.0
* javielinux@gmail.com
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.javielinux.database;
import android.content.ContentValues;
import android.content.Context;
import android.content.SharedPreferences;
import android.database.Cursor;
import android.location.Location;
import android.preference.PreferenceManager;
import android.util.Log;
import com.android.dataframework.DataFramework;
import com.android.dataframework.Entity;
import com.javielinux.infos.InfoSaveTweets;
import com.javielinux.tweettopics2.R;
import com.javielinux.twitter.ConnectionManager;
import com.javielinux.utils.LocationUtils;
import com.javielinux.utils.Utils;
import twitter4j.*;
import java.util.ArrayList;
public class EntitySearch extends Entity {
/*
public static int TYPE_SICELASTID_NOUSE = 0;
public static int TYPE_SICELASTID_NORMAL = 1;
public static int TYPE_SICELASTID_NOTIFICATIONS = 2;
*/
private String mErrorLastQuery = "";
public EntitySearch() {
super("search");
}
public EntitySearch(Long id) {
super("search", id);
}
public boolean isUser() {
if (!this.getString("words_and").equals("")) {
return false;
}
if (!this.getString("words_or").equals("")) {
return false;
}
if (!this.getString("words_not").equals("")) {
return false;
}
if (!this.getString("lang").equals("")) {
return false;
}
if (!this.getString("source").equals("")) {
return false;
}
if (!this.getString("to_user").equals("")) {
return false;
}
if (this.getInt("attitude")!=0) {
return false;
}
if (this.getInt("filter")!=0) {
return false;
}
if (this.getInt("use_geo")!=0) {
return false;
}
if (!this.getString("from_user").equals("")) {
return true;
}
return false;
}
public String getErrorLastQuery() {
return mErrorLastQuery;
}
public int getValueNewCount() {
if (getInt("notifications")==1) {
return DataFramework.getInstance().getEntityListCount("tweets", "search_id = " + this.getId()
+ " AND favorite = 0 AND tweet_id >'" + Utils.fillZeros(""+getString("last_tweet_id"))+"'");
} else {
return 0;
}
}
public void setValueLastId(String id) {
setValue("last_tweet_id", id);
}
public void setValueLastIdNotification(String id) {
setValue("last_tweet_id_notifications", id);
}
public long getValueLastId() {
return getLong("last_tweet_id");
}
public long getValueLastIdNotification() {
return getLong("last_tweet_id_notifications");
}
public InfoSaveTweets saveTweets(Context cnt, boolean saveNotifications, long since_id) {
ConnectionManager.getInstance().open(cnt);
Twitter twitter = ConnectionManager.getInstance().getUserForSearchesTwitter();
InfoSaveTweets out = new InfoSaveTweets();
try {
int nResult = DataFramework.getInstance().getEntityListCount("tweets", "favorite=0 and search_id="+getId());
Query query = getQuery(cnt);
if (since_id != -1)
query.setSinceId(since_id);
QueryResult result = twitter.search(query);
ArrayList<Status> tweets = (ArrayList<Status>)result.getTweets();
if (tweets.size()>0) {
out.setNewMessages(tweets.size());
out.setNewerId(tweets.get(0).getId());
out.setOlderId(tweets.get(tweets.size()-1).getId());
if (saveNotifications) {
setValue("new_tweets_count",getInt("new_tweets_count")+tweets.size());
save();
}
Log.d(Utils.TAG,tweets.size()+" mensajes nuevos en "+getString("name"));
long fisrtId = 1;
Cursor c = DataFramework.getInstance().getCursor("tweets", new String[]{DataFramework.KEY_ID},
null, null, null, null, DataFramework.KEY_ID + " desc", "1");
if (!c.moveToFirst()) {
c.close();
fisrtId = 1;
} else {
long Id = c.getInt(0) + 1;
c.close();
fisrtId = Id;
}
for (int i=tweets.size()-1; i>=0; i--) {
/*String sql = "INSERT INTO 'tweets' (" + DataFramework.KEY_ID + ", search_id, url_avatar, username, user_id, tweet_id,"
+ "text, source, to_username, to_user_id, date, favorite) VALUES (" + fisrtId + "," + getId()
+ ",'" +tweets.get(i).getProfileImageUrl() + "','"+tweets.get(i).getFromUser()+"','"
+ tweets.get(i).getFromUserId() + "','" + tweets.get(i).getId() + "','" + tweets.get(i).getText()
+ "','" + tweets.get(i).getSource() + "','"+tweets.get(i).getToUser()
+"','"+tweets.get(i).getToUserId()+"','"+String.valueOf(tweets.get(i).getCreatedAt().getTime())
+ "',0);\n";*/
User u = tweets.get(i).getUser();
ContentValues args = new ContentValues();
args.put(DataFramework.KEY_ID, "" + fisrtId);
args.put("search_id", "" + getId());
if (u.getProfileImageURL()!=null) {
args.put("url_avatar", u.getProfileImageURL().toString());
} else {
args.put("url_avatar", "");
}
args.put("username", u.getScreenName());
args.put("fullname", u.getName());
args.put("user_id", "" + u.getId());
args.put("tweet_id", Utils.fillZeros("" + tweets.get(i).getId()));
args.put("text", tweets.get(i).getText());
args.put("source", tweets.get(i).getSource());
args.put("to_username", tweets.get(i).getInReplyToScreenName());
args.put("to_user_id", "" + tweets.get(i).getInReplyToUserId());
args.put("date", String.valueOf(tweets.get(i).getCreatedAt().getTime()));
if (tweets.get(i).getGeoLocation()!=null) {
args.put("latitude", tweets.get(i).getGeoLocation().getLatitude());
args.put("longitude", tweets.get(i).getGeoLocation().getLongitude());
}
args.put("favorite", "0");
DataFramework.getInstance().getDB().insert("tweets", null, args);
fisrtId++;
}
if (saveNotifications) {
setValue("last_tweet_id_notifications",tweets.get(0).getId()+"");
save();
}
int total = nResult+tweets.size();
if (total>Utils.MAX_ROW_BYSEARCH) {
Log.d(Utils.TAG,"Limpiando base de datos");
String date = DataFramework.getInstance().getEntityList("tweets", "favorite=0 and search_id="+getId(), "date desc").get(Utils.MAX_ROW_BYSEARCH).getString("date");
String sqldelete = "DELETE FROM tweets WHERE favorite=0 AND search_id="+getId() + " AND date < '" + date + "'";
DataFramework.getInstance().getDB().execSQL(sqldelete);
}
}
} catch (TwitterException e) {
e.printStackTrace();
RateLimitStatus rate = e.getRateLimitStatus();
if (rate!=null) {
out.setError(Utils.LIMIT_ERROR);
out.setRate(rate);
} else {
out.setError(Utils.UNKNOWN_ERROR);
}
} catch (Exception e) {
e.printStackTrace();
out.setError(Utils.UNKNOWN_ERROR);
}
return out;
}
public Query getQuery(Context cnt) {
String q = this.getString("words_and");
if (!this.getString("words_or").equals("")) {
q += Utils.getQuotedText(this.getString("words_or"), "OR ", false);
}
if (!this.getString("words_not").equals("")) {
q += Utils.getQuotedText(this.getString("words_not"), "-", true);
}
if (!this.getString("from_user").equals("")) {
q+=" from:"+this.getString("from_user");
}
if (!this.getString("to_user").equals("")) {
q+=" to:"+this.getString("to_user");
}
if (!this.getString("source").equals("")) {
q+=" source:"+this.getString("source");
}
if (this.getInt("attitude")==1) q+=" :)";
if (this.getInt("attitude")==2) q+=" :(";
String modLinks = "filter:links";
String websVideos = "twitvid OR youtube OR vimeo OR youtu.be";
String webPhotos = "lightbox.com OR mytubo.net OR imgur.com OR instagr.am OR twitpic OR yfrog OR plixi OR twitgoo OR img.ly OR picplz OR lockerz";
if (this.getInt("filter")==1) q+=" " + modLinks;
if (this.getInt("filter")==2) q+=" " + webPhotos + " " + modLinks;
if (this.getInt("filter")==3) q+=" " + websVideos + " " + modLinks;
if (this.getInt("filter")==4) q+=" " + websVideos + " OR " + webPhotos + " " + modLinks;
if (this.getInt("filter")==5) q+=" source:twitterfeed " + modLinks;
if (this.getInt("filter")==6) q+=" ?";
if (this.getInt("filter")==7) q+=" market.android.com OR androidzoom.com OR androlib.com OR appbrain.com OR bubiloop.com OR yaam.mobi OR slideme.org " + modLinks;
Log.d(Utils.TAG, "Buscando: "+q);
Query query = new Query(q);
if (this.getInt("use_geo")==1) {
if (this.getInt("type_geo")==0) { // coordenadas del mapa
GeoLocation gl = new GeoLocation(this.getDouble("latitude"), this.getDouble("longitude"));
String unit = Query.KILOMETERS;
if (this.getInt("type_distance")==0) unit = Query.MILES;
query.setGeoCode(gl, this.getDouble("distance"), unit);
}
if (this.getInt("type_geo")==1) { // coordenadas del gps
Location loc = LocationUtils.getLastLocation(cnt);
if (loc!=null) {
GeoLocation gl = new GeoLocation(loc.getLatitude(), loc.getLongitude());
String unit = Query.KILOMETERS;
if (this.getInt("type_distance")==0) unit = Query.MILES;
query.setGeoCode(gl, this.getDouble("distance"), unit);
} else {
mErrorLastQuery = cnt.getString(R.string.no_location);
}
}
}
PreferenceManager.setDefaultValues(cnt, R.xml.preferences, false);
SharedPreferences preference = PreferenceManager.getDefaultSharedPreferences(cnt);
int count = Integer.parseInt(preference.getString("prf_n_max_download", "60"));
if (count <= 0) count = 60;
query.setCount(count);
String lang = "";
if (!this.getString("lang").equals("")) lang = this.getString("lang");
if (!lang.equals("all")) query.setLang(lang);
// obtener desde donde quiero hacer la consulta
if (getInt("notifications")==1) {
String where = "search_id = " + this.getId() + " AND favorite = 0";
int nResult = DataFramework.getInstance().getEntityListCount("tweets", where);
if (nResult>0) {
long mLastIdNotification = DataFramework.getInstance().getTopEntity("tweets", where, "date desc").getLong("tweet_id");
query.setSinceId(mLastIdNotification);
}
}
//query.setResultType(Query.POPULAR);
return query;
}
}