diff options
Diffstat (limited to 'WordPress/src/main/java/org/wordpress/android/util/HelpshiftHelper.java')
-rw-r--r-- | WordPress/src/main/java/org/wordpress/android/util/HelpshiftHelper.java | 246 |
1 files changed, 246 insertions, 0 deletions
diff --git a/WordPress/src/main/java/org/wordpress/android/util/HelpshiftHelper.java b/WordPress/src/main/java/org/wordpress/android/util/HelpshiftHelper.java new file mode 100644 index 000000000..baf95bc1b --- /dev/null +++ b/WordPress/src/main/java/org/wordpress/android/util/HelpshiftHelper.java @@ -0,0 +1,246 @@ +package org.wordpress.android.util; + +import android.app.Activity; +import android.app.Application; +import android.content.Context; +import android.content.Intent; +import android.text.TextUtils; + +import com.helpshift.Core; +import com.helpshift.InstallConfig; +import com.helpshift.exceptions.InstallException; +import com.helpshift.support.Support; +import com.helpshift.support.Support.Delegate; + +import org.apache.commons.lang.ArrayUtils; +import org.wordpress.android.BuildConfig; +import org.wordpress.android.WordPress; +import org.wordpress.android.analytics.AnalyticsTracker; +import org.wordpress.android.analytics.AnalyticsTracker.Stat; +import org.wordpress.android.models.AccountHelper; +import org.wordpress.android.util.AppLog.T; + +import java.io.File; +import java.util.HashMap; +import java.util.Map; + +public class HelpshiftHelper { + public static String ORIGIN_KEY = "ORIGIN_KEY"; + private static String HELPSHIFT_SCREEN_KEY = "helpshift_screen"; + private static String HELPSHIFT_ORIGIN_KEY = "origin"; + private static HelpshiftHelper mInstance = null; + private static HashMap<String, Object> mMetadata = new HashMap<String, Object>(); + + public enum MetadataKey { + USER_ENTERED_URL("user-entered-url"), + USER_ENTERED_USERNAME("user-entered-username"); + + private final String mStringValue; + + private MetadataKey(final String stringValue) { + mStringValue = stringValue; + } + + public String toString() { + return mStringValue; + } + } + + public enum Tag { + ORIGIN_UNKNOWN("origin:unknown"), + ORIGIN_LOGIN_SCREEN_HELP("origin:login-screen-help"), + ORIGIN_LOGIN_SCREEN_ERROR("origin:login-screen-error"), + ORIGIN_ME_SCREEN_HELP("origin:me-screen-help"), + ORIGIN_START_OVER("origin:start-over"), + ORIGIN_DELETE_SITE("origin:delete-site"); + + private final String mStringValue; + + private Tag(final String stringValue) { + mStringValue = stringValue; + } + + public String toString() { + return mStringValue; + } + + public static String[] toString(Tag[] tags) { + if (tags == null) { + return null; + } + String[] res = new String[tags.length]; + for (int i = 0; i < res.length; i++) { + res[0] = tags[0].toString(); + } + return res; + } + } + + private HelpshiftHelper() { + } + + public static synchronized HelpshiftHelper getInstance() { + if (mInstance == null) { + mInstance = new HelpshiftHelper(); + } + return mInstance; + } + + public static void init(Application application) { + InstallConfig installConfig = new InstallConfig.Builder() + .setEnableInAppNotification(true) + .build(); + Core.init(Support.getInstance()); + try { + Core.install(application, BuildConfig.HELPSHIFT_API_KEY, BuildConfig.HELPSHIFT_API_DOMAIN, + BuildConfig.HELPSHIFT_API_ID, installConfig); + } catch (InstallException e) { + AppLog.e(T.UTILS, e); + } + Support.setDelegate(new Delegate() { + @Override + public void sessionBegan() { + } + + @Override + public void sessionEnded() { + } + + @Override + public void newConversationStarted(String s) { + } + + @Override + public void userRepliedToConversation(String s) { + AnalyticsTracker.track(Stat.SUPPORT_SENT_REPLY_TO_SUPPORT_MESSAGE); + } + + @Override + public void userCompletedCustomerSatisfactionSurvey(int i, String s) { + } + + @Override + public void displayAttachmentFile(File file) { + } + + @Override + public void didReceiveNotification(int i) { + } + }); + } + + /** + * Show conversation activity + * Automatically add default metadata to this conversation + */ + public void showConversation(Activity activity, Tag origin) { + if (origin == null) { + origin = Tag.ORIGIN_UNKNOWN; + } + // track origin and helpshift screen in analytics + Map<String, Object> properties = new HashMap<String, Object>(); + properties.put(HELPSHIFT_SCREEN_KEY, "conversation"); + properties.put(HELPSHIFT_ORIGIN_KEY, origin.toString()); + AnalyticsTracker.track(Stat.SUPPORT_OPENED_HELPSHIFT_SCREEN, properties); + // Add tags to Helpshift metadata + addTags(new Tag[]{origin}); + HashMap config = getHelpshiftConfig(activity); + Support.showConversation(activity, config); + } + + /** + * Show FAQ activity + * Automatically add default metadata to this conversation (users can start a conversation from FAQ screen). + */ + public void showFAQ(Activity activity, Tag origin) { + if (origin == null) { + origin = Tag.ORIGIN_UNKNOWN; + } + // track origin and helpshift screen in analytics + Map<String, Object> properties = new HashMap<String, Object>(); + properties.put(HELPSHIFT_SCREEN_KEY, "faq"); + properties.put(HELPSHIFT_ORIGIN_KEY, origin.toString()); + AnalyticsTracker.track(Stat.SUPPORT_OPENED_HELPSHIFT_SCREEN, properties); + // Add tags to Helpshift metadata + addTags(new Tag[]{origin}); + HashMap config = getHelpshiftConfig(activity); + Support.showFAQs(activity, config); + } + + /** + * Register a GCM device token to Helpshift servers + * + * @param regId registration id + */ + public void registerDeviceToken(Context context, String regId) { + if (!TextUtils.isEmpty(regId)) { + Core.registerDeviceToken(context, regId); + } + } + + public void setTags(Tag[] tags) { + mMetadata.put(Support.TagsKey, Tag.toString(tags)); + } + + public void addTags(Tag[] tags) { + String[] oldTags = (String[]) mMetadata.get(Support.TagsKey); + // Concatenate arrays + mMetadata.put(Support.TagsKey, ArrayUtils.addAll(oldTags, Tag.toString(tags))); + } + + /** + * Handle push notification + */ + public void handlePush(Context context, Intent intent) { + Core.handlePush(context, intent); + } + + /** + * Add metadata to Helpshift conversations + * + * @param key map key + * @param object to store. Be careful with the type used. Nothing is specified in the documentation. Better to use + * String but String[] is needed for specific key like Support.TagsKey + */ + public void addMetaData(MetadataKey key, Object object) { + mMetadata.put(key.toString(), object); + } + + public Object getMetaData(MetadataKey key) { + return mMetadata.get(key.toString()); + } + + private void addDefaultMetaData(Context context) { + // Use plain text log (unfortunately Helpshift can't display this correctly) + mMetadata.put("log", AppLog.toPlainText(context)); + + // List blogs name and url + int counter = 1; + for (Map<String, Object> account : WordPress.wpDB.getAllBlogs()) { + mMetadata.put("blog-name-" + counter, MapUtils.getMapStr(account, "blogName")); + mMetadata.put("blog-url-" + counter, MapUtils.getMapStr(account, "url")); + counter += 1; + } + + // wpcom user + mMetadata.put("wpcom-username", AccountHelper.getDefaultAccount().getUserName()); + } + + private HashMap getHelpshiftConfig(Context context) { + String emailAddress = UserEmailUtils.getPrimaryEmail(context); + // Use the user entered username to pre-fill name + String name = (String) getMetaData(MetadataKey.USER_ENTERED_USERNAME); + // If it's null or empty, use split email address to pre-fill name + if (TextUtils.isEmpty(name)) { + String[] splitEmail = TextUtils.split(emailAddress, "@"); + if (splitEmail.length >= 1) { + name = splitEmail[0]; + } + } + Core.setNameAndEmail(name, emailAddress); + addDefaultMetaData(context); + HashMap config = new HashMap (); + config.put(Support.CustomMetadataKey, mMetadata); + return config; + } +} |