/*
* 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.twitter;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.net.Uri;
import android.util.Log;
import com.android.dataframework.DataFramework;
import com.android.dataframework.Entity;
import com.javielinux.tweettopics2.R;
import com.javielinux.utils.ImageUtils;
import com.javielinux.utils.Utils;
import twitter4j.Twitter;
import twitter4j.TwitterException;
import twitter4j.TwitterFactory;
import twitter4j.User;
import twitter4j.auth.AccessToken;
import twitter4j.auth.RequestToken;
import twitter4j.conf.Configuration;
import twitter4j.conf.ConfigurationBuilder;
import java.io.FileOutputStream;
import java.io.IOException;
import java.net.URL;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
public class ConnectionManager {
interface TwitterAuthentication {
void onFinalizeOAuthentication();
}
private static final String KEY_AUTH_KEY = "auth_key";
private static final String KEY_AUTH_SECRET_KEY = "auth_secret_key";
private static Context context;
private static ConnectionManager instance;
private final String CALLBACKURL = "t4joauth://main";
private Twitter userForSearchesTwitter;
private HashMap<Long, Twitter> twitters = new HashMap<Long, Twitter>();
private Twitter twitterOAuth;
private RequestToken requestTokenOAuth;
private AccessToken accessTokenOAuth;
private String oAuthAccessToken;
private String oAuthAccessTokenSecret;
private List<Entity> users = new ArrayList<Entity>();
private ConnectionManager() {};
public static ConnectionManager getInstance() {
if (instance == null) {
instance = new ConnectionManager();
}
return instance;
}
public void loadUsers() {
users = DataFramework.getInstance().getEntityList("users");
}
public Entity getUserById(long id) {
if (users.size() == 0) {
loadUsers();
}
for (Entity user : users) {
if (user.getId() == id) {
return user;
}
}
return null;
}
public static void destroyInstance() {
instance = null;
}
public void open(Context cnt) {
context = cnt;
// loadFromDB();
}
public Twitter getTwitter(long id) {
if (!twitters.containsKey(id)) {
twitters.put(id, loadUser(id));
}
return twitters.get(id);
}
public Twitter getUserForSearchesTwitter() {
if (userForSearchesTwitter ==null) {
loadUserForSearches();
}
return userForSearchesTwitter;
}
public void loadFromDB() {
for (Entity user: users) {
if (!twitters.containsKey(user.getId())) {
twitters.put(user.getId(), loadUser(user.getId()));
}
}
}
public void forceLoadFromDB() {
twitters.clear();
loadFromDB();
}
private void loadUserForSearches() {
try {
DataFramework.getInstance().open(context, Utils.packageName);
} catch (Exception e) {
e.printStackTrace();
}
Entity user = DataFramework.getInstance().getTopEntity("users", "use_for_searches = 1", "");
if (user == null) {
user = DataFramework.getInstance().getTopEntity("users", "service is null or service = \"twitter.com\"", "");
user.setValue("use_for_searches", 1);
user.save();
}
userForSearchesTwitter = loadUser(user.getId());
DataFramework.getInstance().close();
}
/*
public void setNetworkConfig(String networkType) {
NetworkConfigParser parser = new NetworkConfigParser();
List<NetworkConfig> networkConfigs = parser.parse(context.getResources().getXml(R.xml.network_config));
for (NetworkConfig c : networkConfigs) {
if(c.getName().equals(networkType)) {
config = c;
break;
}
}
currentNetwork = networkType;
try {
System.setProperty("twitter4j.oauth.consumerKey", config.getConsumerKey());
System.setProperty("twitter4j.oauth.consumerSecret", config.getConsumerSecret());
System.setProperty("twitter4j.oauth.accessTokenURL", config.getAccessTokenURL());
System.setProperty("twitter4j.oauth.authorizationURL", config.getAuthorizationURL());
System.setProperty("twitter4j.oauth.requestTokenURL", config.getRequestTokenURL());
System.setProperty("twitter4j.restBaseURL", config.getRestBaseURL());
System.setProperty("twitter4j.searchBaseURL", config.getSearchBaseURL());
System.setProperty("twitter4j.oauth.authenticationURL", config.getAuthenticationURL());
} catch (NullPointerException e) {
e.printStackTrace();
}
}
*/
public NetworkConfig getNetworkConfig() {
NetworkConfig config = null;
NetworkConfigParser parser = new NetworkConfigParser();
List<NetworkConfig> networkConfigs = parser.parse(context.getResources().getXml(R.xml.network_config));
for (NetworkConfig c : networkConfigs) {
if(c.getName().equals("twitter.com")) {
config = c;
break;
}
}
return config;
}
public Configuration getConfiguration() {
NetworkConfig config = getNetworkConfig();
ConfigurationBuilder configurationBuilder = new ConfigurationBuilder();
configurationBuilder.setOAuthConsumerKey(config.getConsumerKey());
configurationBuilder.setOAuthConsumerSecret(config.getConsumerSecret());
configurationBuilder.setUseSSL(true);
return configurationBuilder.build();
}
public String getAuthenticationURL() throws TwitterException {
NetworkConfig config = getNetworkConfig();
twitterOAuth = new TwitterFactory().getInstance();
twitterOAuth.setOAuthConsumer(config.getConsumerKey(), config.getConsumerSecret());
requestTokenOAuth = twitterOAuth.getOAuthRequestToken();//AuthorizationActivity.TWITTER_HOST);
Log.d(Utils.TAG, "Redirigiendo a " + requestTokenOAuth.getAuthorizationURL());
return requestTokenOAuth.getAuthorizationURL();
}
public void finalizeOAuthentication(final Uri uri, final TwitterAuthentication twitterAuthentication) {
new Thread(new Runnable() {
@Override
public void run() {
try {
String verifier = uri.getQueryParameter("oauth_verifier");
accessTokenOAuth = twitterOAuth.getOAuthAccessToken(requestTokenOAuth,verifier);
oAuthAccessToken = accessTokenOAuth.getToken();
oAuthAccessTokenSecret = accessTokenOAuth.getTokenSecret();
twitterOAuth.setOAuthAccessToken(accessTokenOAuth);
storeAccessToken(twitterOAuth);
twitterAuthentication.onFinalizeOAuthentication();
} catch (TwitterException e) {
e.printStackTrace();
}
}
}).start();
}
private void storeAccessToken(Twitter twitter) {
try {
DataFramework.getInstance().open(context, Utils.packageName);
} catch (Exception e) {
e.printStackTrace();
}
String where = KEY_AUTH_KEY + " = '" + accessTokenOAuth.getToken() + "' AND " + KEY_AUTH_SECRET_KEY + " = '" + accessTokenOAuth.getTokenSecret() + "'";
List<Entity> e = DataFramework.getInstance().getEntityList("users", where);
if (e.size()==0) {
DataFramework.getInstance().getDB().execSQL("UPDATE users SET active = 0");
Entity ent = new Entity("users");
ent.setValue("service", "twitter.com");
try {
ent.setValue("name", twitter.getScreenName());
ent.setValue("fullname", twitter.showUser(twitter.getId()).getName());
ent.setValue("user_id", twitter.getId());
ent.setValue(KEY_AUTH_KEY, accessTokenOAuth.getToken());
ent.setValue(KEY_AUTH_SECRET_KEY, accessTokenOAuth.getTokenSecret());
} catch (IllegalStateException e1) {
e1.printStackTrace();
} catch (TwitterException e1) {
e1.printStackTrace();
}
ent.setValue("active", 1);
ent.setValue("last_timeline_id", 0);
ent.setValue("last_mention_id", 0);
ent.setValue("last_direct_id", 0);
ent.save();
loadUsers();
try {
User user = twitter.showUser(ent.getInt("user_id"));
Bitmap avatar = BitmapFactory.decodeStream(new Utils.FlushedInputStream(new URL(user.getProfileImageURL()).openStream()));
if (avatar!=null) {
String file = ImageUtils.getFileAvatar(ent.getId());
FileOutputStream out = new FileOutputStream(file);
avatar.compress(Bitmap.CompressFormat.JPEG, 90, out);
avatar.recycle();
}
} catch (IllegalStateException ex) {
ex.printStackTrace();
} catch (TwitterException ex) {
ex.printStackTrace();
} catch (IOException ex) {
ex.printStackTrace();
} catch (Exception ex) {
ex.printStackTrace();
}
}
DataFramework.getInstance().close();
}
public Twitter loadUser(long id) {
Twitter twitter = null;
Entity ent = getUserById(id);
if (ent!=null) {
// comprobamos si no es facebook
/*
if (ent.getString("service")!=null) {
if (ent.getString("service").equals("facebook")) {
ent = DataFramework.getInstance().getTopEntity("users", "service is null or service = \"twitter.com\"", "");
ent.setValue("active", 1);
ent.save();
}
}
*/
String service = ent.getString("service");
if (service.equals("")) service = "twitter.com";
//setNetworkConfig(service);
String accessToken = ent.getString(KEY_AUTH_KEY);
String accessTokenSecret = ent.getString(KEY_AUTH_SECRET_KEY);
// ConfigurationBuilder configurationBuilder = new ConfigurationBuilder();
// configurationBuilder.setOAuthConsumerKey(accessToken);
// configurationBuilder.setOAuthConsumerSecret(accessTokenSecret);
// configurationBuilder.setUseSSL(true);
// Configuration configuration = configurationBuilder.build();
// twitter = new TwitterFactory(configuration).getInstance();
AccessToken at = new AccessToken(accessToken, accessTokenSecret);
twitter = new TwitterFactory(getConfiguration()).getInstance(at);
Log.d(Utils.TAG, "Cargado " + ent.getString("name") + " desde twitter");
}
return twitter;
}
public String getCALLBACKURL() {
return CALLBACKURL;
}
public RequestToken getRequestTokenOAuth() {
return requestTokenOAuth;
}
public AccessToken getAccessTokenOAuth() {
return accessTokenOAuth;
}
public String getOAuthToken() {
return oAuthAccessToken;
}
public String getOAuthTokenSecret() {
return oAuthAccessTokenSecret;
}
}