package com.wise.sharesdk; import java.io.File; import java.util.ArrayList; import java.util.HashMap; import java.util.Map.Entry; import com.wise.wawc.R; import android.app.Notification; import android.app.NotificationManager; import android.app.PendingIntent; import android.content.Context; import android.content.Intent; import android.content.res.Configuration; import android.graphics.Bitmap; import android.os.Message; import android.os.Handler.Callback; import android.text.TextUtils; import android.util.TypedValue; import android.view.Gravity; import android.view.KeyEvent; import android.view.MotionEvent; import android.view.View; import android.view.View.OnClickListener; import android.view.animation.Animation; import android.view.animation.TranslateAnimation; import android.view.animation.Animation.AnimationListener; import android.widget.Button; import android.widget.FrameLayout; import android.widget.LinearLayout; import android.widget.Toast; import android.widget.FrameLayout.LayoutParams; import cn.sharesdk.framework.FakeActivity; import cn.sharesdk.framework.Platform; import cn.sharesdk.framework.PlatformActionListener; import cn.sharesdk.framework.ShareSDK; import cn.sharesdk.framework.utils.UIHandler; /** * 快捷分享的入口 * <p> * 通过不同的setter设置参数,然后调用{@link #show(Context)}方法启动快捷分享 */ public class OnekeyShare extends FakeActivity implements OnClickListener, PlatformActionListener, Callback { private static final int MSG_TOAST = 1; private static final int MSG_ACTION_CCALLBACK = 2; private static final int MSG_CANCEL_NOTIFY = 3; // 页面 private FrameLayout flPage; // 宫格列表 private PlatformGridView grid; // 取消按钮 private Button btnCancel; // 滑上来的动画 private Animation animShow; // 滑下去的动画 private Animation animHide; private boolean finishing; private boolean canceled; private HashMap<String, Object> reqMap; private ArrayList<CustomerLogo> customers; private int notifyIcon; private String notifyTitle; private boolean silent; private PlatformActionListener callback; private ShareContentCustomizeCallback customizeCallback; private boolean dialogMode; public OnekeyShare() { reqMap = new HashMap<String, Object>(); customers = new ArrayList<CustomerLogo>(); callback = this; } public void show(Context context) { super.show(context, null); } /** 分享时Notification的图标和文字 */ public void setNotification(int icon, String title) { notifyIcon = icon; notifyTitle = title; } /** address是接收人地址,仅在信息和邮件使用,否则可以不提供 */ public void setAddress(String address) { reqMap.put("address", address); } /** title标题,在印象笔记、邮箱、信息、微信(包括好友和朋友圈)、人人网和QQ空间使用,否则可以不提供 */ public void setTitle(String title) { reqMap.put("title", title); } /** titleUrl是标题的网络链接,仅在人人网和QQ空间使用,否则可以不提供 */ public void setTitleUrl(String titleUrl) { reqMap.put("titleUrl", titleUrl); } /** text是分享文本,所有平台都需要这个字段 */ public void setText(String text) { reqMap.put("text", text); } /** imagePath是本地的图片路径,除Linked-In外的所有平台都支持这个字段 */ public void setImagePath(String imagePath) { reqMap.put("imagePath", imagePath); } /** imageUrl是图片的网络路径,新浪微博、人人网、QQ空间和Linked-In支持此字段 */ public void setImageUrl(String imageUrl) { reqMap.put("imageUrl", imageUrl); } /** musicUrl仅在微信(及朋友圈)中使用,是音乐文件的直接地址 */ public void serMusicUrl(String musicUrl) { reqMap.put("musicUrl", musicUrl); } /** url仅在微信(包括好友和朋友圈)中使用,否则可以不提供 */ public void setUrl(String url) { reqMap.put("url", url); } /** filePath是待分享应用程序的本地路劲,仅在微信好友和Dropbox中使用,否则可以不提供 */ public void setFilePath(String filePath) { reqMap.put("filePath", filePath); } /** comment是我对这条分享的评论,仅在人人网和QQ空间使用,否则可以不提供 */ public void setComment(String comment) { reqMap.put("comment", comment); } /** site是分享此内容的网站名称,仅在QQ空间使用,否则可以不提供 */ public void setSite(String site) { reqMap.put("site", site); } /** siteUrl是分享此内容的网站地址,仅在QQ空间使用,否则可以不提供 */ public void setSiteUrl(String siteUrl) { reqMap.put("siteUrl", siteUrl); } /** foursquare分享时的地方名 */ public void setVenueName(String venueName) { reqMap.put("venueName", venueName); } /** foursquare分享时的地方描述 */ public void setVenueDescription(String venueDescription) { reqMap.put("venueDescription", venueDescription); } /** 分享地纬度,新浪微博、腾讯微博和foursquare支持此字段 */ public void setLatitude(float latitude) { reqMap.put("latitude", latitude); } /** 分享地经度,新浪微博、腾讯微博和foursquare支持此字段 */ public void setLongitude(float longitude) { reqMap.put("longitude", longitude); } /** 是否直接分享 */ public void setSilent(boolean silent) { this.silent = silent; } /** 设置编辑页的初始化选中平台 */ public void setPlatform(String platform) { reqMap.put("platform", platform); } /** 设置自定义的外部回调 */ public void setCallback(PlatformActionListener callback) { this.callback = callback; } /** 设置用于分享过程中,根据不同平台自定义分享内容的回调 */ public void setShareContentCustomizeCallback(ShareContentCustomizeCallback callback) { customizeCallback = callback; } /** 设置自己图标和点击事件,可以重复调用添加多次 */ public void setCustomerLogo(Bitmap logo, String label, OnClickListener ocListener) { CustomerLogo cl = new CustomerLogo(); cl.label = label; cl.logo = logo; cl.listener = ocListener; customers.add(cl); } // 设置编辑页面的显示模式为Dialog模式 public void setDialogMode() { dialogMode = true; reqMap.put("dialogMode", dialogMode); } public void onCreate() { // 显示方式是由platform和silent两个字段控制的 // 如果platform设置了,则无须显示九宫格,否则都会显示; // 如果silent为true,表示不进入编辑页面,否则会进入。 // 本类只判断platform,因为九宫格显示以后,事件交给PlatformGridView控制 // 当platform和silent都为true,则直接进入分享; // 当platform设置了,但是silent为false,则判断是否是“使用客户端分享”的平台, // 若为“使用客户端分享”的平台,则直接分享,否则进入编辑页面 if (reqMap.containsKey("platform")) { String name = String.valueOf(reqMap.get("platform")); if (silent) { HashMap<Platform, HashMap<String, Object>> shareData = new HashMap<Platform, HashMap<String,Object>>(); shareData.put(ShareSDK.getPlatform(activity, name), reqMap); share(shareData); } else if (ShareCore.isUseClientToShare(activity, name)) { HashMap<Platform, HashMap<String, Object>> shareData = new HashMap<Platform, HashMap<String,Object>>(); shareData.put(ShareSDK.getPlatform(activity, name), reqMap); share(shareData); } else { EditPage page = new EditPage(); page.setShareData(reqMap); page.setParent(this); if (dialogMode) { page.setDialogMode(); } page.show(activity, null); finish(); } return; } initPageView(); initAnim(); activity.setContentView(flPage); // 设置宫格列表数据 grid.setData(reqMap, silent); grid.setCustomerLogos(customers); grid.setParent(this); btnCancel.setOnClickListener(this); // 显示列表 flPage.clearAnimation(); flPage.startAnimation(animShow); // 打开分享菜单的统计 ShareSDK.logDemoEvent(1, null); } private void initPageView() { flPage = new FrameLayout(getContext()); flPage.setOnClickListener(this); // 宫格列表的容器,为了“下对齐”,在外部包含了一个FrameLayout LinearLayout llPage = new LinearLayout(getContext()) { public boolean onTouchEvent(MotionEvent event) { return true; } }; llPage.setOrientation(LinearLayout.VERTICAL); llPage.setBackgroundResource(R.drawable.share_vp_back); FrameLayout.LayoutParams lpLl = new FrameLayout.LayoutParams( LayoutParams.FILL_PARENT, LayoutParams.WRAP_CONTENT); lpLl.gravity = Gravity.BOTTOM; llPage.setLayoutParams(lpLl); flPage.addView(llPage); // 宫格列表 grid = new PlatformGridView(getContext()); LinearLayout.LayoutParams lpWg = new LinearLayout.LayoutParams( LayoutParams.FILL_PARENT, LayoutParams.WRAP_CONTENT); grid.setLayoutParams(lpWg); llPage.addView(grid); // 取消按钮 btnCancel = new Button(getContext()); btnCancel.setTextColor(0xffffffff); btnCancel.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 20); btnCancel.setText(R.string.cancel); btnCancel.setPadding(0, 0, 0, cn.sharesdk.framework.utils.R.dipToPx(getContext(), 5)); btnCancel.setBackgroundResource(R.drawable.btn_cancel_back); LinearLayout.LayoutParams lpBtn = new LinearLayout.LayoutParams( LayoutParams.FILL_PARENT, cn.sharesdk.framework.utils.R.dipToPx(getContext(), 45)); int dp_10 = cn.sharesdk.framework.utils.R.dipToPx(getContext(), 10); lpBtn.setMargins(dp_10, dp_10, dp_10, dp_10); btnCancel.setLayoutParams(lpBtn); llPage.addView(btnCancel); } private void initAnim() { animShow = new TranslateAnimation( Animation.RELATIVE_TO_SELF, 0, Animation.RELATIVE_TO_SELF, 0, Animation.RELATIVE_TO_SELF, 1, Animation.RELATIVE_TO_SELF, 0); animShow.setDuration(300); animHide = new TranslateAnimation( Animation.RELATIVE_TO_SELF, 0, Animation.RELATIVE_TO_SELF, 0, Animation.RELATIVE_TO_SELF, 0, Animation.RELATIVE_TO_SELF, 1); animHide.setDuration(300); } public void onClick(View v) { if (v.equals(flPage) || v.equals(btnCancel)) { canceled = true; finish(); } } public boolean onKeyEvent(int keyCode, KeyEvent event) { if (keyCode == KeyEvent.KEYCODE_BACK) { canceled = true; } return super.onKeyEvent(keyCode, event); } public void onConfigurationChanged(Configuration newConfig) { if (grid != null) { grid.onConfigurationChanged(); } } public void finish() { if (finishing) { return; } if (animHide == null) { finishing = true; super.finish(); return; } // 取消分享菜单的统计 if (canceled) { ShareSDK.logDemoEvent(2, null); } finishing = true; animHide.setAnimationListener(new AnimationListener() { public void onAnimationStart(Animation animation) { } public void onAnimationRepeat(Animation animation) { } public void onAnimationEnd(Animation animation) { flPage.setVisibility(View.GONE); OnekeyShare.super.finish(); } }); flPage.clearAnimation(); flPage.startAnimation(animHide); } /** 循环执行分享 */ public void share(HashMap<Platform, HashMap<String, Object>> shareData) { boolean started = false; for (Entry<Platform, HashMap<String, Object>> ent : shareData.entrySet()) { Platform plat = ent.getKey(); String name = plat.getName(); boolean isWechat = "WechatMoments".equals(name) || "Wechat".equals(name); if (isWechat && !plat.isValid()) { Message msg = new Message(); msg.what = MSG_TOAST; msg.obj = activity.getString(R.string.wechat_client_inavailable); UIHandler.sendMessage(msg, this); continue; } boolean isGooglePlus = "GooglePlus".equals(name); if (isGooglePlus && !plat.isValid()) { Message msg = new Message(); msg.what = MSG_TOAST; msg.obj = activity.getString(R.string.google_plus_client_inavailable); UIHandler.sendMessage(msg, this); continue; } boolean isQQ = "QQ".equals(name); if (isQQ && !plat.isValid()) { Message msg = new Message(); msg.what = MSG_TOAST; msg.obj = activity.getString(R.string.qq_client_inavailable); UIHandler.sendMessage(msg, this); continue; } boolean isPinterest = "Pinterest".equals(name); if (isPinterest && !plat.isValid()) { Message msg = new Message(); msg.what = MSG_TOAST; msg.obj = activity.getString(R.string.pinterest_client_inavailable); UIHandler.sendMessage(msg, this); continue; } boolean isInstagram = "Instagram".equals(name); if (isInstagram && !plat.isValid()) { Message msg = new Message(); msg.what = MSG_TOAST; msg.obj = activity.getString(R.string.instagram_client_inavailable); UIHandler.sendMessage(msg, this); continue; } HashMap<String, Object> data = ent.getValue(); int shareType = Platform.SHARE_TEXT; String imagePath = String.valueOf(data.get("imagePath")); if (imagePath != null && (new File(imagePath)).exists()) { shareType = Platform.SHARE_IMAGE; if (data.containsKey("url") && !TextUtils.isEmpty(data.get("url").toString())) { shareType = Platform.SHARE_WEBPAGE; } } else { Object imageUrl = data.get("imageUrl"); if (imageUrl != null && !TextUtils.isEmpty(String.valueOf(imageUrl))) { shareType = Platform.SHARE_IMAGE; if (data.containsKey("url") && !TextUtils.isEmpty(data.get("url").toString())) { shareType = Platform.SHARE_WEBPAGE; } } } data.put("shareType", shareType); if (!started) { started = true; if (equals(callback)) { showNotification(2000, getContext().getString(R.string.sharing)); } finish(); } plat.setPlatformActionListener(callback); ShareCore shareCore = new ShareCore(); shareCore.setShareContentCustomizeCallback(customizeCallback); shareCore.share(plat, data); } } public void onComplete(Platform platform, int action, HashMap<String, Object> res) { Message msg = new Message(); msg.what = MSG_ACTION_CCALLBACK; msg.arg1 = 1; msg.arg2 = action; msg.obj = platform; UIHandler.sendMessage(msg, this); } public void onError(Platform platform, int action, Throwable t) { t.printStackTrace(); Message msg = new Message(); msg.what = MSG_ACTION_CCALLBACK; msg.arg1 = 2; msg.arg2 = action; msg.obj = t; UIHandler.sendMessage(msg, this); // 分享失败的统计 ShareSDK.logDemoEvent(4, platform); } public void onCancel(Platform platform, int action) { Message msg = new Message(); msg.what = MSG_ACTION_CCALLBACK; msg.arg1 = 3; msg.arg2 = action; msg.obj = platform; UIHandler.sendMessage(msg, this); } public boolean handleMessage(Message msg) { switch(msg.what) { case MSG_TOAST: { String text = String.valueOf(msg.obj); Toast.makeText(activity, text, Toast.LENGTH_SHORT).show(); } break; case MSG_ACTION_CCALLBACK: { switch (msg.arg1) { case 1: { // 成功 showNotification(2000, getContext().getString(R.string.share_completed)); } break; case 2: { // 失败 String expName = msg.obj.getClass().getSimpleName(); if ("WechatClientNotExistException".equals(expName) || "WechatTimelineNotSupportedException".equals(expName)) { showNotification(2000, getContext().getString(R.string.wechat_client_inavailable)); } else if ("GooglePlusClientNotExistException".equals(expName)) { showNotification(2000, getContext().getString(R.string.google_plus_client_inavailable)); } else if ("QQClientNotExistException".equals(expName)) { showNotification(2000, getContext().getString(R.string.qq_client_inavailable)); } else { showNotification(2000, getContext().getString(R.string.share_failed)); } } break; case 3: { // 取消 showNotification(2000, getContext().getString(R.string.share_canceled)); } break; } } break; case MSG_CANCEL_NOTIFY: { NotificationManager nm = (NotificationManager) msg.obj; if (nm != null) { nm.cancel(msg.arg1); } } break; } return false; } // 在状态栏提示分享操作 private void showNotification(long cancelTime, String text) { try { Context app = getContext().getApplicationContext(); NotificationManager nm = (NotificationManager) app .getSystemService(Context.NOTIFICATION_SERVICE); final int id = Integer.MAX_VALUE / 13 + 1; nm.cancel(id); long when = System.currentTimeMillis(); Notification notification = new Notification(notifyIcon, text, when); PendingIntent pi = PendingIntent.getActivity(app, 0, new Intent(), 0); notification.setLatestEventInfo(app, notifyTitle, text, pi); notification.flags = Notification.FLAG_AUTO_CANCEL; nm.notify(id, notification); if (cancelTime > 0) { Message msg = new Message(); msg.what = MSG_CANCEL_NOTIFY; msg.obj = nm; msg.arg1 = id; UIHandler.sendMessageDelayed(msg, cancelTime, this); } } catch (Exception e) { e.printStackTrace(); } } }