/* * Copyright (c) 2012 Socialize Inc. * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal * in the Software without restriction, including without limitation the rights * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell * copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN * THE SOFTWARE. */ package com.socialize.config; import android.content.Context; import com.socialize.log.ExternalLogger; import com.socialize.log.SocializeLogger; import com.socialize.util.ResourceLocator; import com.socialize.util.StringUtils; import java.io.IOException; import java.io.InputStream; import java.util.Map.Entry; import java.util.Properties; import java.util.Set; /** * @author Jason Polites */ public class SocializeConfig { public static final String SOCIALIZE_PROPERTIES_PATH = "socialize.properties"; public static final String DEFAULT_PROPERTIES_PATH = "default.socialize.properties"; public static final String SOCIALIZE_CORE_BEANS_PATH = "socialize_core_beans.xml"; public static final String SOCIALIZE_UI_BEANS_PATH = "socialize_ui_beans.xml"; public static final String SOCIALIZE_NOTIFICATION_BEANS_PATH = "socialize_notification_beans.xml"; public static final String SOCIALIZE_ERRORS_PATH = "socialize.errors.properties"; public static final String SOCIALIZE_CONSUMER_KEY = "socialize.consumer.key"; public static final String SOCIALIZE_CONSUMER_SECRET = "socialize.consumer.secret"; public static final String SOCIALIZE_CHECK_NOTIFICATIONS = "socialize.check.notifications"; public static final String SOCIALIZE_NOTIFICATION_APP_ICON = "socialize.notification.app.icon"; /** * Time between duplicate gcm registration requests */ public static final String GCM_REGISTRATION_INTERVAL = "gcm.registration.interval"; public static final String GCM_REGISTRATION_ENABLED = "gcm.registration.enabled"; public static final String SOCIALIZE_NOTIFICATIONS_INTERVAL = "socialize.notification.request.interval"; public static final String SOCIALIZE_NOTIFICATIONS_ENABLED = "socialize.notification.enabled"; @Deprecated public static final String SOCIALIZE_C2DM_SENDER_ID = "socialize.c2dm.sender.id"; public static final String SOCIALIZE_GCM_SENDER_ID = "socialize.gcm.sender.id"; public static final String SOCIALIZE_CUSTOM_GCM_SENDER_ID = "socialize.custom.gcm.sender.id"; public static final String SOCIALIZE_ENTITY_LOADER = "socialize.entity.loader"; public static final String SOCIALIZE_LOCATION_ENABLED = "socialize.location.enabled"; public static final String SOCIALIZE_REQUIRE_AUTH = "socialize.require.auth"; public static final String SOCIALIZE_EXTERNAL_LOGS_ENABLED = "socialize.external.logs.enabled"; @Deprecated public static final String SOCIALIZE_REQUIRE_SHARE = "socialize.require.share"; public static final String SOCIALIZE_ALLOW_ANON = "socialize.allow.anon"; public static final String SOCIALIZE_ALLOW_ANON_COMMENT = "socialize.allow.anon.comments"; public static final String SOCIALIZE_ALLOW_NEVER_AUTH = "socialize.allow.never.auth"; public static final String SOCIALIZE_EVENTS_AUTH_ENABLED = "socialize.events.auth.enabled"; public static final String SOCIALIZE_EVENTS_SHARE_ENABLED = "socialize.events.share.enabled"; public static final String SOCIALIZE_SHOW_COMMENT_LIST_ON_NOTIFY = "socialize.comments.on.notify"; public static final String SOCIALIZE_SHOW_COMMENT_HEADER = "socialize.show.comment.header"; public static final String SOCIALIZE_PROMPT_SHARE = "socialize.prompt.share"; public static final String SOCIALIZE_ALLOW_DELETE_COMMENT = "socialize.allow.delete.comment"; public static final String GOOGLE_PLUS_ENABLED = "googleplus.enabled"; public static final String LOOPY_ENABLED = "loopy.enabled"; /** * true if Single Sign On is enabled. Default is true. */ public static final String FACEBOOK_SSO_ENABLED = "facebook.sso.enabled"; public static final String FACEBOOK_OG_USE_INBUILT_LIKE = "facebook.og.like.enabled"; @Deprecated public static final String FACEBOOK_PHOTOS_ENABLED = "facebook.photos.enabled"; public static final String FACEBOOK_APP_ID = "facebook.app.id"; @Deprecated public static final String FACEBOOK_USER_ID = "facebook.user.id"; @Deprecated public static final String FACEBOOK_USER_TOKEN = "facebook.user.token"; public static final String TWITTER_CONSUMER_KEY = "twitter.consumer.key"; public static final String TWITTER_CONSUMER_SECRET = "twitter.consumer.secret"; private Properties properties; private SocializeLogger logger; private ResourceLocator resourceLocator; private String propertiesFileName = SOCIALIZE_PROPERTIES_PATH; public static final String LOG_LEVEL = "log.level"; public static final String LOG_TAG = "log.tag"; public static final String LOG_THREAD = "log.thread"; public static final String LOG_MSG = "log.msg."; public static final String API_HOST = "api.host"; public static final String REDIRECT_APP_STORE = "redirect.app.store"; public static final String HTTP_CONNECTION_TIMEOUT = "http.connection.timeout"; public static final String HTTP_SOCKET_TIMEOUT = "http.socket.timeout"; public static final int MAX_LIST_RESULTS = 100; public static final String SOCIALIZE_SHARE_COMMENT = "socialize.share.comment"; public static final String SOCIALIZE_SHARE_IS_HTML = "socialize.share.html"; public static final String SOCIALIZE_SHARE_MIME_TYPE = "socialize.share.mime"; public static final String SOCIALIZE_SHARE_LISTENER_KEY = "socialize.share.listener.key"; private static boolean ENTITY_LOADER_CHECK_ENABLED = true; public SocializeConfig() { super(); } public SocializeConfig(String propertiesFileName) { super(); this.propertiesFileName = propertiesFileName; } public void init(Context context) { init(context, true); } /** * * @param context * @param override */ public void init(Context context, boolean override) { InputStream in = null; try { if(resourceLocator != null) { try { in = resourceLocator.locateInClassPath(context, DEFAULT_PROPERTIES_PATH); if(in != null) { Properties old = null; if(properties != null) { old = properties; } properties = createProperties(); properties.load(in); trimValues(properties); if(old != null) { merge(old, null); } } else { if(logger != null) { logger.error("Could not locate config [" + DEFAULT_PROPERTIES_PATH + "] in classpath"); } } } catch (IOException ignore) { // No config.. eek! ignore.printStackTrace(); } finally { if(in != null) { in.close(); } } if(override) { // Look for override try { in = resourceLocator.locate(context, propertiesFileName); if(in != null) { Properties overrideProps = createProperties(); overrideProps.load(in); trimValues(overrideProps); merge(overrideProps, null); } } catch (IOException ignore) { // ignore } finally { if(in != null) { in.close(); } } } } if(properties == null) { if(logger != null) { logger.error(SocializeLogger.NO_CONFIG); } properties = createProperties(); } } catch (Exception e) { throw new RuntimeException(e); } } protected void trimValues(Properties properties) { if(properties != null) { Set<Object> keys = properties.keySet(); if(keys != null) { String value = null; for (Object key : keys) { value = properties.getProperty(key.toString()); if(value != null) { value = value.trim(); properties.put(key, value); } } } } } /** * Sets a custom property. This will override settings in socialize.properties. * @param key * @param value */ public void setProperty(String key, String value) { if(properties == null) { properties = createProperties(); } if(value != null) { value = value.trim(); properties.put(key, value); } else { properties.remove(key); } } /** * Returns a property from socialize.properties. * @param key * @return */ public String getProperty(String key) { return (properties == null) ? null : properties.getProperty(key); } public String getProperty(String key, String defaultValue) { if(properties == null) { return defaultValue; } String value = properties.getProperty(key); if(StringUtils.isEmpty(value)) { return defaultValue; } return value; } public void destroy() { if(properties != null) { properties.clear(); } } public int getIntProperty(String key, int defaultValue) { String val = getProperty(key); if(!StringUtils.isEmpty(val)) { return Integer.parseInt(val); } return defaultValue; } public long getLongProperty(String key, long defaultValue) { String val = getProperty(key); if(!StringUtils.isEmpty(val)) { return Long.parseLong(val); } return defaultValue; } public boolean getBooleanProperty(String key, boolean defaultValue) { String val = getProperty(key); if(!StringUtils.isEmpty(val)) { return Boolean.parseBoolean(val); } return defaultValue; } /** * Sets the Facebook App ID for Facebook authentication. * @param appId Your Facebook App Id, obtained from https://developers.facebook.com/ * @see "https://developers.facebook.com/" */ public void setFacebookAppId(String appId) { setProperty(SocializeConfig.FACEBOOK_APP_ID, appId); } /** * Sets the Twitter App consumer key/secret pair for Twitter authentication. * @param consumerKey Your Twitter App consumer key, obtained from https://dev.twitter.com/ * @param consumerSecret Your Twitter App consumer secret, obtained from https://dev.twitter.com/ */ public void setTwitterKeySecret(String consumerKey, String consumerSecret) { setProperty(SocializeConfig.TWITTER_CONSUMER_KEY, consumerKey); setProperty(SocializeConfig.TWITTER_CONSUMER_SECRET, consumerSecret); } /** * Enables/disables Single Sign On for Facebook. * @param enabled True if enabled. Default is true. */ public void setFacebookSingleSignOnEnabled(boolean enabled) { setProperty(SocializeConfig.FACEBOOK_SSO_ENABLED, String.valueOf(enabled)); } /** * Sets the FB credentials for the current user if available. * @param userId * @param token * @deprecated No longer used. Any values set here will be ignored. Use FacebookUtils to link a known user. */ @Deprecated public void setFacebookUserCredentials(String userId, String token) { setProperty(SocializeConfig.FACEBOOK_USER_ID, userId); setProperty(SocializeConfig.FACEBOOK_USER_TOKEN, token); } @Deprecated public boolean isShareRequired() { return getBooleanProperty(SOCIALIZE_REQUIRE_SHARE, getBooleanProperty(SOCIALIZE_ALLOW_ANON, false)); } public boolean isAllowSkipAuthOnComments() { return getBooleanProperty(SOCIALIZE_ALLOW_ANON_COMMENT, false); } public boolean isLoopyEnabled() { return getBooleanProperty(LOOPY_ENABLED, true); } public boolean isDiagnosticLoggingEnabled() { return getBooleanProperty(SOCIALIZE_EXTERNAL_LOGS_ENABLED, false); } public void setDiagnosticLoggingEnabled(Context context, boolean enabled) { setProperty(SOCIALIZE_EXTERNAL_LOGS_ENABLED, String.valueOf(enabled)); if(logger != null) { if(enabled) { logger.destroy(); logger.init(context, this); } else { ExternalLogger externalLogger = logger.getExternalLogger(); if(externalLogger != null) { externalLogger.destroy(); } logger.setExternalLogger(null); } } } public boolean isAllowSkipAuthOnAllActions() { return getBooleanProperty(SOCIALIZE_ALLOW_ANON, false); } public boolean isAllowNeverAuth() { return getBooleanProperty(SOCIALIZE_ALLOW_NEVER_AUTH, false); } public boolean isAllowDeleteComment() { return getBooleanProperty(SOCIALIZE_ALLOW_DELETE_COMMENT, false); } public boolean isShowCommentHeader() { return getBooleanProperty(SOCIALIZE_SHOW_COMMENT_HEADER, true); } public boolean isOGLike() { return getBooleanProperty(FACEBOOK_OG_USE_INBUILT_LIKE, false); } public boolean isGooglePlusEnabled() { return getBooleanProperty(GOOGLE_PLUS_ENABLED, true); } public boolean isNotificationsEnabled() { return getBooleanProperty(SOCIALIZE_NOTIFICATIONS_ENABLED, true); } public boolean isPromptForAuth() { return getBooleanProperty(SOCIALIZE_REQUIRE_AUTH, true); } public boolean isPromptForShare() { return getBooleanProperty(SOCIALIZE_PROMPT_SHARE, true); } /** * Sets the Socialize credentials for your App. * @param consumerKey Your consumer key, obtained via registration at http://getsocialize.com * @param consumerSecret Your consumer secret, obtained via registration at http://getsocialize.com */ public void setSocializeCredentials(String consumerKey, String consumerSecret) { setProperty(SocializeConfig.SOCIALIZE_CONSUMER_KEY, consumerKey); setProperty(SocializeConfig.SOCIALIZE_CONSUMER_SECRET, consumerSecret); } protected String getLocalProperty(String key) { return getLocalProperty(key, null); } protected String getLocalProperty(String key, String defaultValue) { String val = properties.getProperty(key); if(!StringUtils.isEmpty(val)) { return val; } return defaultValue; } public void merge(SocializeConfig config) { merge(config.getProperties(), null); } /** * Merge properties into the config. * @param other */ public void merge(Properties other, Set<String> toBeRemoved) { if(properties == null) { properties = createProperties(); } if(other != null && other.size() > 0) { Set<Entry<Object, Object>> entrySet = other.entrySet(); for (Entry<Object, Object> entry : entrySet) { properties.put(entry.getKey(), entry.getValue()); } } if(toBeRemoved != null && toBeRemoved.size() > 0) { for (String key : toBeRemoved) { properties.remove(key); } toBeRemoved.clear(); } } public String getDefaultPropertiesFileName() { return SOCIALIZE_PROPERTIES_PATH; } public Properties getProperties() { return properties; } public void setLogger(SocializeLogger logger) { this.logger = logger; } public void setResourceLocator(ResourceLocator resourceLocator) { this.resourceLocator = resourceLocator; } protected Properties createProperties() { return new Properties(); } public boolean isEntityLoaderCheckEnabled() { return ENTITY_LOADER_CHECK_ENABLED; } protected void setEntityLoaderCheckEnabled(boolean entityLoaderCheckEnabled) { ENTITY_LOADER_CHECK_ENABLED = entityLoaderCheckEnabled; } }