/* * 官网地站:http://www.mob.com * 技术支持QQ: 4006852216 * 官方微信:ShareSDK (如果发布新版本的话,我们将会第一时间通过微信将版本更新内容推送给您。如果使用过程中有任何问题,也可以通过微信与我们取得联系,我们将会在24小时内给予回复) * * Copyright (c) 2013年 mob.com. All rights reserved. */ package cn.sharesdk.onekeyshare; import java.io.File; import java.io.FileOutputStream; import java.util.ArrayList; import java.util.HashMap; import android.content.Context; import android.content.Intent; import android.content.pm.ResolveInfo; import android.graphics.Bitmap; import android.graphics.Bitmap.CompressFormat; import android.os.Handler.Callback; import android.os.Message; import android.text.TextUtils; import android.widget.Toast; import cn.sharesdk.framework.CustomPlatform; import cn.sharesdk.framework.Platform; import cn.sharesdk.framework.Platform.ShareParams; import cn.sharesdk.framework.PlatformActionListener; import cn.sharesdk.framework.ShareSDK; import com.mob.tools.utils.ResHelper; import com.mob.tools.utils.UIHandler; /** 快捷分享的主题样式的实现父类 */ public abstract class OnekeyShareThemeImpl implements PlatformActionListener, Callback { protected boolean dialogMode; protected HashMap<String, Object> shareParamsMap; protected boolean silent; protected ArrayList<CustomerLogo> customerLogos; protected HashMap<String, String> hiddenPlatforms; protected PlatformActionListener callback; protected ShareContentCustomizeCallback customizeCallback; protected boolean disableSSO; protected Context context; public OnekeyShareThemeImpl() { callback = this; } public final void setDialogMode(boolean dialogMode) { this.dialogMode = dialogMode; } public final void setShareParamsMap(HashMap<String, Object> shareParamsMap) { this.shareParamsMap = shareParamsMap; } public final void setSilent(boolean silent) { this.silent = silent; } public final void setCustomerLogos(ArrayList<CustomerLogo> customerLogos) { this.customerLogos = customerLogos; } public final void setHiddenPlatforms(HashMap<String, String> hiddenPlatforms) { this.hiddenPlatforms = hiddenPlatforms; } public final void setPlatformActionListener(PlatformActionListener callback) { this.callback = callback == null ? this : callback; } public final void setShareContentCustomizeCallback(ShareContentCustomizeCallback customizeCallback) { this.customizeCallback = customizeCallback; } public final void disableSSO() { disableSSO = true; } public final void show(Context context) { this.context = context; // 显示方式是由platform和silent两个字段控制的 // 如果platform设置了,则无须显示九宫格,否则都会显示; // 如果silent为true,表示不进入编辑页面,否则会进入。 if (shareParamsMap.containsKey("platform")) { String name = String.valueOf(shareParamsMap.get("platform")); Platform platform = ShareSDK.getPlatform(name); boolean isCustomPlatform = platform instanceof CustomPlatform; boolean isUseClientToShare = isUseClientToShare(platform); if (silent || isCustomPlatform || isUseClientToShare) { shareSilently(platform); } else { prepareForEditPage(platform); } } else { showPlatformPage(context); } } /** 判断指定平台是否只能使用客户端分享 */ final boolean isUseClientToShare(Platform platform) { String name = platform.getName(); if ("Wechat".equals(name) || "WechatMoments".equals(name) || "WechatFavorite".equals(name) || "ShortMessage".equals(name) || "Email".equals(name) || "Qzone".equals(name) || "QQ".equals(name) || "Pinterest".equals(name) || "Instagram".equals(name) || "Yixin".equals(name) || "YixinMoments".equals(name) || "QZone".equals(name) || "Mingdao".equals(name) || "Line".equals(name) || "KakaoStory".equals(name) || "KakaoTalk".equals(name) || "Bluetooth".equals(name) || "WhatsApp".equals(name) || "BaiduTieba".equals(name) || "Laiwang".equals(name) || "LaiwangMoments".equals(name) || "Alipay".equals(name) || "AlipayMoments".equals(name) || "FacebookMessenger".equals(name) || "GooglePlus".equals(name) || "Dingding".equals(name) || "Youtube".equals(name) || "Meipai".equals(name) ) { return true; } else if ("Evernote".equals(name)) { if ("true".equals(platform.getDevinfo("ShareByAppClient"))) { return true; } } else if ("SinaWeibo".equals(name)) { if ("true".equals(platform.getDevinfo("ShareByAppClient"))) { Intent test = new Intent(Intent.ACTION_SEND); test.setPackage("com.sina.weibo"); test.setType("image/*"); ResolveInfo ri = platform.getContext().getPackageManager().resolveActivity(test, 0); if(ri == null) { test = new Intent(Intent.ACTION_SEND); test.setPackage("com.sina.weibog3"); test.setType("image/*"); ri = platform.getContext().getPackageManager().resolveActivity(test, 0); } return (ri != null); } } return false; } final void shareSilently(Platform platform) { if (formateShareData(platform)) { ShareParams sp = shareDataToShareParams(platform); if (sp != null) { toast("ssdk_oks_sharing"); if (customizeCallback != null) { customizeCallback.onShare(platform, sp); } if (disableSSO) { platform.SSOSetting(disableSSO); } platform.setPlatformActionListener(callback); platform.share(sp); } } } private void prepareForEditPage(Platform platform) { if (formateShareData(platform)) { ShareParams sp = shareDataToShareParams(platform); if (sp != null) { // 编辑分享内容的统计 ShareSDK.logDemoEvent(3, null); if (customizeCallback != null) { customizeCallback.onShare(platform, sp); } showEditPage(context, platform, sp); } } } final boolean formateShareData(Platform plat) { String name = plat.getName(); boolean isAlipay = "Alipay".equals(name) || "AlipayMoments".equals(name); if (isAlipay && !plat.isClientValid()) { toast("ssdk_alipay_client_inavailable"); return false; } boolean isKakaoTalk = "KakaoTalk".equals(name); if (isKakaoTalk && !plat.isClientValid()) { toast("ssdk_kakaotalk_client_inavailable"); return false; } boolean isKakaoStory = "KakaoStory".equals(name); if (isKakaoStory && !plat.isClientValid()) { toast("ssdk_kakaostory_client_inavailable"); return false; } boolean isLine = "Line".equals(name); if (isLine && !plat.isClientValid()) { toast("ssdk_line_client_inavailable"); return false; } boolean isWhatsApp = "WhatsApp".equals(name); if (isWhatsApp && !plat.isClientValid()) { toast("ssdk_whatsapp_client_inavailable"); return false; } boolean isPinterest = "Pinterest".equals(name); if (isPinterest && !plat.isClientValid()) { toast("ssdk_pinterest_client_inavailable"); return false; } if ("Instagram".equals(name) && !plat.isClientValid()) { toast("ssdk_instagram_client_inavailable"); return false; } if ("QZone".equals(name) && !plat.isClientValid()) { toast("ssdk_qq_client_inavailable"); return false; } boolean isLaiwang = "Laiwang".equals(name); boolean isLaiwangMoments = "LaiwangMoments".equals(name); if(isLaiwang || isLaiwangMoments){ if (!plat.isClientValid()) { toast("ssdk_laiwang_client_inavailable"); return false; } } boolean isYixin = "YixinMoments".equals(name) || "Yixin".equals(name); if (isYixin && !plat.isClientValid()) { toast("ssdk_yixin_client_inavailable"); return false; } boolean isWechat = "WechatFavorite".equals(name) || "Wechat".equals(name) || "WechatMoments".equals(name); if (isWechat && !plat.isClientValid()) { toast("ssdk_wechat_client_inavailable"); return false; } if ("FacebookMessenger".equals(name) && !plat.isClientValid()) { toast("ssdk_facebookmessenger_client_inavailable"); return false; } if (!shareParamsMap.containsKey("shareType")) { int shareType = Platform.SHARE_TEXT; String imagePath = String.valueOf(shareParamsMap.get("imagePath")); if (imagePath != null && (new File(imagePath)).exists()) { shareType = Platform.SHARE_IMAGE; if (imagePath.endsWith(".gif") && isWechat) { shareType = Platform.SHARE_EMOJI; } else if (shareParamsMap.containsKey("url") && !TextUtils.isEmpty(shareParamsMap.get("url").toString())) { shareType = Platform.SHARE_WEBPAGE; if (shareParamsMap.containsKey("musicUrl") && !TextUtils.isEmpty(shareParamsMap.get("musicUrl").toString()) && isWechat) { shareType = Platform.SHARE_MUSIC; } } } else { Bitmap viewToShare = ResHelper.forceCast(shareParamsMap.get("viewToShare")); if (viewToShare != null && !viewToShare.isRecycled()) { shareType = Platform.SHARE_IMAGE; if (shareParamsMap.containsKey("url") && !TextUtils.isEmpty(shareParamsMap.get("url").toString())) { shareType = Platform.SHARE_WEBPAGE; if (shareParamsMap.containsKey("musicUrl") && !TextUtils.isEmpty(shareParamsMap.get("musicUrl").toString()) && isWechat) { shareType = Platform.SHARE_MUSIC; } } } else { Object imageUrl = shareParamsMap.get("imageUrl"); if (imageUrl != null && !TextUtils.isEmpty(String.valueOf(imageUrl))) { shareType = Platform.SHARE_IMAGE; if (String.valueOf(imageUrl).endsWith(".gif") && isWechat) { shareType = Platform.SHARE_EMOJI; } else if (shareParamsMap.containsKey("url") && !TextUtils.isEmpty(shareParamsMap.get("url").toString())) { shareType = Platform.SHARE_WEBPAGE; if (shareParamsMap.containsKey("musicUrl") && !TextUtils.isEmpty(shareParamsMap.get("musicUrl").toString()) && isWechat) { shareType = Platform.SHARE_MUSIC; } } } } } shareParamsMap.put("shareType", shareType); } return true; } final ShareParams shareDataToShareParams(Platform plat) { if (plat == null || shareParamsMap == null) { toast("ssdk_oks_share_failed"); return null; } try { String imagePath = ResHelper.forceCast(shareParamsMap.get("imagePath")); Bitmap viewToShare = ResHelper.forceCast(shareParamsMap.get("viewToShare")); if (TextUtils.isEmpty(imagePath) && viewToShare != null && !viewToShare.isRecycled()) { String path = ResHelper.getCachePath(plat.getContext(), "screenshot"); File ss = new File(path, String.valueOf(System.currentTimeMillis()) + ".jpg"); FileOutputStream fos = new FileOutputStream(ss); viewToShare.compress(CompressFormat.JPEG, 100, fos); fos.flush(); fos.close(); shareParamsMap.put("imagePath", ss.getAbsolutePath()); } } catch (Throwable t) { t.printStackTrace(); toast("ssdk_oks_share_failed"); return null; } return new ShareParams(shareParamsMap); } private void toast(final String resOrName) { UIHandler.sendEmptyMessage(0, new Callback() { public boolean handleMessage(Message msg) { int resId = ResHelper.getStringRes(context, resOrName); if (resId > 0) { Toast.makeText(context, resId, Toast.LENGTH_SHORT).show(); } else { Toast.makeText(context, resOrName, Toast.LENGTH_SHORT).show(); } return false; } }); } protected abstract void showPlatformPage(Context context); protected abstract void showEditPage(Context context, Platform platform, ShareParams sp); public final void onComplete(Platform platform, int action, HashMap<String, Object> res) { Message msg = new Message(); msg.arg1 = 1; msg.arg2 = action; msg.obj = platform; UIHandler.sendMessage(msg, this); } public final void onError(Platform platform, int action, Throwable t) { t.printStackTrace(); Message msg = new Message(); msg.arg1 = 2; msg.arg2 = action; msg.obj = t; UIHandler.sendMessage(msg, this); // 分享失败的统计 ShareSDK.logDemoEvent(4, platform); } public final void onCancel(Platform platform, int action) { Message msg = new Message(); msg.arg1 = 3; msg.arg2 = action; msg.obj = platform; UIHandler.sendMessage(msg, this); // 分享失败的统计 ShareSDK.logDemoEvent(5, platform); } public final boolean handleMessage(Message msg) { switch (msg.arg1) { case 1: { // 成功 int resId = ResHelper.getStringRes(context, "ssdk_oks_share_completed"); if (resId > 0) { toast(context.getString(resId)); } } break; case 2: { // 失败 String expName = msg.obj.getClass().getSimpleName(); if ("WechatClientNotExistException".equals(expName) || "WechatTimelineNotSupportedException".equals(expName) || "WechatFavoriteNotSupportedException".equals(expName)) { toast("ssdk_wechat_client_inavailable"); } else if ("GooglePlusClientNotExistException".equals(expName)) { toast("ssdk_google_plus_client_inavailable"); } else if ("QQClientNotExistException".equals(expName)) { toast("ssdk_qq_client_inavailable"); } else if ("YixinClientNotExistException".equals(expName) || "YixinTimelineNotSupportedException".equals(expName)) { toast("ssdk_yixin_client_inavailable"); } else if ("KakaoTalkClientNotExistException".equals(expName)) { toast("ssdk_kakaotalk_client_inavailable"); } else if ("KakaoStoryClientNotExistException".equals(expName)) { toast("ssdk_kakaostory_client_inavailable"); } else if("WhatsAppClientNotExistException".equals(expName)){ toast("ssdk_whatsapp_client_inavailable"); } else if("FacebookMessengerClientNotExistException".equals(expName)){ toast("ssdk_facebookmessenger_client_inavailable"); } else { toast("ssdk_oks_share_failed"); } } break; case 3: { // 取消 toast("ssdk_oks_share_canceled"); } break; } return false; } }