mirror of https://github.com/axmolengine/axmol.git
Merge branch 'ForReflection' into develop
Conflicts: plugin/protocols/platform/ios/PluginUtilsIOS.mm
This commit is contained in:
commit
34fbcad467
|
@ -1,96 +0,0 @@
|
||||||
/****************************************************************************
|
|
||||||
Copyright (c) 2012-2013 cocos2d-x.org
|
|
||||||
|
|
||||||
http://www.cocos2d-x.org
|
|
||||||
|
|
||||||
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.
|
|
||||||
****************************************************************************/
|
|
||||||
#ifndef __CCX_ADS_ADMOB_H__
|
|
||||||
#define __CCX_ADS_ADMOB_H__
|
|
||||||
|
|
||||||
#include "ProtocolAds.h"
|
|
||||||
#include <map>
|
|
||||||
#include <string>
|
|
||||||
|
|
||||||
namespace cocos2d { namespace plugin {
|
|
||||||
|
|
||||||
class AdsAdmob : public ProtocolAds
|
|
||||||
{
|
|
||||||
PLUGIN_REGISTER_DECL(AdsAdmob)
|
|
||||||
public:
|
|
||||||
|
|
||||||
typedef enum {
|
|
||||||
kSizeBanner = 0,
|
|
||||||
kSizeIABMRect,
|
|
||||||
kSizeIABBanner,
|
|
||||||
kSizeIABLeaderboard,
|
|
||||||
} AdmobBannerSize;
|
|
||||||
|
|
||||||
/**
|
|
||||||
@brief plugin initialization
|
|
||||||
*/
|
|
||||||
virtual bool init();
|
|
||||||
|
|
||||||
/**
|
|
||||||
@brief config the application info
|
|
||||||
@param devInfo This parameter is the info of application, must contains:
|
|
||||||
AdmobID The publisher ID of admob.
|
|
||||||
@warning Must invoke this interface before other interfaces.
|
|
||||||
And invoked only once.
|
|
||||||
*/
|
|
||||||
virtual void configDeveloperInfo(TAdsDeveloperInfo devInfo);
|
|
||||||
|
|
||||||
/**
|
|
||||||
@brief show adview
|
|
||||||
@param type The adview type need to show.
|
|
||||||
@param sizeEnum The size of the banner view.
|
|
||||||
(only used when type is kBannerAd)
|
|
||||||
Use the enum number in AdmobBannerSize.
|
|
||||||
@param pos The position where the adview be shown.
|
|
||||||
(only used when type is kBannerAd)
|
|
||||||
*/
|
|
||||||
virtual void showAds(AdsType type, int sizeEnum = 0, AdsPos pos = kPosCenter);
|
|
||||||
|
|
||||||
/**
|
|
||||||
@brief Hide the adview
|
|
||||||
@param type The adview type need to hide.
|
|
||||||
*/
|
|
||||||
virtual void hideAds(AdsType type);
|
|
||||||
|
|
||||||
/**
|
|
||||||
@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);
|
|
||||||
|
|
||||||
/**
|
|
||||||
@brief Add the test device ID
|
|
||||||
@param deviceID The device ID
|
|
||||||
*/
|
|
||||||
void addTestDevice(const char* deviceID);
|
|
||||||
|
|
||||||
virtual const char* getPluginVersion() { return "v0.1.01"; };
|
|
||||||
virtual const char* getSDKVersion();
|
|
||||||
|
|
||||||
virtual ~AdsAdmob();
|
|
||||||
};
|
|
||||||
|
|
||||||
}} // namespace cocos2d { namespace plugin {
|
|
||||||
|
|
||||||
#endif /* __CCX_ADS_ADMOB_H__ */
|
|
|
@ -1,60 +0,0 @@
|
||||||
[admob]
|
|
||||||
# the prefix to be added to the generated functions. You might or might not use this in your own
|
|
||||||
# templates
|
|
||||||
prefix = pluginx_admob
|
|
||||||
|
|
||||||
# create a target namespace (in javascript, this would create some code like the equiv. to `ns = ns || {}`)
|
|
||||||
# all classes will be embedded in that namespace
|
|
||||||
target_namespace = plugin
|
|
||||||
|
|
||||||
android_headers = -I%(androidndkdir)s/platforms/android-14/arch-arm/usr/include -I%(androidndkdir)s/platforms/android-14/arch-arm/usr/include/linux -I%(androidndkdir)s/sources/cxx-stl/gnu-libstdc++/4.6/libs/armeabi-v7a/include -I%(androidndkdir)s/sources/cxx-stl/gnu-libstdc++/4.6/include -I%(androidndkdir)s/toolchains/arm-linux-androideabi-4.6/prebuilt/darwin-x86/lib/gcc/arm-linux-androideabi/4.6/include
|
|
||||||
android_flags = -D_SIZE_T_DEFINED_
|
|
||||||
|
|
||||||
clang_headers = -I%(clangllvmdir)s/lib/clang/3.1/include
|
|
||||||
clang_flags = -nostdinc -x c++
|
|
||||||
|
|
||||||
cocos_headers = -I%(pluginxdir)s/protocols/include -I%(pluginxdir)s/plugins/admob/include
|
|
||||||
|
|
||||||
cocos_flags = -DANDROID
|
|
||||||
|
|
||||||
cxxgenerator_headers = -I%(cxxgeneratordir)s/targets/spidermonkey/common
|
|
||||||
|
|
||||||
# extra arguments for clang
|
|
||||||
extra_arguments = %(android_headers)s %(clang_headers)s %(cxxgenerator_headers)s %(cocos_headers)s %(android_flags)s %(clang_flags)s %(cocos_flags)s
|
|
||||||
|
|
||||||
# what headers to parse
|
|
||||||
headers = %(pluginxdir)s/plugins/admob/include/AdsAdmob.h
|
|
||||||
|
|
||||||
# what classes to produce code for. You can use regular expressions here. When testing the regular
|
|
||||||
# expression, it will be enclosed in "^$", like this: "^CCMenu*$".
|
|
||||||
classes = AdsAdmob
|
|
||||||
|
|
||||||
# what should we skip? in the format ClassName::[function function]
|
|
||||||
# ClassName is a regular expression, but will be used like this: "^ClassName$" functions are also
|
|
||||||
# regular expressions, they will not be surrounded by "^$". If you want to skip a whole class, just
|
|
||||||
# add a single "*" as functions. See bellow for several examples. A special class name is "*", which
|
|
||||||
# will apply to all class names. This is a convenience wildcard to be able to skip similar named
|
|
||||||
# functions from all classes.
|
|
||||||
|
|
||||||
skip = *::[createPlugin]
|
|
||||||
|
|
||||||
rename_functions =
|
|
||||||
|
|
||||||
rename_classes =
|
|
||||||
|
|
||||||
# for all class names, should we remove something when registering in the target VM?
|
|
||||||
remove_prefix =
|
|
||||||
|
|
||||||
# classes for which there will be no "parent" lookup
|
|
||||||
classes_have_no_parents =
|
|
||||||
|
|
||||||
# base classes which will be skipped when their sub-classes found them.
|
|
||||||
base_classes_to_skip =
|
|
||||||
|
|
||||||
# classes that create no constructor
|
|
||||||
# CCSet is special and we will use a hand-written constructor
|
|
||||||
abstract_classes = AdsAdmob
|
|
||||||
|
|
||||||
# Determining whether to use script object(js object) to control the lifecycle of native(cpp) object or the other way around. Supported values are 'yes' or 'no'.
|
|
||||||
script_control_cpp = yes
|
|
||||||
|
|
|
@ -1,81 +0,0 @@
|
||||||
/****************************************************************************
|
|
||||||
Copyright (c) 2012-2013 cocos2d-x.org
|
|
||||||
|
|
||||||
http://www.cocos2d-x.org
|
|
||||||
|
|
||||||
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.
|
|
||||||
****************************************************************************/
|
|
||||||
#include "AdsAdmob.h"
|
|
||||||
#include "PluginUtils.h"
|
|
||||||
|
|
||||||
namespace cocos2d { namespace plugin {
|
|
||||||
|
|
||||||
PLUGIN_REGISTER_IMPL(AdsAdmob)
|
|
||||||
|
|
||||||
AdsAdmob::~AdsAdmob()
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
bool AdsAdmob::init()
|
|
||||||
{
|
|
||||||
return PluginUtils::initJavaPlugin(this, "org.cocos2dx.plugin.AdsAdmob");
|
|
||||||
}
|
|
||||||
|
|
||||||
void AdsAdmob::configDeveloperInfo(TAdsDeveloperInfo appInfo)
|
|
||||||
{
|
|
||||||
ProtocolAds::configDeveloperInfo(appInfo);
|
|
||||||
}
|
|
||||||
|
|
||||||
void AdsAdmob::showAds(AdsType type, int sizeEnum, AdsPos pos)
|
|
||||||
{
|
|
||||||
ProtocolAds::showAds(type, sizeEnum, pos);
|
|
||||||
}
|
|
||||||
|
|
||||||
void AdsAdmob::hideAds(AdsType type)
|
|
||||||
{
|
|
||||||
ProtocolAds::hideAds(type);
|
|
||||||
}
|
|
||||||
|
|
||||||
const char* AdsAdmob::getSDKVersion()
|
|
||||||
{
|
|
||||||
return ProtocolAds::getSDKVersion();
|
|
||||||
}
|
|
||||||
|
|
||||||
void AdsAdmob::setDebugMode(bool debug)
|
|
||||||
{
|
|
||||||
ProtocolAds::setDebugMode(debug);
|
|
||||||
}
|
|
||||||
|
|
||||||
void AdsAdmob::addTestDevice(const char* deviceID)
|
|
||||||
{
|
|
||||||
PluginJavaData* pData = PluginUtils::getPluginJavaData(this);
|
|
||||||
PluginJniMethodInfo t;
|
|
||||||
if (PluginJniHelper::getMethodInfo(t
|
|
||||||
, pData->jclassName.c_str()
|
|
||||||
, "addTestDevice"
|
|
||||||
, "(Ljava/lang/String;)V"))
|
|
||||||
{
|
|
||||||
jstring strDeviceID = t.env->NewStringUTF(deviceID);
|
|
||||||
t.env->CallVoidMethod(pData->jobj, t.methodID, strDeviceID);
|
|
||||||
t.env->DeleteLocalRef(strDeviceID);
|
|
||||||
t.env->DeleteLocalRef(t.classID);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
}} // namespace cocos2d { namespace plugin {
|
|
|
@ -30,16 +30,4 @@
|
||||||
<nature>com.android.ide.eclipse.adt.AndroidNature</nature>
|
<nature>com.android.ide.eclipse.adt.AndroidNature</nature>
|
||||||
<nature>org.eclipse.jdt.core.javanature</nature>
|
<nature>org.eclipse.jdt.core.javanature</nature>
|
||||||
</natures>
|
</natures>
|
||||||
<linkedResources>
|
|
||||||
<link>
|
|
||||||
<name>android</name>
|
|
||||||
<type>2</type>
|
|
||||||
<locationURI>PARENT-1-PROJECT_LOC/platform/android</locationURI>
|
|
||||||
</link>
|
|
||||||
<link>
|
|
||||||
<name>include</name>
|
|
||||||
<type>2</type>
|
|
||||||
<locationURI>PARENT-1-PROJECT_LOC/include</locationURI>
|
|
||||||
</link>
|
|
||||||
</linkedResources>
|
|
||||||
</projectDescription>
|
</projectDescription>
|
||||||
|
|
|
@ -1,20 +0,0 @@
|
||||||
# set params
|
|
||||||
PLUGIN_ANDROID_ROOT=$(cd "$(dirname "$0")"; pwd)
|
|
||||||
|
|
||||||
if [ ! "${PLUGIN_ROOT}" ]; then
|
|
||||||
PLUGIN_ROOT="$PLUGIN_ANDROID_ROOT"/../..
|
|
||||||
fi
|
|
||||||
|
|
||||||
# build
|
|
||||||
"$ANDROID_NDK_ROOT"/ndk-build -C "$PLUGIN_ANDROID_ROOT" \
|
|
||||||
NDK_MODULE_PATH="$PLUGIN_ROOT"
|
|
||||||
|
|
||||||
echo
|
|
||||||
if [ "0" != "$?" ]; then
|
|
||||||
echo "Build error occoured!!!"
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
echo
|
|
||||||
echo "Native build action success."
|
|
||||||
exit 0
|
|
|
@ -1,29 +0,0 @@
|
||||||
LOCAL_PATH := $(call my-dir)
|
|
||||||
|
|
||||||
include $(CLEAR_VARS)
|
|
||||||
|
|
||||||
LOCAL_MODULE := PluginAdmobStatic
|
|
||||||
|
|
||||||
LOCAL_MODULE_FILENAME := libPluginAdmobStatic
|
|
||||||
|
|
||||||
LOCAL_SRC_FILES := \
|
|
||||||
$(addprefix ../../platform/android/, \
|
|
||||||
AdsAdmob.cpp \
|
|
||||||
) \
|
|
||||||
|
|
||||||
LOCAL_CFLAGS :=
|
|
||||||
|
|
||||||
LOCAL_EXPORT_CFLAGS :=
|
|
||||||
|
|
||||||
LOCAL_C_INCLUDES := $(LOCAL_PATH)/../../include
|
|
||||||
|
|
||||||
LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/../../include
|
|
||||||
|
|
||||||
LOCAL_WHOLE_STATIC_LIBRARIES := PluginProtocolStatic
|
|
||||||
|
|
||||||
LOCAL_LDLIBS := -landroid
|
|
||||||
LOCAL_LDLIBS += -llog
|
|
||||||
|
|
||||||
include $(BUILD_STATIC_LIBRARY)
|
|
||||||
|
|
||||||
$(call import-module, protocols/proj.android/jni)
|
|
|
@ -1,7 +0,0 @@
|
||||||
# it is needed for ndk-r5
|
|
||||||
APP_STL := gnustl_static
|
|
||||||
APP_CPPFLAGS += -frtti
|
|
||||||
APP_MODULES := PluginAdmobStatic
|
|
||||||
APP_ABI :=armeabi
|
|
||||||
#APP_ABI :=x86
|
|
||||||
#APP_ABI :=mips mips-r2 mips-r2-sf armeabi
|
|
|
@ -28,8 +28,6 @@ import java.util.Hashtable;
|
||||||
import java.util.Iterator;
|
import java.util.Iterator;
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
|
|
||||||
import org.cocos2dx.plugin.InterfaceAds.AdsAdapter;
|
|
||||||
|
|
||||||
import com.google.ads.*;
|
import com.google.ads.*;
|
||||||
import com.google.ads.AdRequest.ErrorCode;
|
import com.google.ads.AdRequest.ErrorCode;
|
||||||
|
|
||||||
|
@ -38,7 +36,7 @@ import android.content.Context;
|
||||||
import android.util.Log;
|
import android.util.Log;
|
||||||
import android.view.WindowManager;
|
import android.view.WindowManager;
|
||||||
|
|
||||||
public class AdsAdmob implements AdsAdapter {
|
public class AdsAdmob implements InterfaceAds {
|
||||||
|
|
||||||
private static final String LOG_TAG = "AdsAdmob";
|
private static final String LOG_TAG = "AdsAdmob";
|
||||||
private static Activity mContext = null;
|
private static Activity mContext = null;
|
||||||
|
@ -94,10 +92,10 @@ public class AdsAdmob implements AdsAdapter {
|
||||||
@Override
|
@Override
|
||||||
public void showAds(int adsType, int sizeEnum, int pos) {
|
public void showAds(int adsType, int sizeEnum, int pos) {
|
||||||
switch (adsType) {
|
switch (adsType) {
|
||||||
case InterfaceAds.ADS_TYPE_BANNER:
|
case AdsWrapper.ADS_TYPE_BANNER:
|
||||||
showBannerAd(sizeEnum, pos);
|
showBannerAd(sizeEnum, pos);
|
||||||
break;
|
break;
|
||||||
case InterfaceAds.ADS_TYPE_FULL_SCREEN:
|
case AdsWrapper.ADS_TYPE_FULL_SCREEN:
|
||||||
LogD("Now not support full screen view in Admob");
|
LogD("Now not support full screen view in Admob");
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
|
@ -113,10 +111,10 @@ public class AdsAdmob implements AdsAdapter {
|
||||||
@Override
|
@Override
|
||||||
public void hideAds(int adsType) {
|
public void hideAds(int adsType) {
|
||||||
switch (adsType) {
|
switch (adsType) {
|
||||||
case InterfaceAds.ADS_TYPE_BANNER:
|
case AdsWrapper.ADS_TYPE_BANNER:
|
||||||
hideBannerAd();
|
hideBannerAd();
|
||||||
break;
|
break;
|
||||||
case InterfaceAds.ADS_TYPE_FULL_SCREEN:
|
case AdsWrapper.ADS_TYPE_FULL_SCREEN:
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
|
@ -178,7 +176,7 @@ public class AdsAdmob implements AdsAdapter {
|
||||||
if (null == mWm) {
|
if (null == mWm) {
|
||||||
mWm = (WindowManager) mContext.getSystemService("window");
|
mWm = (WindowManager) mContext.getSystemService("window");
|
||||||
}
|
}
|
||||||
InterfaceAds.addAdView(mWm, adView, curPos);
|
AdsWrapper.addAdView(mWm, adView, curPos);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
@ -211,20 +209,20 @@ public class AdsAdmob implements AdsAdapter {
|
||||||
@Override
|
@Override
|
||||||
public void onDismissScreen(Ad arg0) {
|
public void onDismissScreen(Ad arg0) {
|
||||||
LogD("onDismissScreen invoked");
|
LogD("onDismissScreen invoked");
|
||||||
InterfaceAds.onAdsResult(mAdapter, InterfaceAds.RESULT_CODE_FullScreenViewDismissed, "Full screen ads view dismissed!");
|
AdsWrapper.onAdsResult(mAdapter, AdsWrapper.RESULT_CODE_FullScreenViewDismissed, "Full screen ads view dismissed!");
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onFailedToReceiveAd(Ad arg0, ErrorCode arg1) {
|
public void onFailedToReceiveAd(Ad arg0, ErrorCode arg1) {
|
||||||
int errorNo = InterfaceAds.RESULT_CODE_UnknownError;
|
int errorNo = AdsWrapper.RESULT_CODE_UnknownError;
|
||||||
String errorMsg = "Unknow error";
|
String errorMsg = "Unknow error";
|
||||||
switch (arg1) {
|
switch (arg1) {
|
||||||
case NETWORK_ERROR:
|
case NETWORK_ERROR:
|
||||||
errorNo = InterfaceAds.RESULT_CODE_NetworkError;
|
errorNo = AdsWrapper.RESULT_CODE_NetworkError;
|
||||||
errorMsg = "Network error";
|
errorMsg = "Network error";
|
||||||
break;
|
break;
|
||||||
case INVALID_REQUEST:
|
case INVALID_REQUEST:
|
||||||
errorNo = InterfaceAds.RESULT_CODE_NetworkError;
|
errorNo = AdsWrapper.RESULT_CODE_NetworkError;
|
||||||
errorMsg = "The ad request is invalid";
|
errorMsg = "The ad request is invalid";
|
||||||
break;
|
break;
|
||||||
case NO_FILL:
|
case NO_FILL:
|
||||||
|
@ -234,7 +232,7 @@ public class AdsAdmob implements AdsAdapter {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
LogD("failed to receive ad : " + errorNo + " , " + errorMsg);
|
LogD("failed to receive ad : " + errorNo + " , " + errorMsg);
|
||||||
InterfaceAds.onAdsResult(mAdapter, errorNo, errorMsg);
|
AdsWrapper.onAdsResult(mAdapter, errorNo, errorMsg);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -245,13 +243,18 @@ public class AdsAdmob implements AdsAdapter {
|
||||||
@Override
|
@Override
|
||||||
public void onPresentScreen(Ad arg0) {
|
public void onPresentScreen(Ad arg0) {
|
||||||
LogD("onPresentScreen invoked");
|
LogD("onPresentScreen invoked");
|
||||||
InterfaceAds.onAdsResult(mAdapter, InterfaceAds.RESULT_CODE_FullScreenViewShown, "Full screen ads view shown!");
|
AdsWrapper.onAdsResult(mAdapter, AdsWrapper.RESULT_CODE_FullScreenViewShown, "Full screen ads view shown!");
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onReceiveAd(Ad arg0) {
|
public void onReceiveAd(Ad arg0) {
|
||||||
LogD("onReceiveAd invoked");
|
LogD("onReceiveAd invoked");
|
||||||
InterfaceAds.onAdsResult(mAdapter, InterfaceAds.RESULT_CODE_AdsReceived, "Ads request received success!");
|
AdsWrapper.onAdsResult(mAdapter, AdsWrapper.RESULT_CODE_AdsReceived, "Ads request received success!");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getPluginVersion() {
|
||||||
|
return "0.2.0";
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,81 +0,0 @@
|
||||||
/****************************************************************************
|
|
||||||
Copyright (c) 2012-2013 cocos2d-x.org
|
|
||||||
|
|
||||||
http://www.cocos2d-x.org
|
|
||||||
|
|
||||||
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.
|
|
||||||
****************************************************************************/
|
|
||||||
#ifndef __CCX_IAP_ALIPAY_H__
|
|
||||||
#define __CCX_IAP_ALIPAY_H__
|
|
||||||
|
|
||||||
#include "ProtocolIAP.h"
|
|
||||||
#include <map>
|
|
||||||
#include <string>
|
|
||||||
|
|
||||||
namespace cocos2d { namespace plugin {
|
|
||||||
|
|
||||||
class IAPAlipay : public ProtocolIAP
|
|
||||||
{
|
|
||||||
PLUGIN_REGISTER_DECL(IAPAlipay)
|
|
||||||
public:
|
|
||||||
/**
|
|
||||||
@brief plugin initialization
|
|
||||||
*/
|
|
||||||
virtual bool init();
|
|
||||||
|
|
||||||
/**
|
|
||||||
@brief config the developer info
|
|
||||||
@param devInfo This parameter is the info of developer, must contains key:
|
|
||||||
AlipayPartner The partner id of alipay account
|
|
||||||
AlipaySeller The seller id of alipay account
|
|
||||||
AlipayRsaPrivate The RSA private key of alipay account
|
|
||||||
AlipayPublic The public key of alipay account
|
|
||||||
AlipayNotifyUrl The notify url of developer (must not be empty)
|
|
||||||
AlipayPluginName The apk file name of Alipay (must not be empty)
|
|
||||||
@warning Must invoke this interface before other interfaces.
|
|
||||||
And invoked only once.
|
|
||||||
*/
|
|
||||||
virtual void configDeveloperInfo(TIAPDeveloperInfo devInfo);
|
|
||||||
|
|
||||||
/**
|
|
||||||
@brief pay for product
|
|
||||||
@param info The info of product, must contains key:
|
|
||||||
productName The name of product
|
|
||||||
productPrice The price of product(must can be parse to float)
|
|
||||||
productDesc The description of product
|
|
||||||
@warning For different plugin, the parameter should have other keys to pay.
|
|
||||||
Look at the manual of plugins.
|
|
||||||
*/
|
|
||||||
virtual void payForProduct(TProductInfo 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);
|
|
||||||
|
|
||||||
virtual const char* getPluginVersion() { return "v0.1.01"; };
|
|
||||||
virtual const char* getSDKVersion();
|
|
||||||
|
|
||||||
virtual ~IAPAlipay();
|
|
||||||
};
|
|
||||||
|
|
||||||
}} // namespace cocos2d { namespace plugin {
|
|
||||||
|
|
||||||
#endif /* __CCX_IAP_ALIPAY_H__ */
|
|
|
@ -1,60 +0,0 @@
|
||||||
[alipay]
|
|
||||||
# the prefix to be added to the generated functions. You might or might not use this in your own
|
|
||||||
# templates
|
|
||||||
prefix = pluginx_alipay
|
|
||||||
|
|
||||||
# create a target namespace (in javascript, this would create some code like the equiv. to `ns = ns || {}`)
|
|
||||||
# all classes will be embedded in that namespace
|
|
||||||
target_namespace = plugin
|
|
||||||
|
|
||||||
android_headers = -I%(androidndkdir)s/platforms/android-14/arch-arm/usr/include -I%(androidndkdir)s/platforms/android-14/arch-arm/usr/include/linux -I%(androidndkdir)s/sources/cxx-stl/gnu-libstdc++/4.6/libs/armeabi-v7a/include -I%(androidndkdir)s/sources/cxx-stl/gnu-libstdc++/4.6/include -I%(androidndkdir)s/toolchains/arm-linux-androideabi-4.6/prebuilt/darwin-x86/lib/gcc/arm-linux-androideabi/4.6/include
|
|
||||||
android_flags = -D_SIZE_T_DEFINED_
|
|
||||||
|
|
||||||
clang_headers = -I%(clangllvmdir)s/lib/clang/3.1/include
|
|
||||||
clang_flags = -nostdinc -x c++
|
|
||||||
|
|
||||||
cocos_headers = -I%(pluginxdir)s/protocols/include -I%(pluginxdir)s/plugins/alipay/include
|
|
||||||
|
|
||||||
cocos_flags = -DANDROID
|
|
||||||
|
|
||||||
cxxgenerator_headers = -I%(cxxgeneratordir)s/targets/spidermonkey/common
|
|
||||||
|
|
||||||
# extra arguments for clang
|
|
||||||
extra_arguments = %(android_headers)s %(clang_headers)s %(cxxgenerator_headers)s %(cocos_headers)s %(android_flags)s %(clang_flags)s %(cocos_flags)s
|
|
||||||
|
|
||||||
# what headers to parse
|
|
||||||
headers = %(pluginxdir)s/plugins/alipay/include/IAPAlipay.h
|
|
||||||
|
|
||||||
# what classes to produce code for. You can use regular expressions here. When testing the regular
|
|
||||||
# expression, it will be enclosed in "^$", like this: "^CCMenu*$".
|
|
||||||
classes = IAPAlipay
|
|
||||||
|
|
||||||
# what should we skip? in the format ClassName::[function function]
|
|
||||||
# ClassName is a regular expression, but will be used like this: "^ClassName$" functions are also
|
|
||||||
# regular expressions, they will not be surrounded by "^$". If you want to skip a whole class, just
|
|
||||||
# add a single "*" as functions. See bellow for several examples. A special class name is "*", which
|
|
||||||
# will apply to all class names. This is a convenience wildcard to be able to skip similar named
|
|
||||||
# functions from all classes.
|
|
||||||
|
|
||||||
skip = *::[createPlugin]
|
|
||||||
|
|
||||||
rename_functions =
|
|
||||||
|
|
||||||
rename_classes =
|
|
||||||
|
|
||||||
# for all class names, should we remove something when registering in the target VM?
|
|
||||||
remove_prefix =
|
|
||||||
|
|
||||||
# classes for which there will be no "parent" lookup
|
|
||||||
classes_have_no_parents =
|
|
||||||
|
|
||||||
# base classes which will be skipped when their sub-classes found them.
|
|
||||||
base_classes_to_skip =
|
|
||||||
|
|
||||||
# classes that create no constructor
|
|
||||||
# CCSet is special and we will use a hand-written constructor
|
|
||||||
abstract_classes = IAPAlipay
|
|
||||||
|
|
||||||
# Determining whether to use script object(js object) to control the lifecycle of native(cpp) object or the other way around. Supported values are 'yes' or 'no'.
|
|
||||||
script_control_cpp = yes
|
|
||||||
|
|
|
@ -1,84 +0,0 @@
|
||||||
/****************************************************************************
|
|
||||||
Copyright (c) 2012-2013 cocos2d-x.org
|
|
||||||
|
|
||||||
http://www.cocos2d-x.org
|
|
||||||
|
|
||||||
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.
|
|
||||||
****************************************************************************/
|
|
||||||
#include "IAPAlipay.h"
|
|
||||||
#include "PluginUtils.h"
|
|
||||||
|
|
||||||
namespace cocos2d { namespace plugin {
|
|
||||||
|
|
||||||
PLUGIN_REGISTER_IMPL(IAPAlipay)
|
|
||||||
|
|
||||||
IAPAlipay::~IAPAlipay()
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
@brief plugin initialization
|
|
||||||
*/
|
|
||||||
bool IAPAlipay::init()
|
|
||||||
{
|
|
||||||
return PluginUtils::initJavaPlugin(this, "org.cocos2dx.plugin.IAPAlipay");
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
@brief config the developer info
|
|
||||||
@param devInfo This parameter is the info of developer, must contains key:
|
|
||||||
AlipayPartner The partner id of alipay account
|
|
||||||
AlipaySeller The seller id of alipay account
|
|
||||||
AlipayRsaPrivate The RSA private key of alipay account
|
|
||||||
AlipayPublic The public key of alipay account
|
|
||||||
AlipayNotifyUrl The notify url of developer (must not be empty)
|
|
||||||
AlipayPluginName The apk file name of Alipay (must not be empty)
|
|
||||||
@warning Must invoke this interface before other interfaces.
|
|
||||||
And invoked only once.
|
|
||||||
*/
|
|
||||||
void IAPAlipay::configDeveloperInfo(TIAPDeveloperInfo devInfo)
|
|
||||||
{
|
|
||||||
ProtocolIAP::configDeveloperInfo(devInfo);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
@brief pay for product
|
|
||||||
@param info The info of product, must contains key:
|
|
||||||
productName The name of product
|
|
||||||
productPrice The price of product(must can be parse to float)
|
|
||||||
productDesc The description of product
|
|
||||||
@warning For different plugin, the parameter should have other keys to pay.
|
|
||||||
Look at the manual of plugins.
|
|
||||||
*/
|
|
||||||
void IAPAlipay::payForProduct(TProductInfo info)
|
|
||||||
{
|
|
||||||
ProtocolIAP::payForProduct(info);
|
|
||||||
}
|
|
||||||
|
|
||||||
const char* IAPAlipay::getSDKVersion()
|
|
||||||
{
|
|
||||||
return ProtocolIAP::getSDKVersion();
|
|
||||||
}
|
|
||||||
|
|
||||||
void IAPAlipay::setDebugMode(bool debug)
|
|
||||||
{
|
|
||||||
ProtocolIAP::setDebugMode(debug);
|
|
||||||
}
|
|
||||||
|
|
||||||
}} // namespace cocos2d { namespace plugin {
|
|
|
@ -30,16 +30,4 @@
|
||||||
<nature>com.android.ide.eclipse.adt.AndroidNature</nature>
|
<nature>com.android.ide.eclipse.adt.AndroidNature</nature>
|
||||||
<nature>org.eclipse.jdt.core.javanature</nature>
|
<nature>org.eclipse.jdt.core.javanature</nature>
|
||||||
</natures>
|
</natures>
|
||||||
<linkedResources>
|
|
||||||
<link>
|
|
||||||
<name>android</name>
|
|
||||||
<type>2</type>
|
|
||||||
<locationURI>PARENT-1-PROJECT_LOC/platform/android</locationURI>
|
|
||||||
</link>
|
|
||||||
<link>
|
|
||||||
<name>include</name>
|
|
||||||
<type>2</type>
|
|
||||||
<locationURI>PARENT-1-PROJECT_LOC/include</locationURI>
|
|
||||||
</link>
|
|
||||||
</linkedResources>
|
|
||||||
</projectDescription>
|
</projectDescription>
|
||||||
|
|
|
@ -1,20 +0,0 @@
|
||||||
# set params
|
|
||||||
PLUGIN_ANDROID_ROOT=$(cd "$(dirname "$0")"; pwd)
|
|
||||||
|
|
||||||
if [ ! "${PLUGIN_ROOT}" ]; then
|
|
||||||
PLUGIN_ROOT="$PLUGIN_ANDROID_ROOT"/../..
|
|
||||||
fi
|
|
||||||
|
|
||||||
# build
|
|
||||||
"$ANDROID_NDK_ROOT"/ndk-build -C "$PLUGIN_ANDROID_ROOT" \
|
|
||||||
NDK_MODULE_PATH="$PLUGIN_ROOT"
|
|
||||||
|
|
||||||
echo
|
|
||||||
if [ "0" != "$?" ]; then
|
|
||||||
echo "Build error occoured!!!"
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
echo
|
|
||||||
echo "Native build action success."
|
|
||||||
exit 0
|
|
|
@ -1,29 +0,0 @@
|
||||||
LOCAL_PATH := $(call my-dir)
|
|
||||||
|
|
||||||
include $(CLEAR_VARS)
|
|
||||||
|
|
||||||
LOCAL_MODULE := PluginAlipayStatic
|
|
||||||
|
|
||||||
LOCAL_MODULE_FILENAME := libPluginAlipayStatic
|
|
||||||
|
|
||||||
LOCAL_SRC_FILES := \
|
|
||||||
$(addprefix ../../platform/android/, \
|
|
||||||
IAPAlipay.cpp \
|
|
||||||
) \
|
|
||||||
|
|
||||||
LOCAL_CFLAGS :=
|
|
||||||
|
|
||||||
LOCAL_EXPORT_CFLAGS :=
|
|
||||||
|
|
||||||
LOCAL_C_INCLUDES := $(LOCAL_PATH)/../../include
|
|
||||||
|
|
||||||
LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/../../include
|
|
||||||
|
|
||||||
LOCAL_WHOLE_STATIC_LIBRARIES := PluginProtocolStatic
|
|
||||||
|
|
||||||
LOCAL_LDLIBS := -landroid
|
|
||||||
LOCAL_LDLIBS += -llog
|
|
||||||
|
|
||||||
include $(BUILD_STATIC_LIBRARY)
|
|
||||||
|
|
||||||
$(call import-module, protocols/proj.android/jni)
|
|
|
@ -1,7 +0,0 @@
|
||||||
# it is needed for ndk-r5
|
|
||||||
APP_STL := gnustl_static
|
|
||||||
APP_CPPFLAGS += -frtti
|
|
||||||
APP_MODULES := PluginAlipayStatic
|
|
||||||
APP_ABI :=armeabi
|
|
||||||
#APP_ABI :=x86
|
|
||||||
#APP_ABI :=mips mips-r2 mips-r2-sf armeabi
|
|
|
@ -28,8 +28,6 @@ import java.text.SimpleDateFormat;
|
||||||
import java.util.Date;
|
import java.util.Date;
|
||||||
import java.util.Hashtable;
|
import java.util.Hashtable;
|
||||||
|
|
||||||
import org.cocos2dx.plugin.InterfaceIAP.IAPAdapter;
|
|
||||||
|
|
||||||
import android.app.Activity;
|
import android.app.Activity;
|
||||||
import android.app.ProgressDialog;
|
import android.app.ProgressDialog;
|
||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
|
@ -41,7 +39,7 @@ import android.os.Message;
|
||||||
import android.util.Log;
|
import android.util.Log;
|
||||||
import android.view.KeyEvent;
|
import android.view.KeyEvent;
|
||||||
|
|
||||||
public class IAPAlipay implements IAPAdapter {
|
public class IAPAlipay implements InterfaceIAP {
|
||||||
|
|
||||||
private static final String LOG_TAG = "IAPAlipay";
|
private static final String LOG_TAG = "IAPAlipay";
|
||||||
private static Activity mContext = null;
|
private static Activity mContext = null;
|
||||||
|
@ -97,7 +95,7 @@ public class IAPAlipay implements IAPAdapter {
|
||||||
public void payForProduct(Hashtable<String, String> info) {
|
public void payForProduct(Hashtable<String, String> info) {
|
||||||
LogD("payForProduct invoked " + info.toString());
|
LogD("payForProduct invoked " + info.toString());
|
||||||
if (! networkReachable()) {
|
if (! networkReachable()) {
|
||||||
payResult(InterfaceIAP.PAYRESULT_FAIL, "网络不可用");
|
payResult(IAPWrapper.PAYRESULT_FAIL, "网络不可用");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -108,7 +106,7 @@ public class IAPAlipay implements IAPAdapter {
|
||||||
MobileSecurePayHelper mspHelper = new MobileSecurePayHelper(mContext);
|
MobileSecurePayHelper mspHelper = new MobileSecurePayHelper(mContext);
|
||||||
boolean bInstalled = mspHelper.detectMobile_sp();
|
boolean bInstalled = mspHelper.detectMobile_sp();
|
||||||
if (! bInstalled) {
|
if (! bInstalled) {
|
||||||
payResult(InterfaceIAP.PAYRESULT_FAIL, "未安装支付宝插件");
|
payResult(IAPWrapper.PAYRESULT_FAIL, "未安装支付宝插件");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -138,12 +136,12 @@ public class IAPAlipay implements IAPAdapter {
|
||||||
closeProgress();
|
closeProgress();
|
||||||
mProgress = BaseHelper.showProgress(mContext, null, "正在支付", false, true);
|
mProgress = BaseHelper.showProgress(mContext, null, "正在支付", false, true);
|
||||||
} else {
|
} else {
|
||||||
payResult(InterfaceIAP.PAYRESULT_FAIL, "支付失败");
|
payResult(IAPWrapper.PAYRESULT_FAIL, "支付失败");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
} catch (Exception ex) {
|
} catch (Exception ex) {
|
||||||
LogE("Remote call failed", ex);
|
LogE("Remote call failed", ex);
|
||||||
payResult(InterfaceIAP.PAYRESULT_FAIL, "remote call failed");
|
payResult(IAPWrapper.PAYRESULT_FAIL, "remote call failed");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -200,21 +198,21 @@ public class IAPAlipay implements IAPAdapter {
|
||||||
int retVal = resultChecker.checkSign();
|
int retVal = resultChecker.checkSign();
|
||||||
// 返回验签结果以及交易状态
|
// 返回验签结果以及交易状态
|
||||||
if (retVal == ResultChecker.RESULT_CHECK_SIGN_FAILED) {
|
if (retVal == ResultChecker.RESULT_CHECK_SIGN_FAILED) {
|
||||||
payResult(InterfaceIAP.PAYRESULT_FAIL, "签名验证失败");
|
payResult(IAPWrapper.PAYRESULT_FAIL, "签名验证失败");
|
||||||
} else if (retVal == ResultChecker.RESULT_CHECK_SIGN_SUCCEED && resultChecker.isPayOk()) {
|
} else if (retVal == ResultChecker.RESULT_CHECK_SIGN_SUCCEED && resultChecker.isPayOk()) {
|
||||||
payResult(InterfaceIAP.PAYRESULT_SUCCESS, "支付成功");
|
payResult(IAPWrapper.PAYRESULT_SUCCESS, "支付成功");
|
||||||
} else {
|
} else {
|
||||||
payResult(InterfaceIAP.PAYRESULT_FAIL, "支付失败");
|
payResult(IAPWrapper.PAYRESULT_FAIL, "支付失败");
|
||||||
}
|
}
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
payResult(InterfaceIAP.PAYRESULT_FAIL, "结果解析失败");
|
payResult(IAPWrapper.PAYRESULT_FAIL, "结果解析失败");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
mAdapter.closeProgress();
|
mAdapter.closeProgress();
|
||||||
payResult(InterfaceIAP.PAYRESULT_FAIL, "支付失败");
|
payResult(IAPWrapper.PAYRESULT_FAIL, "支付失败");
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -335,7 +333,12 @@ public class IAPAlipay implements IAPAdapter {
|
||||||
}
|
}
|
||||||
|
|
||||||
private static void payResult(int ret, String msg) {
|
private static void payResult(int ret, String msg) {
|
||||||
InterfaceIAP.onPayResult(mAdapter, ret, msg);
|
IAPWrapper.onPayResult(mAdapter, ret, msg);
|
||||||
LogD("Alipay result : " + ret + " msg : " + msg);
|
LogD("Alipay result : " + ret + " msg : " + msg);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getPluginVersion() {
|
||||||
|
return "0.2.0";
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,170 +0,0 @@
|
||||||
/****************************************************************************
|
|
||||||
Copyright (c) 2012-2013 cocos2d-x.org
|
|
||||||
|
|
||||||
http://www.cocos2d-x.org
|
|
||||||
|
|
||||||
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.
|
|
||||||
****************************************************************************/
|
|
||||||
#ifndef __CCX_ANALYTICS_FLURRY_H__
|
|
||||||
#define __CCX_ANALYTICS_FLURRY_H__
|
|
||||||
|
|
||||||
#include "ProtocolAnalytics.h"
|
|
||||||
|
|
||||||
namespace cocos2d { namespace plugin {
|
|
||||||
|
|
||||||
class AnalyticsFlurry : public ProtocolAnalytics
|
|
||||||
{
|
|
||||||
PLUGIN_REGISTER_DECL(AnalyticsFlurry)
|
|
||||||
public:
|
|
||||||
enum Gender{
|
|
||||||
FEMALE = 0,
|
|
||||||
MALE = 1
|
|
||||||
};
|
|
||||||
|
|
||||||
virtual ~AnalyticsFlurry();
|
|
||||||
|
|
||||||
/**
|
|
||||||
@par override interface of base class
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
@brief plugin initialization
|
|
||||||
*/
|
|
||||||
virtual bool init();
|
|
||||||
|
|
||||||
/**
|
|
||||||
@brief Start a new session.
|
|
||||||
@param appKey The identity of the application.
|
|
||||||
*/
|
|
||||||
virtual void startSession(const char* appKey);
|
|
||||||
|
|
||||||
/**
|
|
||||||
@brief Stop a session.
|
|
||||||
@warning This interface only worked on android
|
|
||||||
*/
|
|
||||||
virtual void stopSession();
|
|
||||||
|
|
||||||
/**
|
|
||||||
@brief Set whether needs to output logs to console.
|
|
||||||
@param debug if true debug mode enabled, or debug mode disabled.
|
|
||||||
@note It must be invoked before calling startSession.
|
|
||||||
*/
|
|
||||||
virtual void setDebugMode(bool debug);
|
|
||||||
|
|
||||||
/**
|
|
||||||
@brief Set the timeout for expiring a session.
|
|
||||||
@param millis In milliseconds as the unit of time.
|
|
||||||
@note It must be invoked before calling startSession.
|
|
||||||
*/
|
|
||||||
virtual void setSessionContinueMillis(long millis);
|
|
||||||
|
|
||||||
/**
|
|
||||||
@brief log an error
|
|
||||||
@param errorId The identity of error
|
|
||||||
@param message Extern message for the error
|
|
||||||
*/
|
|
||||||
virtual void logError(const char* errorId, const char* message);
|
|
||||||
|
|
||||||
/**
|
|
||||||
@brief log an event.
|
|
||||||
@param eventId The identity of event
|
|
||||||
@param paramMap Extern parameters of the event, use NULL if not needed.
|
|
||||||
*/
|
|
||||||
virtual void logEvent(const char* eventId, LogEventParamMap* paramMap = NULL);
|
|
||||||
|
|
||||||
/**
|
|
||||||
@brief Track an event begin.
|
|
||||||
@param eventId The identity of event
|
|
||||||
*/
|
|
||||||
virtual void logTimedEventBegin(const char* eventId);
|
|
||||||
|
|
||||||
/**
|
|
||||||
@brief Track an event end.
|
|
||||||
@param eventId The identity of event
|
|
||||||
*/
|
|
||||||
virtual void logTimedEventEnd(const char* eventId);
|
|
||||||
|
|
||||||
/**
|
|
||||||
@brief Whether to catch uncaught exceptions to server.
|
|
||||||
@warning This interface only worked on android.
|
|
||||||
*/
|
|
||||||
virtual void setCaptureUncaughtException(bool enabled);
|
|
||||||
|
|
||||||
virtual const char* getPluginVersion() { return "v0.1.01"; };
|
|
||||||
virtual const char* getSDKVersion();
|
|
||||||
|
|
||||||
/**
|
|
||||||
@par Unique interface of Flurry
|
|
||||||
*/
|
|
||||||
/**
|
|
||||||
@brief Sets the age of the user at the time of this session.
|
|
||||||
*/
|
|
||||||
void setAge(int age);
|
|
||||||
|
|
||||||
/**
|
|
||||||
@brief Sets the gender of the user.
|
|
||||||
*/
|
|
||||||
void setGender(Gender gender);
|
|
||||||
|
|
||||||
/**
|
|
||||||
@brief Sets the userId for this session.
|
|
||||||
*/
|
|
||||||
void setUserId(const char* userId);
|
|
||||||
|
|
||||||
/**
|
|
||||||
@brief Log a page view.
|
|
||||||
*/
|
|
||||||
void logPageView();
|
|
||||||
|
|
||||||
/**
|
|
||||||
@brief Set the version name of the app.
|
|
||||||
@note It must be invoked before calling startSession.
|
|
||||||
*/
|
|
||||||
void setVersionName(const char* versionName);
|
|
||||||
|
|
||||||
/**
|
|
||||||
@par interface for android
|
|
||||||
*/
|
|
||||||
/**
|
|
||||||
@brief Enable the use of HTTPS communications.
|
|
||||||
@warning This interface only worked on android
|
|
||||||
*/
|
|
||||||
void setUseHttps(bool useHttps);
|
|
||||||
|
|
||||||
/** @brief Enable or disable detailed location reporting.
|
|
||||||
* @note It must be invoked before calling startSession.
|
|
||||||
* @warning This interface only worked on android
|
|
||||||
*/
|
|
||||||
void setReportLocation(bool enabled);
|
|
||||||
|
|
||||||
/**
|
|
||||||
@par interface for ios
|
|
||||||
*/
|
|
||||||
/**
|
|
||||||
@brief Log a timed event with parameters.
|
|
||||||
@warning The paramMap is only worked on ios.
|
|
||||||
On android, paramMap is ignored.
|
|
||||||
*/
|
|
||||||
void logTimedEventBegin(const char* eventId, LogEventParamMap* paramMap);
|
|
||||||
void logTimedEventEnd(const char* eventId, LogEventParamMap* paramMap);
|
|
||||||
};
|
|
||||||
|
|
||||||
}} // namespace cocos2d { namespace plugin {
|
|
||||||
|
|
||||||
#endif /* __CCX_ANALYTICS_FLURRY_H__ */
|
|
|
@ -1,59 +0,0 @@
|
||||||
[flurry]
|
|
||||||
# the prefix to be added to the generated functions. You might or might not use this in your own
|
|
||||||
# templates
|
|
||||||
prefix = pluginx_flurry
|
|
||||||
|
|
||||||
# create a target namespace (in javascript, this would create some code like the equiv. to `ns = ns || {}`)
|
|
||||||
# all classes will be embedded in that namespace
|
|
||||||
target_namespace = plugin
|
|
||||||
|
|
||||||
android_headers = -I%(androidndkdir)s/platforms/android-14/arch-arm/usr/include -I%(androidndkdir)s/platforms/android-14/arch-arm/usr/include/linux -I%(androidndkdir)s/sources/cxx-stl/gnu-libstdc++/4.6/libs/armeabi-v7a/include -I%(androidndkdir)s/sources/cxx-stl/gnu-libstdc++/4.6/include -I%(androidndkdir)s/toolchains/arm-linux-androideabi-4.6/prebuilt/darwin-x86/lib/gcc/arm-linux-androideabi/4.6/include
|
|
||||||
android_flags = -D_SIZE_T_DEFINED_
|
|
||||||
|
|
||||||
clang_headers = -I%(clangllvmdir)s/lib/clang/3.1/include
|
|
||||||
clang_flags = -nostdinc -x c++
|
|
||||||
|
|
||||||
cocos_headers = -I%(pluginxdir)s/protocols/include -I%(pluginxdir)s/plugins/flurry/include
|
|
||||||
|
|
||||||
cocos_flags = -DANDROID
|
|
||||||
|
|
||||||
cxxgenerator_headers = -I%(cxxgeneratordir)s/targets/spidermonkey/common
|
|
||||||
|
|
||||||
# extra arguments for clang
|
|
||||||
extra_arguments = %(android_headers)s %(clang_headers)s %(cxxgenerator_headers)s %(cocos_headers)s %(android_flags)s %(clang_flags)s %(cocos_flags)s
|
|
||||||
|
|
||||||
# what headers to parse
|
|
||||||
headers = %(pluginxdir)s/plugins/flurry/include/AnalyticsFlurry.h
|
|
||||||
|
|
||||||
# what classes to produce code for. You can use regular expressions here. When testing the regular
|
|
||||||
# expression, it will be enclosed in "^$", like this: "^CCMenu*$".
|
|
||||||
classes = AnalyticsFlurry
|
|
||||||
|
|
||||||
# what should we skip? in the format ClassName::[function function]
|
|
||||||
# ClassName is a regular expression, but will be used like this: "^ClassName$" functions are also
|
|
||||||
# regular expressions, they will not be surrounded by "^$". If you want to skip a whole class, just
|
|
||||||
# add a single "*" as functions. See bellow for several examples. A special class name is "*", which
|
|
||||||
# will apply to all class names. This is a convenience wildcard to be able to skip similar named
|
|
||||||
# functions from all classes.
|
|
||||||
|
|
||||||
skip = *::[createPlugin]
|
|
||||||
|
|
||||||
rename_functions =
|
|
||||||
|
|
||||||
rename_classes =
|
|
||||||
|
|
||||||
# for all class names, should we remove something when registering in the target VM?
|
|
||||||
remove_prefix =
|
|
||||||
|
|
||||||
# classes for which there will be no "parent" lookup
|
|
||||||
classes_have_no_parents =
|
|
||||||
|
|
||||||
# base classes which will be skipped when their sub-classes found them.
|
|
||||||
base_classes_to_skip =
|
|
||||||
|
|
||||||
# classes that create no constructor
|
|
||||||
# CCSet is special and we will use a hand-written constructor
|
|
||||||
abstract_classes = AnalyticsFlurry
|
|
||||||
|
|
||||||
# Determining whether to use script object(js object) to control the lifecycle of native(cpp) object or the other way around. Supported values are 'yes' or 'no'.
|
|
||||||
script_control_cpp = yes
|
|
|
@ -1,246 +0,0 @@
|
||||||
/****************************************************************************
|
|
||||||
Copyright (c) 2012-2013 cocos2d-x.org
|
|
||||||
|
|
||||||
http://www.cocos2d-x.org
|
|
||||||
|
|
||||||
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.
|
|
||||||
****************************************************************************/
|
|
||||||
#include "AnalyticsFlurry.h"
|
|
||||||
#include "PluginJniHelper.h"
|
|
||||||
#include <android/log.h>
|
|
||||||
#include "PluginUtils.h"
|
|
||||||
#include "PluginJavaData.h"
|
|
||||||
|
|
||||||
#if 1
|
|
||||||
#define LOG_TAG "AnalyticsFlurry"
|
|
||||||
#define LOGD(...) __android_log_print(ANDROID_LOG_DEBUG,LOG_TAG,__VA_ARGS__)
|
|
||||||
#else
|
|
||||||
#define LOGD(...)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
namespace cocos2d { namespace plugin {
|
|
||||||
|
|
||||||
PLUGIN_REGISTER_IMPL(AnalyticsFlurry)
|
|
||||||
|
|
||||||
AnalyticsFlurry::~AnalyticsFlurry()
|
|
||||||
{
|
|
||||||
LOGD("AnalyticsFlurry destructor");
|
|
||||||
}
|
|
||||||
|
|
||||||
bool AnalyticsFlurry::init()
|
|
||||||
{
|
|
||||||
return PluginUtils::initJavaPlugin(this, "org.cocos2dx.plugin.AnalyticsFlurry");
|
|
||||||
}
|
|
||||||
|
|
||||||
void AnalyticsFlurry::setReportLocation(bool enabled)
|
|
||||||
{
|
|
||||||
PluginJavaData* pData = PluginUtils::getPluginJavaData(this);
|
|
||||||
PluginJniMethodInfo t;
|
|
||||||
if (PluginJniHelper::getMethodInfo(t
|
|
||||||
, pData->jclassName.c_str()
|
|
||||||
, "setReportLocation"
|
|
||||||
, "(Z)V"))
|
|
||||||
{
|
|
||||||
t.env->CallVoidMethod(pData->jobj, t.methodID, enabled);
|
|
||||||
t.env->DeleteLocalRef(t.classID);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void AnalyticsFlurry::logPageView()
|
|
||||||
{
|
|
||||||
PluginJavaData* pData = PluginUtils::getPluginJavaData(this);
|
|
||||||
PluginJniMethodInfo t;
|
|
||||||
if (PluginJniHelper::getMethodInfo(t
|
|
||||||
, pData->jclassName.c_str()
|
|
||||||
, "logPageView"
|
|
||||||
, "()V"))
|
|
||||||
{
|
|
||||||
t.env->CallVoidMethod(pData->jobj, t.methodID);
|
|
||||||
t.env->DeleteLocalRef(t.classID);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void AnalyticsFlurry::setVersionName(const char* versionName)
|
|
||||||
{
|
|
||||||
return_if_fails(versionName != NULL && strlen(versionName) > 0);
|
|
||||||
PluginJavaData* pData = PluginUtils::getPluginJavaData(this);
|
|
||||||
PluginJniMethodInfo t;
|
|
||||||
if (PluginJniHelper::getMethodInfo(t
|
|
||||||
, pData->jclassName.c_str()
|
|
||||||
, "setVersionName"
|
|
||||||
, "(Ljava/lang/String;)V"))
|
|
||||||
{
|
|
||||||
jstring jversionName = t.env->NewStringUTF(versionName);
|
|
||||||
t.env->CallVoidMethod(pData->jobj, t.methodID, jversionName);
|
|
||||||
t.env->DeleteLocalRef(jversionName);
|
|
||||||
t.env->DeleteLocalRef(t.classID);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void AnalyticsFlurry::setAge(int age)
|
|
||||||
{
|
|
||||||
PluginJavaData* pData = PluginUtils::getPluginJavaData(this);
|
|
||||||
PluginJniMethodInfo t;
|
|
||||||
if (PluginJniHelper::getMethodInfo(t
|
|
||||||
, pData->jclassName.c_str()
|
|
||||||
, "setAge"
|
|
||||||
, "(I)V"))
|
|
||||||
{
|
|
||||||
t.env->CallVoidMethod(pData->jobj, t.methodID, age);
|
|
||||||
t.env->DeleteLocalRef(t.classID);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void AnalyticsFlurry::setGender(Gender gender)
|
|
||||||
{
|
|
||||||
PluginJavaData* pData = PluginUtils::getPluginJavaData(this);
|
|
||||||
PluginJniMethodInfo t;
|
|
||||||
if (PluginJniHelper::getMethodInfo(t
|
|
||||||
, pData->jclassName.c_str()
|
|
||||||
, "setGender"
|
|
||||||
, "(B)V"))
|
|
||||||
{
|
|
||||||
t.env->CallVoidMethod(pData->jobj, t.methodID, (jbyte)gender);
|
|
||||||
t.env->DeleteLocalRef(t.classID);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void AnalyticsFlurry::setUserId(const char* userId)
|
|
||||||
{
|
|
||||||
PluginJavaData* pData = PluginUtils::getPluginJavaData(this);
|
|
||||||
return_if_fails(userId != NULL && strlen(userId) > 0);
|
|
||||||
PluginJniMethodInfo t;
|
|
||||||
if (PluginJniHelper::getMethodInfo(t
|
|
||||||
, pData->jclassName.c_str()
|
|
||||||
, "setUserId"
|
|
||||||
, "(Ljava/lang/String;)V"))
|
|
||||||
{
|
|
||||||
jstring juserId = t.env->NewStringUTF(userId);
|
|
||||||
t.env->CallVoidMethod(pData->jobj, t.methodID, juserId);
|
|
||||||
t.env->DeleteLocalRef(juserId);
|
|
||||||
t.env->DeleteLocalRef(t.classID);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void AnalyticsFlurry::setUseHttps(bool useHttps)
|
|
||||||
{
|
|
||||||
PluginJavaData* pData = PluginUtils::getPluginJavaData(this);
|
|
||||||
PluginJniMethodInfo t;
|
|
||||||
if (PluginJniHelper::getMethodInfo(t
|
|
||||||
, pData->jclassName.c_str()
|
|
||||||
, "setUseHttps"
|
|
||||||
, "(Z)V"))
|
|
||||||
{
|
|
||||||
t.env->CallVoidMethod(pData->jobj, t.methodID, useHttps);
|
|
||||||
t.env->DeleteLocalRef(t.classID);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void AnalyticsFlurry::logTimedEventBegin(const char* eventId)
|
|
||||||
{
|
|
||||||
ProtocolAnalytics::logTimedEventBegin(eventId);
|
|
||||||
}
|
|
||||||
|
|
||||||
void AnalyticsFlurry::logTimedEventBegin(const char* eventId, LogEventParamMap* paramMap)
|
|
||||||
{
|
|
||||||
return_if_fails(eventId != NULL && strlen(eventId) > 0);
|
|
||||||
|
|
||||||
if (paramMap == NULL)
|
|
||||||
{
|
|
||||||
ProtocolAnalytics::logTimedEventBegin(eventId);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
PluginJavaData* pData = PluginUtils::getPluginJavaData(this);
|
|
||||||
PluginJniMethodInfo t;
|
|
||||||
if (PluginJniHelper::getMethodInfo(t
|
|
||||||
, pData->jclassName.c_str()
|
|
||||||
, "logTimedEventBegin"
|
|
||||||
, "(Ljava/lang/String;Ljava/util/Hashtable;)V"))
|
|
||||||
{
|
|
||||||
jstring jeventId = t.env->NewStringUTF(eventId);
|
|
||||||
jobject jparamMap= PluginUtils::createJavaMapObject(t, paramMap);
|
|
||||||
t.env->CallVoidMethod(pData->jobj, t.methodID, jeventId, jparamMap);
|
|
||||||
t.env->DeleteLocalRef(jeventId);
|
|
||||||
t.env->DeleteLocalRef(jparamMap);
|
|
||||||
t.env->DeleteLocalRef(t.classID);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/** override methods of base class */
|
|
||||||
/** Start a new session. */
|
|
||||||
void AnalyticsFlurry::startSession(const char* appKey)
|
|
||||||
{
|
|
||||||
ProtocolAnalytics::startSession(appKey);
|
|
||||||
}
|
|
||||||
|
|
||||||
/** Stop a session. */
|
|
||||||
void AnalyticsFlurry::stopSession()
|
|
||||||
{
|
|
||||||
ProtocolAnalytics::stopSession();
|
|
||||||
}
|
|
||||||
|
|
||||||
/** Set the timeout for expiring a session. */
|
|
||||||
void AnalyticsFlurry::setSessionContinueMillis(long millis)
|
|
||||||
{
|
|
||||||
ProtocolAnalytics::setSessionContinueMillis(millis);
|
|
||||||
}
|
|
||||||
|
|
||||||
/** Whether to catch uncaught exceptions to server.*/
|
|
||||||
void AnalyticsFlurry::setCaptureUncaughtException(bool enabled)
|
|
||||||
{
|
|
||||||
ProtocolAnalytics::setCaptureUncaughtException(enabled);
|
|
||||||
}
|
|
||||||
|
|
||||||
const char* AnalyticsFlurry::getSDKVersion()
|
|
||||||
{
|
|
||||||
return ProtocolAnalytics::getSDKVersion();
|
|
||||||
}
|
|
||||||
|
|
||||||
/** Set whether needs to output logs to console.*/
|
|
||||||
void AnalyticsFlurry::setDebugMode(bool debug)
|
|
||||||
{
|
|
||||||
ProtocolAnalytics::setDebugMode(debug);
|
|
||||||
}
|
|
||||||
|
|
||||||
/** log an error */
|
|
||||||
void AnalyticsFlurry::logError(const char* errorId, const char* message)
|
|
||||||
{
|
|
||||||
ProtocolAnalytics::logError(errorId, message);
|
|
||||||
}
|
|
||||||
|
|
||||||
/** log an event. */
|
|
||||||
void AnalyticsFlurry::logEvent(const char* eventId, LogEventParamMap* paramMap)
|
|
||||||
{
|
|
||||||
ProtocolAnalytics::logEvent(eventId, paramMap);
|
|
||||||
}
|
|
||||||
|
|
||||||
/** end a timed event */
|
|
||||||
void AnalyticsFlurry::logTimedEventEnd(const char* eventId)
|
|
||||||
{
|
|
||||||
ProtocolAnalytics::logTimedEventEnd(eventId);
|
|
||||||
}
|
|
||||||
|
|
||||||
void AnalyticsFlurry::logTimedEventEnd(const char* eventId, LogEventParamMap* paramMap)
|
|
||||||
{
|
|
||||||
ProtocolAnalytics::logTimedEventEnd(eventId);
|
|
||||||
}
|
|
||||||
|
|
||||||
}} // namespace cocos2d { namespace plugin {
|
|
|
@ -1,221 +0,0 @@
|
||||||
/****************************************************************************
|
|
||||||
Copyright (c) 2012-2013 cocos2d-x.org
|
|
||||||
|
|
||||||
http://www.cocos2d-x.org
|
|
||||||
|
|
||||||
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.
|
|
||||||
****************************************************************************/
|
|
||||||
#include "AnalyticsFlurry.h"
|
|
||||||
#include "Flurry.h"
|
|
||||||
#include "PluginUtilsIOS.h"
|
|
||||||
|
|
||||||
namespace cocos2d { namespace plugin {
|
|
||||||
|
|
||||||
PLUGIN_REGISTER_IMPL(AnalyticsFlurry)
|
|
||||||
|
|
||||||
#define LOG_MAX_LENGTH (16 * 1024)
|
|
||||||
|
|
||||||
static bool s_bDebugable = false;
|
|
||||||
void FlurryLogD(const char * pszFormat, ...)
|
|
||||||
{
|
|
||||||
if (s_bDebugable) {
|
|
||||||
printf("AnalyticsFlurry : ");
|
|
||||||
char szBuf[LOG_MAX_LENGTH];
|
|
||||||
|
|
||||||
va_list ap;
|
|
||||||
va_start(ap, pszFormat);
|
|
||||||
vsnprintf(szBuf, LOG_MAX_LENGTH, pszFormat, ap);
|
|
||||||
va_end(ap);
|
|
||||||
printf("%s", szBuf);
|
|
||||||
printf("\n");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
AnalyticsFlurry::~AnalyticsFlurry()
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
bool AnalyticsFlurry::init()
|
|
||||||
{
|
|
||||||
return PluginUtilsIOS::initOCPlugin(this, "FlurryWrapper");
|
|
||||||
}
|
|
||||||
|
|
||||||
/** override methods of base class */
|
|
||||||
/** Start a new session. */
|
|
||||||
void AnalyticsFlurry::startSession(const char* appKey)
|
|
||||||
{
|
|
||||||
ProtocolAnalytics::startSession(appKey);
|
|
||||||
}
|
|
||||||
|
|
||||||
/** Stop a session.
|
|
||||||
only worked on android
|
|
||||||
*/
|
|
||||||
void AnalyticsFlurry::stopSession()
|
|
||||||
{
|
|
||||||
ProtocolAnalytics::stopSession();
|
|
||||||
}
|
|
||||||
|
|
||||||
/** Set whether needs to output logs to console.*/
|
|
||||||
void AnalyticsFlurry::setDebugMode(bool debug)
|
|
||||||
{
|
|
||||||
s_bDebugable = debug;
|
|
||||||
ProtocolAnalytics::setDebugMode(debug);
|
|
||||||
}
|
|
||||||
|
|
||||||
/** Set the timeout for expiring a session. */
|
|
||||||
void AnalyticsFlurry::setSessionContinueMillis(long millis)
|
|
||||||
{
|
|
||||||
ProtocolAnalytics::setSessionContinueMillis(millis);
|
|
||||||
}
|
|
||||||
|
|
||||||
/** log an error */
|
|
||||||
void AnalyticsFlurry::logError(const char* errorId, const char* message)
|
|
||||||
{
|
|
||||||
ProtocolAnalytics::logError(errorId, message);
|
|
||||||
}
|
|
||||||
|
|
||||||
/** log an event. */
|
|
||||||
void AnalyticsFlurry::logEvent(const char* eventId, LogEventParamMap* paramMap)
|
|
||||||
{
|
|
||||||
ProtocolAnalytics::logEvent(eventId, paramMap);
|
|
||||||
}
|
|
||||||
|
|
||||||
void AnalyticsFlurry::logTimedEventBegin(const char* eventId)
|
|
||||||
{
|
|
||||||
ProtocolAnalytics::logTimedEventBegin(eventId);
|
|
||||||
}
|
|
||||||
|
|
||||||
/** end a timed event */
|
|
||||||
void AnalyticsFlurry::logTimedEventEnd(const char* eventId)
|
|
||||||
{
|
|
||||||
ProtocolAnalytics::logTimedEventEnd(eventId);
|
|
||||||
}
|
|
||||||
|
|
||||||
/** Whether to catch uncaught exceptions to server.
|
|
||||||
only worked on android
|
|
||||||
*/
|
|
||||||
void AnalyticsFlurry::setCaptureUncaughtException(bool enabled)
|
|
||||||
{
|
|
||||||
ProtocolAnalytics::setCaptureUncaughtException(enabled);
|
|
||||||
}
|
|
||||||
|
|
||||||
const char* AnalyticsFlurry::getSDKVersion()
|
|
||||||
{
|
|
||||||
return ProtocolAnalytics::getSDKVersion();
|
|
||||||
}
|
|
||||||
|
|
||||||
void AnalyticsFlurry::setAge(int age)
|
|
||||||
{
|
|
||||||
NSNumber* numAge = [NSNumber numberWithInt:age];
|
|
||||||
PluginUtilsIOS::callOCFunctionWithName_Object(this, "setAge:", numAge);
|
|
||||||
}
|
|
||||||
|
|
||||||
void AnalyticsFlurry::setGender(Gender gender)
|
|
||||||
{
|
|
||||||
NSString* ret = @"m";
|
|
||||||
if (gender == FEMALE) {
|
|
||||||
ret = @"f";
|
|
||||||
}
|
|
||||||
PluginUtilsIOS::callOCFunctionWithName_Object(this, "setGender:", ret);
|
|
||||||
}
|
|
||||||
|
|
||||||
void AnalyticsFlurry::setUserId(const char* userId)
|
|
||||||
{
|
|
||||||
if (NULL == userId || strlen(userId) == 0) {
|
|
||||||
FlurryLogD("userId is invalid");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
NSString* pUserID = [NSString stringWithUTF8String:userId];
|
|
||||||
PluginUtilsIOS::callOCFunctionWithName_Object(this, "setUserId:", pUserID);
|
|
||||||
}
|
|
||||||
|
|
||||||
void AnalyticsFlurry::logPageView()
|
|
||||||
{
|
|
||||||
PluginUtilsIOS::callOCFunctionWithName(this, "logPageView");
|
|
||||||
}
|
|
||||||
|
|
||||||
void AnalyticsFlurry::setVersionName(const char* versionName)
|
|
||||||
{
|
|
||||||
NSString* pVer = [NSString stringWithUTF8String:versionName];
|
|
||||||
PluginUtilsIOS::callOCFunctionWithName_Object(this, "setVersionName:", pVer);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
@warning only worked on android
|
|
||||||
*/
|
|
||||||
void AnalyticsFlurry::setUseHttps(bool useHttps)
|
|
||||||
{
|
|
||||||
FlurryLogD("setUseHttps in flurry not available on iOS");
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
@warning only worked on android
|
|
||||||
*/
|
|
||||||
void AnalyticsFlurry::setReportLocation(bool enabled)
|
|
||||||
{
|
|
||||||
FlurryLogD("setReportLocation in flurry not available on iOS");
|
|
||||||
}
|
|
||||||
|
|
||||||
void AnalyticsFlurry::logTimedEventBegin(const char* eventId, LogEventParamMap* paramMap)
|
|
||||||
{
|
|
||||||
if (NULL == eventId || strlen(eventId) == 0) {
|
|
||||||
FlurryLogD("eventId is invalid!");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
NSString* pId = [NSString stringWithUTF8String:eventId];
|
|
||||||
if (NULL == paramMap) {
|
|
||||||
this->logTimedEventBegin(eventId);
|
|
||||||
} else {
|
|
||||||
NSMutableDictionary* dict = PluginUtilsIOS::createDictFromMap(paramMap);
|
|
||||||
PluginOCData* pData = PluginUtilsIOS::getPluginOCData(this);
|
|
||||||
if (pData) {
|
|
||||||
id pOCObj = pData->obj;
|
|
||||||
SEL selector = NSSelectorFromString(@"logTimedEventBegin:withParam:");
|
|
||||||
if ([pOCObj respondsToSelector:selector]) {
|
|
||||||
[pOCObj performSelector:selector withObject:pId withObject:dict];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void AnalyticsFlurry::logTimedEventEnd(const char* eventId, LogEventParamMap* paramMap)
|
|
||||||
{
|
|
||||||
if (NULL == eventId || strlen(eventId) == 0) {
|
|
||||||
FlurryLogD("eventId is invalid!");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
NSString* pId = [NSString stringWithUTF8String:eventId];
|
|
||||||
if (NULL == paramMap) {
|
|
||||||
this->logTimedEventEnd(eventId);
|
|
||||||
} else {
|
|
||||||
NSMutableDictionary* dict = PluginUtilsIOS::createDictFromMap(paramMap);
|
|
||||||
PluginOCData* pData = PluginUtilsIOS::getPluginOCData(this);
|
|
||||||
if (pData) {
|
|
||||||
id pOCObj = pData->obj;
|
|
||||||
SEL selector = NSSelectorFromString(@"logTimedEventEnd:withParam:");
|
|
||||||
if ([pOCObj respondsToSelector:selector]) {
|
|
||||||
[pOCObj performSelector:selector withObject:pId withObject:dict];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
}} // namespace cocos2d { namespace plugin {
|
|
|
@ -1,129 +0,0 @@
|
||||||
/****************************************************************************
|
|
||||||
Copyright (c) 2012-2013 cocos2d-x.org
|
|
||||||
|
|
||||||
http://www.cocos2d-x.org
|
|
||||||
|
|
||||||
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.
|
|
||||||
****************************************************************************/
|
|
||||||
#import "FlurryWrapper.h"
|
|
||||||
#import "Flurry.h"
|
|
||||||
|
|
||||||
@implementation FlurryWrapper
|
|
||||||
|
|
||||||
- (void) startSession: (NSString*) appKey
|
|
||||||
{
|
|
||||||
[Flurry startSession:appKey];
|
|
||||||
}
|
|
||||||
|
|
||||||
- (void) stopSession
|
|
||||||
{
|
|
||||||
NSLog(@"stopSession in flurry not available on iOS");
|
|
||||||
}
|
|
||||||
|
|
||||||
- (void) setSessionContinueMillis: (NSNumber*) millis
|
|
||||||
{
|
|
||||||
long lMillis = [millis longValue];
|
|
||||||
int seconds = (int)(lMillis / 1000);
|
|
||||||
[Flurry setSessionContinueSeconds:seconds];
|
|
||||||
}
|
|
||||||
|
|
||||||
- (void) setCaptureUncaughtException: (NSNumber*) isEnabled
|
|
||||||
{
|
|
||||||
NSLog(@"setCaptureUncaughtException in flurry not available on iOS");
|
|
||||||
}
|
|
||||||
|
|
||||||
- (void) setDebugMode: (NSNumber*) isDebugMode
|
|
||||||
{
|
|
||||||
BOOL bDebug = [isDebugMode boolValue];
|
|
||||||
[Flurry setDebugLogEnabled:bDebug];
|
|
||||||
}
|
|
||||||
|
|
||||||
- (void) logError: (NSString*) errorId withMsg:(NSString*) message
|
|
||||||
{
|
|
||||||
NSString* msg = nil;
|
|
||||||
if (nil == message) {
|
|
||||||
msg = @"";
|
|
||||||
} else {
|
|
||||||
msg = message;
|
|
||||||
}
|
|
||||||
[Flurry logError:errorId message:msg exception:nil];
|
|
||||||
}
|
|
||||||
|
|
||||||
- (void) logEvent: (NSString*) eventId
|
|
||||||
{
|
|
||||||
[Flurry logEvent:eventId];
|
|
||||||
}
|
|
||||||
|
|
||||||
- (void) logEvent: (NSString*) eventId withParam:(NSMutableDictionary*) paramMap
|
|
||||||
{
|
|
||||||
[Flurry logEvent:eventId withParameters:paramMap];
|
|
||||||
}
|
|
||||||
|
|
||||||
- (void) logTimedEventBegin: (NSString*) eventId
|
|
||||||
{
|
|
||||||
[Flurry logEvent:eventId timed:YES];
|
|
||||||
}
|
|
||||||
|
|
||||||
- (void) logTimedEventEnd: (NSString*) eventId
|
|
||||||
{
|
|
||||||
[Flurry endTimedEvent:eventId withParameters:nil];
|
|
||||||
}
|
|
||||||
|
|
||||||
- (NSString*) getSDKVersion
|
|
||||||
{
|
|
||||||
return [Flurry getFlurryAgentVersion];
|
|
||||||
}
|
|
||||||
|
|
||||||
- (void) setAge: (NSNumber*) age
|
|
||||||
{
|
|
||||||
int nAge = [age integerValue];
|
|
||||||
[Flurry setAge:nAge];
|
|
||||||
}
|
|
||||||
|
|
||||||
- (void) setGender: (NSString*) gender
|
|
||||||
{
|
|
||||||
[Flurry setGender:gender];
|
|
||||||
}
|
|
||||||
|
|
||||||
- (void) setUserId: (NSString*) userId
|
|
||||||
{
|
|
||||||
[Flurry setUserID:userId];
|
|
||||||
}
|
|
||||||
|
|
||||||
- (void) logPageView
|
|
||||||
{
|
|
||||||
[Flurry logPageView];
|
|
||||||
}
|
|
||||||
|
|
||||||
- (void) setVersionName: (NSString*) versionName
|
|
||||||
{
|
|
||||||
[Flurry setAppVersion:versionName];
|
|
||||||
}
|
|
||||||
|
|
||||||
- (void) logTimedEventBegin: (NSString*) eventId withParam:(NSMutableDictionary*) paramMap
|
|
||||||
{
|
|
||||||
[Flurry logEvent:eventId withParameters:paramMap timed:YES];
|
|
||||||
}
|
|
||||||
|
|
||||||
- (void) logTimedEventEnd: (NSString*) eventId withParam:(NSMutableDictionary*) paramMap
|
|
||||||
{
|
|
||||||
[Flurry endTimedEvent:eventId withParameters:paramMap];
|
|
||||||
}
|
|
||||||
|
|
||||||
@end
|
|
|
@ -30,16 +30,4 @@
|
||||||
<nature>com.android.ide.eclipse.adt.AndroidNature</nature>
|
<nature>com.android.ide.eclipse.adt.AndroidNature</nature>
|
||||||
<nature>org.eclipse.jdt.core.javanature</nature>
|
<nature>org.eclipse.jdt.core.javanature</nature>
|
||||||
</natures>
|
</natures>
|
||||||
<linkedResources>
|
|
||||||
<link>
|
|
||||||
<name>android</name>
|
|
||||||
<type>2</type>
|
|
||||||
<locationURI>PARENT-1-PROJECT_LOC/platform/android</locationURI>
|
|
||||||
</link>
|
|
||||||
<link>
|
|
||||||
<name>include</name>
|
|
||||||
<type>2</type>
|
|
||||||
<locationURI>PARENT-1-PROJECT_LOC/include</locationURI>
|
|
||||||
</link>
|
|
||||||
</linkedResources>
|
|
||||||
</projectDescription>
|
</projectDescription>
|
||||||
|
|
|
@ -1,20 +0,0 @@
|
||||||
# set params
|
|
||||||
PLUGIN_ANDROID_ROOT=$(cd "$(dirname "$0")"; pwd)
|
|
||||||
|
|
||||||
if [ ! "${PLUGIN_ROOT}" ]; then
|
|
||||||
PLUGIN_ROOT="$PLUGIN_ANDROID_ROOT"/../..
|
|
||||||
fi
|
|
||||||
|
|
||||||
# build
|
|
||||||
"$ANDROID_NDK_ROOT"/ndk-build -C "$PLUGIN_ANDROID_ROOT" \
|
|
||||||
NDK_MODULE_PATH="$PLUGIN_ROOT"
|
|
||||||
|
|
||||||
echo
|
|
||||||
if [ "0" != "$?" ]; then
|
|
||||||
echo "Build error occoured!!!"
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
echo
|
|
||||||
echo "Native build action success."
|
|
||||||
exit 0
|
|
|
@ -1,29 +0,0 @@
|
||||||
LOCAL_PATH := $(call my-dir)
|
|
||||||
|
|
||||||
include $(CLEAR_VARS)
|
|
||||||
|
|
||||||
LOCAL_MODULE := PluginFlurryStatic
|
|
||||||
|
|
||||||
LOCAL_MODULE_FILENAME := libPluginFlurryStatic
|
|
||||||
|
|
||||||
LOCAL_SRC_FILES := \
|
|
||||||
$(addprefix ../../platform/android/, \
|
|
||||||
AnalyticsFlurry.cpp \
|
|
||||||
) \
|
|
||||||
|
|
||||||
LOCAL_CFLAGS :=
|
|
||||||
|
|
||||||
LOCAL_EXPORT_CFLAGS :=
|
|
||||||
|
|
||||||
LOCAL_C_INCLUDES := $(LOCAL_PATH)/../../include
|
|
||||||
|
|
||||||
LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/../../include
|
|
||||||
|
|
||||||
LOCAL_WHOLE_STATIC_LIBRARIES := PluginProtocolStatic
|
|
||||||
|
|
||||||
LOCAL_LDLIBS := -landroid
|
|
||||||
LOCAL_LDLIBS += -llog
|
|
||||||
|
|
||||||
include $(BUILD_STATIC_LIBRARY)
|
|
||||||
|
|
||||||
$(call import-module, protocols/proj.android/jni)
|
|
|
@ -1,7 +0,0 @@
|
||||||
# it is needed for ndk-r5
|
|
||||||
APP_STL := gnustl_static
|
|
||||||
APP_CPPFLAGS += -frtti
|
|
||||||
APP_MODULES := PluginFlurryStatic
|
|
||||||
APP_ABI :=armeabi
|
|
||||||
#APP_ABI :=x86
|
|
||||||
#APP_ABI :=mips mips-r2 mips-r2-sf armeabi
|
|
|
@ -24,6 +24,9 @@ THE SOFTWARE.
|
||||||
package org.cocos2dx.plugin;
|
package org.cocos2dx.plugin;
|
||||||
|
|
||||||
import java.util.Hashtable;
|
import java.util.Hashtable;
|
||||||
|
import java.util.Iterator;
|
||||||
|
|
||||||
|
import org.json.JSONObject;
|
||||||
|
|
||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
import android.util.Log;
|
import android.util.Log;
|
||||||
|
@ -32,170 +35,191 @@ import com.flurry.android.FlurryAgent;
|
||||||
|
|
||||||
public class AnalyticsFlurry implements InterfaceAnalytics {
|
public class AnalyticsFlurry implements InterfaceAnalytics {
|
||||||
|
|
||||||
private Context mContext = null;
|
private Context mContext = null;
|
||||||
protected static String TAG = "AnalyticsFlurry";
|
protected static String TAG = "AnalyticsFlurry";
|
||||||
|
|
||||||
protected static void LogE(String msg, Exception e) {
|
|
||||||
Log.e(TAG, msg, e);
|
|
||||||
e.printStackTrace();
|
|
||||||
}
|
|
||||||
|
|
||||||
private static boolean isDebug = false;
|
protected static void LogE(String msg, Exception e) {
|
||||||
protected static void LogD(String msg) {
|
Log.e(TAG, msg, e);
|
||||||
if (isDebug) {
|
e.printStackTrace();
|
||||||
Log.d(TAG, msg);
|
}
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public AnalyticsFlurry(Context context) {
|
private static boolean isDebug = false;
|
||||||
mContext = context;
|
protected static void LogD(String msg) {
|
||||||
}
|
if (isDebug) {
|
||||||
|
Log.d(TAG, msg);
|
||||||
@Override
|
}
|
||||||
public void startSession(String appKey) {
|
}
|
||||||
LogD("startSession invoked!");
|
|
||||||
FlurryAgent.onStartSession(mContext, appKey);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
public AnalyticsFlurry(Context context) {
|
||||||
public void stopSession() {
|
mContext = context;
|
||||||
LogD("stopSession invoked!");
|
}
|
||||||
FlurryAgent.onEndSession(mContext);
|
|
||||||
}
|
@Override
|
||||||
|
public void startSession(String appKey) {
|
||||||
|
LogD("startSession invoked!");
|
||||||
|
FlurryAgent.onStartSession(mContext, appKey);
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void setSessionContinueMillis(int millis) {
|
public void stopSession() {
|
||||||
LogD("setSessionContinueMillis invoked!");
|
LogD("stopSession invoked!");
|
||||||
FlurryAgent.setContinueSessionMillis(millis);
|
FlurryAgent.onEndSession(mContext);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void setCaptureUncaughtException(boolean isEnabled) {
|
public void setSessionContinueMillis(int millis) {
|
||||||
LogD("setCaptureUncaughtException invoked!");
|
LogD("setSessionContinueMillis invoked!");
|
||||||
FlurryAgent.setCaptureUncaughtExceptions(isEnabled);
|
FlurryAgent.setContinueSessionMillis(millis);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void setDebugMode(boolean isDebugMode) {
|
public void setCaptureUncaughtException(boolean isEnabled) {
|
||||||
isDebug = isDebugMode;
|
LogD("setCaptureUncaughtException invoked!");
|
||||||
FlurryAgent.setLogEnabled(isDebug);
|
FlurryAgent.setCaptureUncaughtExceptions(isEnabled);
|
||||||
if (isDebugMode) {
|
}
|
||||||
FlurryAgent.setLogLevel(Log.DEBUG);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void logError(String errorId, String message) {
|
public void setDebugMode(boolean isDebugMode) {
|
||||||
LogD("logError invoked!");
|
isDebug = isDebugMode;
|
||||||
FlurryAgent.onError(errorId, message, "");
|
FlurryAgent.setLogEnabled(isDebug);
|
||||||
}
|
if (isDebugMode) {
|
||||||
|
FlurryAgent.setLogLevel(Log.DEBUG);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void logEvent(String eventId) {
|
public void logError(String errorId, String message) {
|
||||||
LogD("logEvent(eventId) invoked!");
|
LogD("logError invoked!");
|
||||||
FlurryAgent.logEvent(eventId);
|
FlurryAgent.onError(errorId, message, "");
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void logEvent(String eventId, Hashtable<String, String> paramMap) {
|
public void logEvent(String eventId) {
|
||||||
LogD("logEvent(eventId, paramMap) invoked!");
|
LogD("logEvent(eventId) invoked!");
|
||||||
FlurryAgent.logEvent(eventId, paramMap);
|
FlurryAgent.logEvent(eventId);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void logTimedEventBegin(String eventId) {
|
public void logEvent(String eventId, Hashtable<String, String> paramMap) {
|
||||||
LogD("logTimedEventBegin invoked!");
|
LogD("logEvent(eventId, paramMap) invoked!");
|
||||||
FlurryAgent.logEvent(eventId, true);
|
FlurryAgent.logEvent(eventId, paramMap);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void logTimedEventEnd(String eventId) {
|
public void logTimedEventBegin(String eventId) {
|
||||||
LogD("logTimedEventEnd invoked!");
|
LogD("logTimedEventBegin invoked!");
|
||||||
FlurryAgent.endTimedEvent(eventId);
|
FlurryAgent.logEvent(eventId, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String getSDKVersion() {
|
public void logTimedEventEnd(String eventId) {
|
||||||
LogD("getSDKVersion invoked!");
|
LogD("logTimedEventEnd invoked!");
|
||||||
String ret = "";
|
FlurryAgent.endTimedEvent(eventId);
|
||||||
try {
|
}
|
||||||
int nRet = FlurryAgent.getAgentVersion();
|
|
||||||
ret = "Flurry android ver " + nRet;
|
|
||||||
} catch(Exception e){
|
|
||||||
LogE("Exception in getSDKVersion", e);
|
|
||||||
}
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
protected void logTimedEventBegin(String eventId, Hashtable<String, String> paramMap) {
|
@Override
|
||||||
LogD("logTimedEventBegin invoked!");
|
public String getSDKVersion() {
|
||||||
try{
|
LogD("getSDKVersion invoked!");
|
||||||
FlurryAgent.logEvent(eventId, paramMap, true);
|
String ret = "";
|
||||||
} catch(Exception e){
|
try {
|
||||||
LogE("Exception in logTimedEventBegin", e);
|
int nRet = FlurryAgent.getAgentVersion();
|
||||||
}
|
ret = "Flurry android ver " + nRet;
|
||||||
}
|
} catch(Exception e){
|
||||||
|
LogE("Exception in getSDKVersion", e);
|
||||||
protected void setReportLocation(boolean enabled) {
|
}
|
||||||
LogD("setReportLocation invoked!");
|
return ret;
|
||||||
try{
|
}
|
||||||
FlurryAgent.setReportLocation(enabled);
|
|
||||||
} catch(Exception e){
|
|
||||||
LogE("Exception in setReportLocation", e);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
protected void logPageView() {
|
|
||||||
LogD("logPageView invoked!");
|
|
||||||
try{
|
|
||||||
FlurryAgent.onPageView();
|
|
||||||
} catch(Exception e){
|
|
||||||
LogE("Exception in logPageView", e);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
protected void setVersionName(String versionName) {
|
protected void logTimedEventBeginWithParams(JSONObject eventInfo) {
|
||||||
LogD("setVersionName invoked!");
|
LogD("logTimedEventBegin invoked!");
|
||||||
try {
|
try{
|
||||||
FlurryAgent.setVersionName(versionName);
|
String eventId = eventInfo.getString("Param1");
|
||||||
} catch(Exception e){
|
|
||||||
LogE("Exception in setVersionName", e);
|
if (eventInfo.has("Param2"))
|
||||||
}
|
{
|
||||||
}
|
JSONObject params = eventInfo.getJSONObject("Param2");
|
||||||
|
@SuppressWarnings("rawtypes")
|
||||||
protected void setAge(int age) {
|
Iterator it = params.keys();
|
||||||
LogD("setAge invoked!");
|
Hashtable<String, String> paramMap = new Hashtable<String, String>();
|
||||||
try {
|
while (it.hasNext()) {
|
||||||
FlurryAgent.setAge(age);
|
String key = (String) it.next();
|
||||||
} catch(Exception e){
|
String value = params.getString(key);
|
||||||
LogE("Exception in setAge", e);
|
paramMap.put(key, value);
|
||||||
}
|
}
|
||||||
}
|
FlurryAgent.logEvent(eventId, paramMap, true);
|
||||||
|
} else {
|
||||||
protected void setGender(byte gender) {
|
FlurryAgent.logEvent(eventId, true);
|
||||||
LogD("setGender invoked!");
|
}
|
||||||
try {
|
} catch(Exception e){
|
||||||
FlurryAgent.setGender(gender);
|
LogE("Exception in logTimedEventBegin", e);
|
||||||
} catch(Exception e){
|
}
|
||||||
LogE("Exception in setGender", e);
|
}
|
||||||
}
|
|
||||||
}
|
protected void setReportLocation(boolean enabled) {
|
||||||
|
LogD("setReportLocation invoked!");
|
||||||
protected void setUserId(String userId) {
|
try{
|
||||||
LogD("setUserId invoked!");
|
FlurryAgent.setReportLocation(enabled);
|
||||||
try {
|
} catch(Exception e){
|
||||||
FlurryAgent.setUserId(userId);
|
LogE("Exception in setReportLocation", e);
|
||||||
} catch(Exception e){
|
}
|
||||||
LogE("Exception in setUserId", e);
|
}
|
||||||
}
|
|
||||||
}
|
protected void logPageView() {
|
||||||
|
LogD("logPageView invoked!");
|
||||||
protected void setUseHttps(boolean useHttps) {
|
try{
|
||||||
LogD("setUseHttps invoked!");
|
FlurryAgent.onPageView();
|
||||||
try {
|
} catch(Exception e){
|
||||||
FlurryAgent.setUseHttps(useHttps);
|
LogE("Exception in logPageView", e);
|
||||||
} catch(Exception e){
|
}
|
||||||
LogE("Exception in setUseHttps", e);
|
}
|
||||||
}
|
|
||||||
}
|
protected void setVersionName(String versionName) {
|
||||||
|
LogD("setVersionName invoked!");
|
||||||
|
try {
|
||||||
|
FlurryAgent.setVersionName(versionName);
|
||||||
|
} catch(Exception e){
|
||||||
|
LogE("Exception in setVersionName", e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
protected void setAge(int age) {
|
||||||
|
LogD("setAge invoked!");
|
||||||
|
try {
|
||||||
|
FlurryAgent.setAge(age);
|
||||||
|
} catch(Exception e){
|
||||||
|
LogE("Exception in setAge", e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
protected void setGender(byte gender) {
|
||||||
|
LogD("setGender invoked!");
|
||||||
|
try {
|
||||||
|
FlurryAgent.setGender(gender);
|
||||||
|
} catch(Exception e){
|
||||||
|
LogE("Exception in setGender", e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
protected void setUserId(String userId) {
|
||||||
|
LogD("setUserId invoked!");
|
||||||
|
try {
|
||||||
|
FlurryAgent.setUserId(userId);
|
||||||
|
} catch(Exception e){
|
||||||
|
LogE("Exception in setUserId", e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
protected void setUseHttps(boolean useHttps) {
|
||||||
|
LogD("setUseHttps invoked!");
|
||||||
|
try {
|
||||||
|
FlurryAgent.setUseHttps(useHttps);
|
||||||
|
} catch(Exception e){
|
||||||
|
LogE("Exception in setUseHttps", e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getPluginVersion() {
|
||||||
|
return "0.2.0";
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -23,25 +23,28 @@ THE SOFTWARE.
|
||||||
****************************************************************************/
|
****************************************************************************/
|
||||||
#import "InterfaceAnalytics.h"
|
#import "InterfaceAnalytics.h"
|
||||||
|
|
||||||
@interface FlurryWrapper : NSObject <InterfaceAnalytics>
|
@interface AnalyticsFlurry : NSObject <InterfaceAnalytics>
|
||||||
{
|
{
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@property BOOL debug;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
interfaces of protocol : InterfaceAnalytics
|
interfaces of protocol : InterfaceAnalytics
|
||||||
*/
|
*/
|
||||||
- (void) startSession: (NSString*) appKey;
|
- (void) startSession: (NSString*) appKey;
|
||||||
- (void) stopSession;
|
- (void) stopSession;
|
||||||
- (void) setSessionContinueMillis: (NSNumber*) millis;
|
- (void) setSessionContinueMillis: (long) millis;
|
||||||
- (void) setCaptureUncaughtException: (NSNumber*) isEnabled;
|
- (void) setCaptureUncaughtException: (BOOL) isEnabled;
|
||||||
- (void) setDebugMode: (NSNumber*) isDebugMode;
|
- (void) setDebugMode: (BOOL) isDebugMode;
|
||||||
- (void) logError: (NSString*) errorId withMsg:(NSString*) message;
|
- (void) logError: (NSString*) errorId withMsg:(NSString*) message;
|
||||||
- (void) logEvent: (NSString*) eventId;
|
- (void) logEvent: (NSString*) eventId;
|
||||||
- (void) logEvent: (NSString*) eventId withParam:(NSMutableDictionary*) paramMap;
|
- (void) logEvent: (NSString*) eventId withParam:(NSMutableDictionary*) paramMap;
|
||||||
- (void) logTimedEventBegin: (NSString*) eventId;
|
- (void) logTimedEventBegin: (NSString*) eventId;
|
||||||
- (void) logTimedEventEnd: (NSString*) eventId;
|
- (void) logTimedEventEnd: (NSString*) eventId;
|
||||||
- (NSString*) getSDKVersion;
|
- (NSString*) getSDKVersion;
|
||||||
|
- (NSString*) getPluginVersion;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
interfaces of flurry SDK
|
interfaces of flurry SDK
|
||||||
|
@ -49,9 +52,10 @@ THE SOFTWARE.
|
||||||
- (void) setAge: (NSNumber*) age;
|
- (void) setAge: (NSNumber*) age;
|
||||||
- (void) setGender: (NSString*) gender;
|
- (void) setGender: (NSString*) gender;
|
||||||
- (void) setUserId: (NSString*) userId;
|
- (void) setUserId: (NSString*) userId;
|
||||||
|
- (void) setUseHttps: (NSNumber*) enabled;
|
||||||
- (void) logPageView;
|
- (void) logPageView;
|
||||||
- (void) setVersionName: (NSString*) versionName;
|
- (void) setVersionName: (NSString*) versionName;
|
||||||
- (void) logTimedEventBegin: (NSString*) eventId withParam:(NSMutableDictionary*) paramMap;
|
- (void) logTimedEventBeginWithParams: (NSMutableDictionary*) params;
|
||||||
- (void) logTimedEventEnd: (NSString*) eventId withParam:(NSMutableDictionary*) paramMap;
|
- (void) logTimedEventEndWithParams: (NSMutableDictionary*) params;
|
||||||
|
|
||||||
@end
|
@end
|
|
@ -0,0 +1,166 @@
|
||||||
|
/****************************************************************************
|
||||||
|
Copyright (c) 2012-2013 cocos2d-x.org
|
||||||
|
|
||||||
|
http://www.cocos2d-x.org
|
||||||
|
|
||||||
|
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.
|
||||||
|
****************************************************************************/
|
||||||
|
#import "AnalyticsFlurry.h"
|
||||||
|
#import "Flurry.h"
|
||||||
|
|
||||||
|
#define OUTPUT_LOG(...) if (self.debug) NSLog(__VA_ARGS__);
|
||||||
|
|
||||||
|
@implementation AnalyticsFlurry
|
||||||
|
|
||||||
|
@synthesize debug = __debug;
|
||||||
|
|
||||||
|
- (void) startSession: (NSString*) appKey
|
||||||
|
{
|
||||||
|
[Flurry startSession:appKey];
|
||||||
|
}
|
||||||
|
|
||||||
|
- (void) stopSession
|
||||||
|
{
|
||||||
|
OUTPUT_LOG(@"Flurry stopSession in flurry not available on iOS");
|
||||||
|
}
|
||||||
|
|
||||||
|
- (void) setSessionContinueMillis: (long) millis
|
||||||
|
{
|
||||||
|
OUTPUT_LOG(@"Flurry setSessionContinueMillis invoked(%ld)", millis);
|
||||||
|
int seconds = (int)(millis / 1000);
|
||||||
|
[Flurry setSessionContinueSeconds:seconds];
|
||||||
|
}
|
||||||
|
|
||||||
|
- (void) setCaptureUncaughtException: (BOOL) isEnabled
|
||||||
|
{
|
||||||
|
OUTPUT_LOG(@"Flurry setCaptureUncaughtException in flurry not available on iOS");
|
||||||
|
}
|
||||||
|
|
||||||
|
- (void) setDebugMode: (BOOL) isDebugMode
|
||||||
|
{
|
||||||
|
OUTPUT_LOG(@"Flurry setDebugMode invoked(%d)", isDebugMode);
|
||||||
|
self.debug = isDebugMode;
|
||||||
|
[Flurry setDebugLogEnabled:isDebugMode];
|
||||||
|
}
|
||||||
|
|
||||||
|
- (void) logError: (NSString*) errorId withMsg:(NSString*) message
|
||||||
|
{
|
||||||
|
OUTPUT_LOG(@"Flurry logError invoked(%@, %@)", errorId, message);
|
||||||
|
NSString* msg = nil;
|
||||||
|
if (nil == message) {
|
||||||
|
msg = @"";
|
||||||
|
} else {
|
||||||
|
msg = message;
|
||||||
|
}
|
||||||
|
[Flurry logError:errorId message:msg exception:nil];
|
||||||
|
}
|
||||||
|
|
||||||
|
- (void) logEvent: (NSString*) eventId
|
||||||
|
{
|
||||||
|
OUTPUT_LOG(@"Flurry logEvent invoked(%@)", eventId);
|
||||||
|
[Flurry logEvent:eventId];
|
||||||
|
}
|
||||||
|
|
||||||
|
- (void) logEvent: (NSString*) eventId withParam:(NSMutableDictionary*) paramMap
|
||||||
|
{
|
||||||
|
OUTPUT_LOG(@"Flurry logEventWithParams invoked (%@, %@)", eventId, [paramMap debugDescription]);
|
||||||
|
[Flurry logEvent:eventId withParameters:paramMap];
|
||||||
|
}
|
||||||
|
|
||||||
|
- (void) logTimedEventBegin: (NSString*) eventId
|
||||||
|
{
|
||||||
|
OUTPUT_LOG(@"Flurry logTimedEventBegin invoked (%@)", eventId);
|
||||||
|
[Flurry logEvent:eventId timed:YES];
|
||||||
|
}
|
||||||
|
|
||||||
|
- (void) logTimedEventEnd: (NSString*) eventId
|
||||||
|
{
|
||||||
|
OUTPUT_LOG(@"Flurry logTimedEventEnd invoked (%@)", eventId);
|
||||||
|
[Flurry endTimedEvent:eventId withParameters:nil];
|
||||||
|
}
|
||||||
|
|
||||||
|
- (NSString*) getSDKVersion
|
||||||
|
{
|
||||||
|
return [Flurry getFlurryAgentVersion];
|
||||||
|
}
|
||||||
|
|
||||||
|
- (NSString*) getPluginVersion
|
||||||
|
{
|
||||||
|
return @"0.2.0";
|
||||||
|
}
|
||||||
|
|
||||||
|
- (void) setAge: (NSNumber*) age
|
||||||
|
{
|
||||||
|
int nAge = [age integerValue];
|
||||||
|
OUTPUT_LOG(@"Flurry setAge invoked (%d)", nAge);
|
||||||
|
[Flurry setAge:nAge];
|
||||||
|
}
|
||||||
|
|
||||||
|
- (void) setGender: (NSString*) gender
|
||||||
|
{
|
||||||
|
OUTPUT_LOG(@"Flurry setGender invoked (%@)", gender);
|
||||||
|
[Flurry setGender:gender];
|
||||||
|
}
|
||||||
|
|
||||||
|
- (void) setUserId: (NSString*) userId
|
||||||
|
{
|
||||||
|
OUTPUT_LOG(@"Flurry setUserId invoked (%@)", userId);
|
||||||
|
[Flurry setUserID:userId];
|
||||||
|
}
|
||||||
|
|
||||||
|
- (void) setUseHttps: (NSNumber*) enabled
|
||||||
|
{
|
||||||
|
BOOL bEnabled = [enabled boolValue];
|
||||||
|
OUTPUT_LOG(@"Flurry setUseHttps invoked (%@)", enabled);
|
||||||
|
[Flurry setSecureTransportEnabled:bEnabled];
|
||||||
|
}
|
||||||
|
|
||||||
|
- (void) logPageView
|
||||||
|
{
|
||||||
|
OUTPUT_LOG(@"Flurry logPageView invoked");
|
||||||
|
[Flurry logPageView];
|
||||||
|
}
|
||||||
|
|
||||||
|
- (void) setVersionName: (NSString*) versionName
|
||||||
|
{
|
||||||
|
OUTPUT_LOG(@"Flurry setVersionName invoked (%@)", versionName);
|
||||||
|
[Flurry setAppVersion:versionName];
|
||||||
|
}
|
||||||
|
|
||||||
|
- (void) logTimedEventBeginWithParams: (NSMutableDictionary*) paramMap
|
||||||
|
{
|
||||||
|
OUTPUT_LOG(@"Flurry logTimedEventBeginWithParams invoked (%@)", [paramMap debugDescription]);
|
||||||
|
NSString* eventId = (NSString*) [paramMap objectForKey:@"Param1"];
|
||||||
|
NSMutableDictionary* params = (NSMutableDictionary*) [paramMap objectForKey:@"Param2"];
|
||||||
|
if (params) {
|
||||||
|
[Flurry logEvent:eventId withParameters:paramMap timed:YES];
|
||||||
|
} else {
|
||||||
|
[Flurry logEvent:eventId timed:YES];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
- (void) logTimedEventEndWithParams: (NSMutableDictionary*) paramMap
|
||||||
|
{
|
||||||
|
OUTPUT_LOG(@"Flurry logTimedEventEndWithParams invoked (%@)", [paramMap debugDescription]);
|
||||||
|
NSString* eventId = (NSString*) [paramMap objectForKey:@"Param1"];
|
||||||
|
NSMutableDictionary* params = (NSMutableDictionary*) [paramMap objectForKey:@"Param2"];
|
||||||
|
[Flurry endTimedEvent:eventId withParameters:params];
|
||||||
|
}
|
||||||
|
|
||||||
|
@end
|
|
@ -8,9 +8,8 @@
|
||||||
|
|
||||||
/* Begin PBXBuildFile section */
|
/* Begin PBXBuildFile section */
|
||||||
FA09A376168AFD41008C1C7B /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = FA09A375168AFD41008C1C7B /* Foundation.framework */; };
|
FA09A376168AFD41008C1C7B /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = FA09A375168AFD41008C1C7B /* Foundation.framework */; };
|
||||||
FA09A394168B00D4008C1C7B /* AnalyticsFlurry.mm in Sources */ = {isa = PBXBuildFile; fileRef = FA09A393168B00D4008C1C7B /* AnalyticsFlurry.mm */; };
|
FAB6DFDD1756F22200C90D89 /* libFlurry.a in Frameworks */ = {isa = PBXBuildFile; fileRef = FAB6DFDB1756F22200C90D89 /* libFlurry.a */; };
|
||||||
FA866509168BE0980073E055 /* libFlurry.a in Frameworks */ = {isa = PBXBuildFile; fileRef = FA866508168BE0980073E055 /* libFlurry.a */; };
|
FAB6DFE01756F29800C90D89 /* AnalyticsFlurry.m in Sources */ = {isa = PBXBuildFile; fileRef = FAB6DFDF1756F29800C90D89 /* AnalyticsFlurry.m */; };
|
||||||
FA8CC2241739EFF200464206 /* FlurryWrapper.m in Sources */ = {isa = PBXBuildFile; fileRef = FA8CC2231739EFF200464206 /* FlurryWrapper.m */; };
|
|
||||||
/* End PBXBuildFile section */
|
/* End PBXBuildFile section */
|
||||||
|
|
||||||
/* Begin PBXCopyFilesBuildPhase section */
|
/* Begin PBXCopyFilesBuildPhase section */
|
||||||
|
@ -28,13 +27,11 @@
|
||||||
/* Begin PBXFileReference section */
|
/* Begin PBXFileReference section */
|
||||||
FA09A372168AFD41008C1C7B /* libPluginFlurry.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libPluginFlurry.a; sourceTree = BUILT_PRODUCTS_DIR; };
|
FA09A372168AFD41008C1C7B /* libPluginFlurry.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libPluginFlurry.a; sourceTree = BUILT_PRODUCTS_DIR; };
|
||||||
FA09A375168AFD41008C1C7B /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = System/Library/Frameworks/Foundation.framework; sourceTree = SDKROOT; };
|
FA09A375168AFD41008C1C7B /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = System/Library/Frameworks/Foundation.framework; sourceTree = SDKROOT; };
|
||||||
FA09A391168AFD79008C1C7B /* AnalyticsFlurry.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AnalyticsFlurry.h; sourceTree = "<group>"; };
|
|
||||||
FA09A393168B00D4008C1C7B /* AnalyticsFlurry.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = AnalyticsFlurry.mm; sourceTree = "<group>"; };
|
|
||||||
FA866507168BE0980073E055 /* Flurry.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Flurry.h; sourceTree = "<group>"; };
|
|
||||||
FA866508168BE0980073E055 /* libFlurry.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; path = libFlurry.a; sourceTree = "<group>"; };
|
|
||||||
FA86650E168BE22D0073E055 /* SystemConfiguration.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = SystemConfiguration.framework; path = System/Library/Frameworks/SystemConfiguration.framework; sourceTree = SDKROOT; };
|
FA86650E168BE22D0073E055 /* SystemConfiguration.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = SystemConfiguration.framework; path = System/Library/Frameworks/SystemConfiguration.framework; sourceTree = SDKROOT; };
|
||||||
FA8CC2221739EFF200464206 /* FlurryWrapper.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FlurryWrapper.h; sourceTree = "<group>"; };
|
FAB6DFD81756F22200C90D89 /* Flurry.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Flurry.h; sourceTree = "<group>"; };
|
||||||
FA8CC2231739EFF200464206 /* FlurryWrapper.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = FlurryWrapper.m; sourceTree = "<group>"; };
|
FAB6DFDB1756F22200C90D89 /* libFlurry.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; path = libFlurry.a; sourceTree = "<group>"; };
|
||||||
|
FAB6DFDE1756F29800C90D89 /* AnalyticsFlurry.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AnalyticsFlurry.h; sourceTree = "<group>"; };
|
||||||
|
FAB6DFDF1756F29800C90D89 /* AnalyticsFlurry.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = AnalyticsFlurry.m; sourceTree = "<group>"; };
|
||||||
/* End PBXFileReference section */
|
/* End PBXFileReference section */
|
||||||
|
|
||||||
/* Begin PBXFrameworksBuildPhase section */
|
/* Begin PBXFrameworksBuildPhase section */
|
||||||
|
@ -43,7 +40,7 @@
|
||||||
buildActionMask = 2147483647;
|
buildActionMask = 2147483647;
|
||||||
files = (
|
files = (
|
||||||
FA09A376168AFD41008C1C7B /* Foundation.framework in Frameworks */,
|
FA09A376168AFD41008C1C7B /* Foundation.framework in Frameworks */,
|
||||||
FA866509168BE0980073E055 /* libFlurry.a in Frameworks */,
|
FAB6DFDD1756F22200C90D89 /* libFlurry.a in Frameworks */,
|
||||||
);
|
);
|
||||||
runOnlyForDeploymentPostprocessing = 0;
|
runOnlyForDeploymentPostprocessing = 0;
|
||||||
};
|
};
|
||||||
|
@ -53,9 +50,11 @@
|
||||||
FA09A367168AFD41008C1C7B = {
|
FA09A367168AFD41008C1C7B = {
|
||||||
isa = PBXGroup;
|
isa = PBXGroup;
|
||||||
children = (
|
children = (
|
||||||
|
FAB6DFDE1756F29800C90D89 /* AnalyticsFlurry.h */,
|
||||||
|
FAB6DFDF1756F29800C90D89 /* AnalyticsFlurry.m */,
|
||||||
|
FAB6DFD81756F22200C90D89 /* Flurry.h */,
|
||||||
|
FAB6DFDB1756F22200C90D89 /* libFlurry.a */,
|
||||||
FA86650E168BE22D0073E055 /* SystemConfiguration.framework */,
|
FA86650E168BE22D0073E055 /* SystemConfiguration.framework */,
|
||||||
FA09A392168AFD96008C1C7B /* ios */,
|
|
||||||
FA09A390168AFD79008C1C7B /* include */,
|
|
||||||
FA09A374168AFD41008C1C7B /* Frameworks */,
|
FA09A374168AFD41008C1C7B /* Frameworks */,
|
||||||
FA09A373168AFD41008C1C7B /* Products */,
|
FA09A373168AFD41008C1C7B /* Products */,
|
||||||
);
|
);
|
||||||
|
@ -77,28 +76,6 @@
|
||||||
name = Frameworks;
|
name = Frameworks;
|
||||||
sourceTree = "<group>";
|
sourceTree = "<group>";
|
||||||
};
|
};
|
||||||
FA09A390168AFD79008C1C7B /* include */ = {
|
|
||||||
isa = PBXGroup;
|
|
||||||
children = (
|
|
||||||
FA09A391168AFD79008C1C7B /* AnalyticsFlurry.h */,
|
|
||||||
);
|
|
||||||
name = include;
|
|
||||||
path = ../include;
|
|
||||||
sourceTree = "<group>";
|
|
||||||
};
|
|
||||||
FA09A392168AFD96008C1C7B /* ios */ = {
|
|
||||||
isa = PBXGroup;
|
|
||||||
children = (
|
|
||||||
FA8CC2221739EFF200464206 /* FlurryWrapper.h */,
|
|
||||||
FA8CC2231739EFF200464206 /* FlurryWrapper.m */,
|
|
||||||
FA866507168BE0980073E055 /* Flurry.h */,
|
|
||||||
FA866508168BE0980073E055 /* libFlurry.a */,
|
|
||||||
FA09A393168B00D4008C1C7B /* AnalyticsFlurry.mm */,
|
|
||||||
);
|
|
||||||
name = ios;
|
|
||||||
path = ../platform/ios;
|
|
||||||
sourceTree = "<group>";
|
|
||||||
};
|
|
||||||
/* End PBXGroup section */
|
/* End PBXGroup section */
|
||||||
|
|
||||||
/* Begin PBXNativeTarget section */
|
/* Begin PBXNativeTarget section */
|
||||||
|
@ -150,8 +127,7 @@
|
||||||
isa = PBXSourcesBuildPhase;
|
isa = PBXSourcesBuildPhase;
|
||||||
buildActionMask = 2147483647;
|
buildActionMask = 2147483647;
|
||||||
files = (
|
files = (
|
||||||
FA09A394168B00D4008C1C7B /* AnalyticsFlurry.mm in Sources */,
|
FAB6DFE01756F29800C90D89 /* AnalyticsFlurry.m in Sources */,
|
||||||
FA8CC2241739EFF200464206 /* FlurryWrapper.m in Sources */,
|
|
||||||
);
|
);
|
||||||
runOnlyForDeploymentPostprocessing = 0;
|
runOnlyForDeploymentPostprocessing = 0;
|
||||||
};
|
};
|
||||||
|
@ -215,6 +191,7 @@
|
||||||
LIBRARY_SEARCH_PATHS = (
|
LIBRARY_SEARCH_PATHS = (
|
||||||
"$(inherited)",
|
"$(inherited)",
|
||||||
"\"$(SRCROOT)/../platform/ios\"",
|
"\"$(SRCROOT)/../platform/ios\"",
|
||||||
|
"\"$(SRCROOT)\"",
|
||||||
);
|
);
|
||||||
OTHER_LDFLAGS = "-ObjC";
|
OTHER_LDFLAGS = "-ObjC";
|
||||||
PRODUCT_NAME = PluginFlurry;
|
PRODUCT_NAME = PluginFlurry;
|
||||||
|
@ -235,6 +212,7 @@
|
||||||
LIBRARY_SEARCH_PATHS = (
|
LIBRARY_SEARCH_PATHS = (
|
||||||
"$(inherited)",
|
"$(inherited)",
|
||||||
"\"$(SRCROOT)/../platform/ios\"",
|
"\"$(SRCROOT)/../platform/ios\"",
|
||||||
|
"\"$(SRCROOT)\"",
|
||||||
);
|
);
|
||||||
OTHER_LDFLAGS = "-ObjC";
|
OTHER_LDFLAGS = "-ObjC";
|
||||||
PRODUCT_NAME = PluginFlurry;
|
PRODUCT_NAME = PluginFlurry;
|
||||||
|
|
|
@ -1,82 +0,0 @@
|
||||||
/****************************************************************************
|
|
||||||
Copyright (c) 2012-2013 cocos2d-x.org
|
|
||||||
|
|
||||||
http://www.cocos2d-x.org
|
|
||||||
|
|
||||||
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.
|
|
||||||
****************************************************************************/
|
|
||||||
#ifndef __CCX_IAP_ND91_H__
|
|
||||||
#define __CCX_IAP_ND91_H__
|
|
||||||
|
|
||||||
#include "ProtocolIAP.h"
|
|
||||||
#include <map>
|
|
||||||
#include <string>
|
|
||||||
|
|
||||||
namespace cocos2d { namespace plugin {
|
|
||||||
|
|
||||||
class IAPNd91 : public ProtocolIAP
|
|
||||||
{
|
|
||||||
PLUGIN_REGISTER_DECL(IAPNd91)
|
|
||||||
public:
|
|
||||||
/**
|
|
||||||
@brief plugin initialization
|
|
||||||
*/
|
|
||||||
virtual bool init();
|
|
||||||
|
|
||||||
/**
|
|
||||||
@brief config the developer info
|
|
||||||
@param devInfo This parameter is the info of developer, must contains key:
|
|
||||||
Nd91AppId The app id of nd91
|
|
||||||
Nd91AppKey The app key of nd91
|
|
||||||
Nd91Orientation The orientation of your app(use value : portrait, landscape, auto)
|
|
||||||
default value is portrait
|
|
||||||
@warning Must invoke this interface before other interfaces.
|
|
||||||
And invoked only once.
|
|
||||||
*/
|
|
||||||
virtual void configDeveloperInfo(TIAPDeveloperInfo devInfo);
|
|
||||||
|
|
||||||
/**
|
|
||||||
@brief pay for product
|
|
||||||
@param info The info of product, must contains key:
|
|
||||||
productName The name of product
|
|
||||||
productPrice The price of product(must can be parse to float)
|
|
||||||
productDesc The description of product
|
|
||||||
Nd91ProductId The product id of product for nd91
|
|
||||||
Nd91ProductCount The product number will buy(1--10000, default value 1)
|
|
||||||
Nd91OriginalPrice The original price of product(default value is same with productPrice)
|
|
||||||
@warning For different plugin, the parameter should have other keys to pay.
|
|
||||||
Look at the manual of plugins.
|
|
||||||
*/
|
|
||||||
virtual void payForProduct(TProductInfo 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);
|
|
||||||
|
|
||||||
virtual const char* getPluginVersion() { return "v0.1.01"; };
|
|
||||||
virtual const char* getSDKVersion();
|
|
||||||
|
|
||||||
virtual ~IAPNd91();
|
|
||||||
};
|
|
||||||
|
|
||||||
}} // namespace cocos2d { namespace plugin {
|
|
||||||
|
|
||||||
#endif /* __CCX_IAP_ND91_H__ */
|
|
|
@ -1,59 +0,0 @@
|
||||||
[nd91]
|
|
||||||
# the prefix to be added to the generated functions. You might or might not use this in your own
|
|
||||||
# templates
|
|
||||||
prefix = pluginx_nd91
|
|
||||||
|
|
||||||
# create a target namespace (in javascript, this would create some code like the equiv. to `ns = ns || {}`)
|
|
||||||
# all classes will be embedded in that namespace
|
|
||||||
target_namespace = plugin
|
|
||||||
|
|
||||||
android_headers = -I%(androidndkdir)s/platforms/android-14/arch-arm/usr/include -I%(androidndkdir)s/platforms/android-14/arch-arm/usr/include/linux -I%(androidndkdir)s/sources/cxx-stl/gnu-libstdc++/4.6/libs/armeabi-v7a/include -I%(androidndkdir)s/sources/cxx-stl/gnu-libstdc++/4.6/include -I%(androidndkdir)s/toolchains/arm-linux-androideabi-4.6/prebuilt/darwin-x86/lib/gcc/arm-linux-androideabi/4.6/include
|
|
||||||
android_flags = -D_SIZE_T_DEFINED_
|
|
||||||
|
|
||||||
clang_headers = -I%(clangllvmdir)s/lib/clang/3.1/include
|
|
||||||
clang_flags = -nostdinc -x c++
|
|
||||||
|
|
||||||
cocos_headers = -I%(pluginxdir)s/protocols/include -I%(pluginxdir)s/plugins/nd91/include
|
|
||||||
|
|
||||||
cocos_flags = -DANDROID
|
|
||||||
|
|
||||||
cxxgenerator_headers = -I%(cxxgeneratordir)s/targets/spidermonkey/common
|
|
||||||
|
|
||||||
# extra arguments for clang
|
|
||||||
extra_arguments = %(android_headers)s %(clang_headers)s %(cxxgenerator_headers)s %(cocos_headers)s %(android_flags)s %(clang_flags)s %(cocos_flags)s
|
|
||||||
|
|
||||||
# what headers to parse
|
|
||||||
headers = %(pluginxdir)s/plugins/nd91/include/IAPNd91.h
|
|
||||||
|
|
||||||
# what classes to produce code for. You can use regular expressions here. When testing the regular
|
|
||||||
# expression, it will be enclosed in "^$", like this: "^CCMenu*$".
|
|
||||||
classes = IAPNd91
|
|
||||||
|
|
||||||
# what should we skip? in the format ClassName::[function function]
|
|
||||||
# ClassName is a regular expression, but will be used like this: "^ClassName$" functions are also
|
|
||||||
# regular expressions, they will not be surrounded by "^$". If you want to skip a whole class, just
|
|
||||||
# add a single "*" as functions. See bellow for several examples. A special class name is "*", which
|
|
||||||
# will apply to all class names. This is a convenience wildcard to be able to skip similar named
|
|
||||||
# functions from all classes.
|
|
||||||
|
|
||||||
skip = *::[createPlugin]
|
|
||||||
|
|
||||||
rename_functions =
|
|
||||||
|
|
||||||
rename_classes =
|
|
||||||
|
|
||||||
# for all class names, should we remove something when registering in the target VM?
|
|
||||||
remove_prefix =
|
|
||||||
|
|
||||||
# classes for which there will be no "parent" lookup
|
|
||||||
classes_have_no_parents =
|
|
||||||
|
|
||||||
# base classes which will be skipped when their sub-classes found them.
|
|
||||||
base_classes_to_skip =
|
|
||||||
|
|
||||||
# classes that create no constructor
|
|
||||||
# CCSet is special and we will use a hand-written constructor
|
|
||||||
abstract_classes = IAPNd91
|
|
||||||
|
|
||||||
# Determining whether to use script object(js object) to control the lifecycle of native(cpp) object or the other way around. Supported values are 'yes' or 'no'.
|
|
||||||
script_control_cpp = yes
|
|
|
@ -1,11 +0,0 @@
|
||||||
eclipse.preferences.version=1
|
|
||||||
org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
|
|
||||||
org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.6
|
|
||||||
org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
|
|
||||||
org.eclipse.jdt.core.compiler.compliance=1.6
|
|
||||||
org.eclipse.jdt.core.compiler.debug.lineNumber=generate
|
|
||||||
org.eclipse.jdt.core.compiler.debug.localVariable=generate
|
|
||||||
org.eclipse.jdt.core.compiler.debug.sourceFile=generate
|
|
||||||
org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
|
|
||||||
org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
|
|
||||||
org.eclipse.jdt.core.compiler.source=1.6
|
|
|
@ -1,85 +0,0 @@
|
||||||
/****************************************************************************
|
|
||||||
Copyright (c) 2012-2013 cocos2d-x.org
|
|
||||||
|
|
||||||
http://www.cocos2d-x.org
|
|
||||||
|
|
||||||
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.
|
|
||||||
****************************************************************************/
|
|
||||||
#include "IAPNd91.h"
|
|
||||||
#include "PluginUtils.h"
|
|
||||||
|
|
||||||
namespace cocos2d { namespace plugin {
|
|
||||||
|
|
||||||
PLUGIN_REGISTER_IMPL(IAPNd91)
|
|
||||||
|
|
||||||
IAPNd91::~IAPNd91()
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
@brief plugin initialization
|
|
||||||
*/
|
|
||||||
bool IAPNd91::init()
|
|
||||||
{
|
|
||||||
return PluginUtils::initJavaPlugin(this, "org.cocos2dx.plugin.IAPNd91");
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
@brief config the developer info
|
|
||||||
@param devInfo This parameter is the info of developer, must contains key:
|
|
||||||
Nd91AppId The app id of nd91
|
|
||||||
Nd91AppKey The app key of nd91
|
|
||||||
Nd91Orientation The orientation of your app(use value : portrait, landscape, auto)
|
|
||||||
default value is portrait
|
|
||||||
@warning Must invoke this interface before other interfaces.
|
|
||||||
And invoked only once.
|
|
||||||
*/
|
|
||||||
void IAPNd91::configDeveloperInfo(TIAPDeveloperInfo devInfo)
|
|
||||||
{
|
|
||||||
ProtocolIAP::configDeveloperInfo(devInfo);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
@brief pay for product
|
|
||||||
@param info The info of product, must contains key:
|
|
||||||
productName The name of product
|
|
||||||
productPrice The price of product(must can be parse to float)
|
|
||||||
productDesc The description of product
|
|
||||||
Nd91ProductId The product id of product for nd91
|
|
||||||
Nd91ProductCount The product number will buy(1--10000)
|
|
||||||
Nd91OriginalPrice The original price of product
|
|
||||||
@warning For different plugin, the parameter should have other keys to pay.
|
|
||||||
Look at the manual of plugins.
|
|
||||||
*/
|
|
||||||
void IAPNd91::payForProduct(TProductInfo info)
|
|
||||||
{
|
|
||||||
ProtocolIAP::payForProduct(info);
|
|
||||||
}
|
|
||||||
|
|
||||||
const char* IAPNd91::getSDKVersion()
|
|
||||||
{
|
|
||||||
return ProtocolIAP::getSDKVersion();
|
|
||||||
}
|
|
||||||
|
|
||||||
void IAPNd91::setDebugMode(bool debug)
|
|
||||||
{
|
|
||||||
ProtocolIAP::setDebugMode(debug);
|
|
||||||
}
|
|
||||||
|
|
||||||
}} // namespace cocos2d { namespace plugin {
|
|
|
@ -30,16 +30,4 @@
|
||||||
<nature>com.android.ide.eclipse.adt.AndroidNature</nature>
|
<nature>com.android.ide.eclipse.adt.AndroidNature</nature>
|
||||||
<nature>org.eclipse.jdt.core.javanature</nature>
|
<nature>org.eclipse.jdt.core.javanature</nature>
|
||||||
</natures>
|
</natures>
|
||||||
<linkedResources>
|
|
||||||
<link>
|
|
||||||
<name>android</name>
|
|
||||||
<type>2</type>
|
|
||||||
<locationURI>PARENT-1-PROJECT_LOC/platform/android</locationURI>
|
|
||||||
</link>
|
|
||||||
<link>
|
|
||||||
<name>include</name>
|
|
||||||
<type>2</type>
|
|
||||||
<locationURI>PARENT-1-PROJECT_LOC/include</locationURI>
|
|
||||||
</link>
|
|
||||||
</linkedResources>
|
|
||||||
</projectDescription>
|
</projectDescription>
|
||||||
|
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue