From 4e24ce40eaf676ef9f42ed87ab6072cedb538914 Mon Sep 17 00:00:00 2001 From: lihex Date: Wed, 24 Apr 2013 15:58:57 +0800 Subject: [PATCH] Submit protocol of social share plugin --- plugin/protocols/include/ProtocolSocial.h | 89 +++++++++++ .../platform/android/ProtocolSocial.cpp | 151 ++++++++++++++++++ plugin/protocols/proj.android/jni/Android.mk | 1 + .../org/cocos2dx/plugin/InterfaceSocial.java | 29 ++++ 4 files changed, 270 insertions(+) create mode 100755 plugin/protocols/include/ProtocolSocial.h create mode 100755 plugin/protocols/platform/android/ProtocolSocial.cpp mode change 100644 => 100755 plugin/protocols/proj.android/jni/Android.mk create mode 100755 plugin/protocols/proj.android/src/org/cocos2dx/plugin/InterfaceSocial.java diff --git a/plugin/protocols/include/ProtocolSocial.h b/plugin/protocols/include/ProtocolSocial.h new file mode 100755 index 0000000000..865c9a95c0 --- /dev/null +++ b/plugin/protocols/include/ProtocolSocial.h @@ -0,0 +1,89 @@ +#ifndef __CXX_PROTOCOL_SOCIAL_H__ +#define __CXX_PROTOCOL_SOCIAL_H__ + +#include "PluginProtocol.h" +#include +#include + +namespace cocos2d { namespace plugin { + +typedef std::map TDeveloperInfo; +typedef std::map TShareInfo; + +typedef enum +{ + eShareSuccess = 0, + eShareFail, + eShareCancel, + eShareTimeOut, +} EShareResult; + +class ShareResultListener +{ +public: + virtual void shareResult(EShareResult ret, const char* msg, TShareInfo info) = 0; +}; + +class ProtocolSocial : public PluginProtocol +{ +public: + + /** + @brief plugin initialization + */ + virtual bool init(); + + /** + @brief initialize the developer info + @param devInfo This parameter is the info of developer, + different plugin have different format + @warning Must invoke this interface before other interfaces. + And invoked only once. + */ + virtual void initDeveloperInfo(TDeveloperInfo devInfo); + + /** + @brief share information + @param info The info of share, must contains key: + text The text of share + @warning For different plugin, the parameter should have other keys to share. + Look at the manual of plugins. + */ + virtual void share(TShareInfo info); + + /** + @brief Set whether needs to output logs to console. + @param debug if true debug mode enabled, or debug mode disabled. + */ + virtual void setDebugMode(bool debug); + + /** + @breif set the result listener + @param pListener The callback object for share result + @wraning Must invoke this interface before share + */ + static void setResultListener(ShareResultListener* pListener); + + /** + @brief share result callback + */ + static void shareResult(EShareResult ret, const char* msg); + + virtual const char* getPluginVersion() { return "ProtocolSocial, v0.1.00 , subclass should override this interface!"; }; + virtual const char* getSDKVersion(); + virtual const char* getPluginName() = 0; + +protected: + ProtocolSocial(); +public: + virtual ~ProtocolSocial(); + +protected: + static bool m_bSharing; + static ShareResultListener* m_pListener; + static TShareInfo m_curInfo; +}; + +}} // namespace cocos2d { namespace plugin { + +#endif /* ----- #ifndef __CXX_PROTOCOL_SOCIAL_H__ ----- */ diff --git a/plugin/protocols/platform/android/ProtocolSocial.cpp b/plugin/protocols/platform/android/ProtocolSocial.cpp new file mode 100755 index 0000000000..9825bdd722 --- /dev/null +++ b/plugin/protocols/platform/android/ProtocolSocial.cpp @@ -0,0 +1,151 @@ +#include "ProtocolSocial.h" +#include "PluginJniHelper.h" +#include +#include "PluginUtils.h" +#include "PluginJavaData.h" + +#if 1 +#define LOG_TAG "ProtocolSocial" +#define LOGD(...) __android_log_print(ANDROID_LOG_DEBUG,LOG_TAG,__VA_ARGS__) +#else +#define LOGD(...) +#endif + +namespace cocos2d { namespace plugin { + +extern "C" { + JNIEXPORT void JNICALL Java_org_cocos2dx_plugin_InterfaceSocial_nativeShareResult(JNIEnv* env, jobject thiz, jint ret, jstring msg) + { + std::string strMsg = PluginJniHelper::jstring2string(msg); + ProtocolSocial::shareResult((EShareResult) ret, strMsg.c_str()); + } +} + +bool ProtocolSocial::m_bSharing = false; +ShareResultListener* ProtocolSocial::m_pListener = NULL; +TShareInfo ProtocolSocial::m_curInfo; + +ProtocolSocial::ProtocolSocial() +{ +} + +ProtocolSocial::~ProtocolSocial() +{ + PluginUtils::erasePluginJavaData(this); +} + +bool ProtocolSocial::init() +{ + return true; +} + +void ProtocolSocial::initDeveloperInfo(TDeveloperInfo devInfo) +{ + if (devInfo.empty()) + { + LOGD("The developer info is empty!"); + return; + } + else + { + PluginJavaData* pData = PluginUtils::getPluginJavaData(this); + PluginJniMethodInfo t; + if (PluginJniHelper::getMethodInfo(t + , pData->jclassName.c_str() + , "initDeveloperInfo" + , "(Ljava/util/Hashtable;)V")) + { + // generate the hashtable from map + jobject obj_Map = PluginUtils::createJavaMapObject(t, &devInfo); + + // invoke java method + t.env->CallVoidMethod(pData->jobj, t.methodID, obj_Map); + t.env->DeleteLocalRef(obj_Map); + t.env->DeleteLocalRef(t.classID); + } + } +} + +void ProtocolSocial::share(TShareInfo info) +{ + if (m_bSharing) + { + LOGD("Now is sharing"); + return; + } + + if (info.empty()) + { + if (NULL != m_pListener) + { + shareResult(eShareFail, "Share info error"); + } + LOGD("The Share info is empty!"); + return; + } + else + { + m_bSharing = true; + m_curInfo = info; + + PluginJavaData* pData = PluginUtils::getPluginJavaData(this); + PluginJniMethodInfo t; + if (PluginJniHelper::getMethodInfo(t + , pData->jclassName.c_str() + , "share" + , "(Ljava/util/Hashtable;)V")) + { + // generate the hashtable from map + jobject obj_Map = PluginUtils::createJavaMapObject(t, &info); + + // invoke java method + t.env->CallVoidMethod(pData->jobj, t.methodID, obj_Map); + t.env->DeleteLocalRef(obj_Map); + t.env->DeleteLocalRef(t.classID); + } + } +} + +void ProtocolSocial::setResultListener(ShareResultListener* pListener) +{ + m_pListener = pListener; +} + +void ProtocolSocial::shareResult(EShareResult ret, const char* msg) +{ + m_bSharing = false; + if (m_pListener) + { + m_pListener->shareResult(ret, msg, m_curInfo); + } + else + { + LOGD("Result listener is null!"); + } + m_curInfo.clear(); + LOGD("Share result is : %d(%s)", (int) ret, msg); +} + +const char* ProtocolSocial::getSDKVersion() +{ + std::string verName; + + PluginJavaData* pData = PluginUtils::getPluginJavaData(this); + PluginJniMethodInfo t; + if (PluginJniHelper::getMethodInfo(t + , pData->jclassName.c_str() + , "getSDKVersion" + , "()Ljava/lang/String;")) + { + jstring ret = (jstring)(t.env->CallObjectMethod(pData->jobj, t.methodID)); + verName = PluginJniHelper::jstring2string(ret); + } + return verName.c_str(); +} + +void ProtocolSocial::setDebugMode(bool debug) +{ + PluginUtils::callJavaFunctionWithName_oneBaseType(this, "setDebugMode", "(Z)V", debug); +} + +}} // namespace cocos2d { namespace plugin { diff --git a/plugin/protocols/proj.android/jni/Android.mk b/plugin/protocols/proj.android/jni/Android.mk old mode 100644 new mode 100755 index 9e0ad021e8..5e82597a05 --- a/plugin/protocols/proj.android/jni/Android.mk +++ b/plugin/protocols/proj.android/jni/Android.mk @@ -13,6 +13,7 @@ $(addprefix ../../platform/android/, \ ProtocolAnalytics.cpp \ ProtocolIAP.cpp \ ProtocolAds.cpp \ + ProtocolSocial.cpp \ ) \ ../../PluginManager.cpp \ ../../RegisterPlugin.cpp \ diff --git a/plugin/protocols/proj.android/src/org/cocos2dx/plugin/InterfaceSocial.java b/plugin/protocols/proj.android/src/org/cocos2dx/plugin/InterfaceSocial.java new file mode 100755 index 0000000000..a4b3cb08f6 --- /dev/null +++ b/plugin/protocols/proj.android/src/org/cocos2dx/plugin/InterfaceSocial.java @@ -0,0 +1,29 @@ +package org.cocos2dx.plugin; + +import java.util.Hashtable; + +public class InterfaceSocial { + public static final int SHARERESULT_SUCCESS = 0; + public static final int SHARERESULT_FAIL = 1; + public static final int SHARERESULT_CANCEL = 2; + public static final int SHARERESULT_TIMEOUT = 3; + + public interface ShareAdapter { + public void initDeveloperInfo(Hashtable cpInfo); + public void share(Hashtable cpInfo); + public void setDebugMode(boolean debug); + public String getSDKVersion(); + } + + public static void shareResult(int ret, String msg) { + final int curRet = ret; + final String curMsg = msg; + PluginWrapper.runOnGLThread(new Runnable() { + @Override + public void run() { + nativeShareResult(curRet, curMsg); + } + }); + } + private static native void nativeShareResult(int ret, String msg); +}