package it.demo.twitterlike.android.application;
import it.demo.twitterlike.android.service.TwitterLikeService;
import it.demo.twitterlike.android.service.inmemory.InMemoryTwitterLikeService;
import it.demo.twitterlike.android.ui.R;
import it.demo.twitterlike.android.ui.fragments.LoginSettingFragment;
import it.demo.twitterlike.android.ui.utils.Constants;
import it.demo.twitterlike.rest.api.MessageOperations;
import it.demo.twitterlike.rest.api.TwitterLike;
import it.demo.twitterlike.rest.api.UserOperations;
import it.demo.twitterlike.rest.api.UserProfile;
import it.demo.twitterlike.rest.api.util.UrlUtils;
import it.demo.twitterlike.rest.connect.TwitterLikeConnectionFactory;
import java.net.Proxy;
import java.net.ProxySelector;
import java.net.URI;
import java.util.List;
import org.springframework.security.crypto.encrypt.AndroidEncryptors;
import org.springframework.social.connect.Connection;
import org.springframework.social.connect.ConnectionRepository;
import org.springframework.social.connect.DuplicateConnectionException;
import org.springframework.social.connect.sqlite.SQLiteConnectionRepository;
import org.springframework.social.connect.sqlite.support.SQLiteConnectionRepositoryHelper;
import org.springframework.social.connect.support.ConnectionFactoryRegistry;
import org.springframework.social.oauth2.AccessGrant;
import org.springframework.util.CollectionUtils;
import org.springframework.util.LinkedMultiValueMap;
import org.springframework.util.MultiValueMap;
import android.app.Application;
import android.content.SharedPreferences;
import android.content.SharedPreferences.OnSharedPreferenceChangeListener;
import android.database.sqlite.SQLiteOpenHelper;
import android.preference.PreferenceManager;
import android.util.Log;
//@ReportsCrashes(formUri = "http://www.bugsense.com/api/acra?api_key=7af2cb25", formKey="")
public class MainApplication extends Application implements
OnSharedPreferenceChangeListener {
private static final int DEFAULT_CONNECTION_TIMEOUT = 5000;
private ConnectionFactoryRegistry connectionFactoryRegistry;
private SQLiteOpenHelper repositoryHelper;
private ConnectionRepository connectionRepository;
private TwitterLike remoteService;
private TwitterLikeService twitterLikeService;
private SharedPreferences preferences;
public static final String TAG = MainApplication.class.getSimpleName();
// ***************************************
// Application Methods
// ***************************************
@Override
public void onCreate() {
// ACRA.init(this);
preferences = PreferenceManager.getDefaultSharedPreferences(this);
preferences.registerOnSharedPreferenceChangeListener(this);
initConnectionConfiguration();
}
protected void clearConnectioConfiguration() {
this.connectionFactoryRegistry = null;
this.connectionRepository = null;
this.remoteService = null;
this.twitterLikeService = null;
}
protected Proxy findProxy(String url) {
Proxy result = null;
try {
ProxySelector defaultProxySelector = ProxySelector.getDefault();
List<Proxy> proxyList = defaultProxySelector.select(new URI(url));
if (!CollectionUtils.isEmpty(proxyList)) {
result = proxyList.iterator().next();
}
} catch (Exception e) {
Log.e(Constants.LOGTAG_USER_LOGIN,
"Error getting proxy list for url " + url, e);
}
return result;
}
protected void initConnectionConfiguration() {
this.connectionFactoryRegistry = new ConnectionFactoryRegistry();
this.connectionFactoryRegistry
.addConnectionFactory(new TwitterLikeConnectionFactory(UrlUtils
.appendUrls(getAppUrl() + "rest/api/"), getAppUrl(),
getAppId(), getAppSecret()));
// set up the database and encryption
this.repositoryHelper = new SQLiteConnectionRepositoryHelper(this);
this.connectionRepository = new SQLiteConnectionRepository(
this.repositoryHelper, this.connectionFactoryRegistry,
AndroidEncryptors.text("password", "5c0744940b5c369b"));
}
// ***************************************
// Private methods
// ***************************************
private String getAppId() {
return getString(R.string.ordermanagement_app_id);
}
private String getAppSecret() {
return getString(R.string.ordermanagement_app_secret);
}
private int getConnectionTimeout() {
String result = getString(R.string.network_connection_timeout);
try {
if (result != null) {
return Integer.parseInt(result);
}
} catch (Exception e) {
}
return DEFAULT_CONNECTION_TIMEOUT;
}
private String getAppUrl() {
String result = LoginSettingFragment.getConnectionAddress(this,
preferences);
return result;
}
// ***************************************
// Public methods
// ***************************************
private ConnectionRepository getConnectionRepository() {
if (connectionRepository == null) {
initConnectionConfiguration();
}
return this.connectionRepository;
}
private ConnectionFactoryRegistry getConnectionFactoryRegistry() {
if (connectionFactoryRegistry == null) {
initConnectionConfiguration();
}
return this.connectionFactoryRegistry;
}
public void disconnect() {
getConnectionRepository().removeConnections(
getConnectionFactory().getProviderId());
this.remoteService = null;
this.twitterLikeService = null;
}
public UserProfile getAuthenticatedUser() {
UserProfile result = null;
Connection<?> connection = getConnectionRepository()
.findPrimaryConnection(TwitterLike.class);
if (connection != null && !connection.hasExpired()) {
result = getTwitterLikeService().getAuthenticatedUser();
}
return result;
}
public boolean isAuthenticated() {
return getAuthenticatedUser() != null;
}
public void authenticate(String username, String password) {
ConnectionRepository connectionRepository = getConnectionRepository();
TwitterLikeConnectionFactory connectionFactory = getConnectionFactory();
String prettyPrintUser = "[" + username + "] ";
Log.v(Constants.LOGTAG_USER_LOGIN, prettyPrintUser
+ "Try Authenticating User with password " + password);
disconnect();
MultiValueMap<String, String> formData2 = new LinkedMultiValueMap<String, String>();
formData2.add("scope", getString(R.string.ordermanagement_scope));
MultiValueMap<String, String> additionalParameters = new LinkedMultiValueMap<String, String>();
AccessGrant grant = connectionFactory.getOAuthOperations()
.exchangeCredentialsForAccess(username, password,
additionalParameters);
if (grant != null) {
Connection<TwitterLike> connection = connectionFactory
.createConnection(grant);
try {
// persist connection to the repository
connectionRepository.addConnection(connection);
initializeServices();
} catch (DuplicateConnectionException e) {
// connection already exists in repository!
Log.d(TAG, e.getLocalizedMessage(), e);
}
}
}
public TwitterLikeService getTwitterLikeService() {
if (twitterLikeService == null) {
TwitterLike twitterLike = getConnectionRepository()
.findPrimaryConnection(TwitterLike.class).getApi();
this.twitterLikeService = InMemoryTwitterLikeService.getInstance(
this, twitterLike);
}
return twitterLikeService;
}
public MessageOperations getMessageOperations() {
if (remoteService == null) {
initializeServices();
}
return this.remoteService == null ? null : this.remoteService
.messageOperations();
}
public UserOperations getUserOperations() {
if (remoteService == null) {
initializeServices();
}
return this.remoteService == null ? null : this.remoteService
.userOperations();
}
protected TwitterLike initializeServices() {
this.remoteService = getConnectionRepository().findPrimaryConnection(
TwitterLike.class).getApi();
return remoteService;
}
public TwitterLikeConnectionFactory getConnectionFactory() {
return (TwitterLikeConnectionFactory) getConnectionFactoryRegistry()
.getConnectionFactory(TwitterLike.class);
}
@Override
public void onSharedPreferenceChanged(SharedPreferences sharedPreferences,
String key) {
if (LoginSettingFragment.supports(key)) {
clearConnectioConfiguration();
}
}
}