#import "TapjoyConnectPlugin.h" #import "TapjoyPlacementPlugin.h" #import "TapjoyOfferwallDiscoverPlugin.h" UIViewController *UnityGetGLViewController(); static TapjoyConnectPlugin *_sharedInstance = nil; //To make TapjoyConnect Singleton static TJPrivacyPolicy *privacyPolicyInstance = nil; static TapjoyOfferwallDiscoverPlugin *offerwallDiscoverPlugin = nil; @implementation TapjoyConnectPlugin NSString *const UNITY_GAME_OBJECT_NAME = @"TapjoyUnity"; NSString *const CONNECT_FLAG_KEY = @"connectFlags"; NSCharacterSet *URLFullCharacterSet; + (void)initialize { if (self == [TapjoyConnectPlugin class]) { _sharedInstance = [[self alloc] init]; URLFullCharacterSet = [[NSCharacterSet characterSetWithCharactersInString:@" \"#%/:<>?@[\\],^`{|}"] invertedSet]; } } + (TapjoyConnectPlugin*)sharedTapjoyConnectPlugin { return _sharedInstance; } - (id)init { self = [super init]; if (self) { tapPoints = 0; cSharpDictionaryRefs_ = [[NSMutableDictionary alloc] init]; placementDict_ = [[NSMutableDictionary alloc] init]; placementDelegateDict_ = [[NSMutableDictionary alloc] init]; offerwallDiscoverPlugin = [[TapjoyOfferwallDiscoverPlugin alloc] init]; // Connect Notifications [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(onConnectSuccess:) name:TJC_CONNECT_SUCCESS object:nil]; [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(onConnectFailure:) name:TJC_CONNECT_FAILED object:nil]; [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(onConnectWarning:) name:TJC_CONNECT_WARNING object:nil]; // Currency [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(earnedCurrency:) name:TJC_CURRENCY_EARNED_NOTIFICATION object:nil]; } return self; } #pragma mark Tapjoy Connect Notifications - (void)onConnectSuccess:(NSNotification*)notifyObj { UnitySendMessage([UNITY_GAME_OBJECT_NAME UTF8String], "OnNativeConnectCallback", "OnConnectSuccess"); } - (void)onConnectFailure:(NSNotification*)notifyObj { NSError *error = notifyObj.userInfo[@"error"]; NSMutableString *errorMessage = @"OnConnectFailure".mutableCopy; if (error != nil) { NSError *underlyingError = error.userInfo[NSUnderlyingErrorKey]; if (underlyingError != nil) { [errorMessage appendFormat:@",%ld,%@", underlyingError.code, underlyingError.localizedDescription]; } else { [errorMessage appendFormat:@",%ld,%@", error.code, error.localizedDescription]; } } UnitySendMessage([UNITY_GAME_OBJECT_NAME UTF8String], "OnNativeConnectCallback", [errorMessage UTF8String]); } - (void)onConnectWarning:(NSNotification*)notifyObj { NSError *error = notifyObj.userInfo[@"error"]; NSMutableString *errorMessage = @"OnConnectWarning".mutableCopy; if (error != nil) { NSError *underlyingError = error.userInfo[NSUnderlyingErrorKey]; if (underlyingError != nil) { [errorMessage appendFormat:@",%ld,%@", underlyingError.code, underlyingError.localizedDescription]; } else { [errorMessage appendFormat:@",%ld,%@", error.code, error.localizedDescription]; } } UnitySendMessage([UNITY_GAME_OBJECT_NAME UTF8String], "OnNativeConnectCallback", [errorMessage UTF8String]); } #pragma mark Tapjoy Currency Methods - (void)createCurrencyCallback:(NSString *)callbackName withParameters:(NSDictionary *)parameters andError:(NSError *)error { NSString *currencyName = parameters[@"currencyName"]; int balance = [parameters[@"amount"] intValue]; if (error == nil) { NSMutableString *parameters = [[NSMutableString alloc] init]; [parameters appendString:callbackName]; [parameters appendString:@","]; [parameters appendString: currencyName]; [parameters appendString:@","]; [parameters appendString: [NSString stringWithFormat:@"%i", balance]]; UnitySendMessage([UNITY_GAME_OBJECT_NAME UTF8String], "OnNativeCurrencyCallback", [parameters UTF8String]); } else { NSError *errorValue = [NSError errorWithDomain:error.domain code:error.code userInfo:error.userInfo]; NSMutableString *parameters = [[NSMutableString alloc] init]; [parameters appendString:[NSString stringWithFormat:@"%@Failure", callbackName]]; [parameters appendString:@","]; [parameters appendString: [errorValue localizedDescription]]; UnitySendMessage([UNITY_GAME_OBJECT_NAME UTF8String], "OnNativeCurrencyCallback", [parameters UTF8String]); } } - (void)earnedCurrency:(NSNotification*)notifyObj { NSNumber *tapPointsEarned = notifyObj.object; earnedCurrencyAmount = [tapPointsEarned intValue]; NSString *currencyName = [[NSUserDefaults standardUserDefaults] stringForKey:@"TJC_CURRENCY_KEY_NAME"]; if (!currencyName) { currencyName = @""; } NSMutableString *parameters = [[NSMutableString alloc] init]; [parameters appendString:@"OnEarnedCurrency,"]; [parameters appendString:currencyName]; [parameters appendString:@","]; [parameters appendString: [NSString stringWithFormat:@"%i", earnedCurrencyAmount]]; UnitySendMessage([UNITY_GAME_OBJECT_NAME UTF8String], "OnNativeCurrencyCallback", [parameters UTF8String]); } #pragma mark Tapjoy Placement Methods - (void)createPlacement:(NSString *)guid withName:(NSString *)name { TapjoyPlacementPlugin *placementDelegate = [TapjoyPlacementPlugin createPlacement:guid withName:name]; TJPlacement *placement; placement = [TJPlacement placementWithName:name delegate:placementDelegate]; if (placement == nil) { return; } [placementDict_ setObject:placement forKey:guid]; [placementDelegateDict_ setObject:placementDelegate forKey:guid]; } - (void)requestPlacementContentWithGuid:(NSString *)guid { TJPlacement *placement = [placementDict_ objectForKey:guid]; if (placement != nil) { [placement setTopViewControllerClassName:[self getUnityViewControllerName]]; [placement setPresentationViewController:UnityGetGLViewController()]; [placement requestContent]; } } - (void)showPlacementContentWithGuid:(NSString *)guid { TJPlacement *placement = [placementDict_ objectForKey:guid]; if (placement != nil) { [placement showContentWithViewController:UnityGetGLViewController()]; } } - (NSString*)getUnityViewControllerName { NSString * presentationClassName = @""; NSString * presentingClassName = @""; presentationClassName = NSStringFromClass(UnityGetGLViewController().class); if ([presentationClassName isEqualToString:@"UnityDefaultViewController"]) { presentingClassName = @"TapjoyUnityDefaultViewController"; } else if ([presentationClassName isEqualToString:@"UnityPortraitOnlyViewController"]) { presentingClassName = @"TapjoyUnityPortraitOnlyViewController"; } else if ([presentationClassName isEqualToString:@"UnityPortraitUpsideDownOnlyViewController"]) { presentingClassName = @"TapjoyUnityPortraitUpsideDownOnlyViewController"; } else if ([presentationClassName isEqualToString:@"UnityLandscapeLeftOnlyViewController"]) { presentingClassName = @"TapjoyUnityLandscapeLeftOnlyViewController"; } else if ([presentationClassName isEqualToString:@"UnityLandscapeRightOnlyViewController"]) { presentingClassName = @"TapjoyUnityLandscapeRightOnlyViewController"; } return presentingClassName; } - (bool)isPlacementContentReady:(NSString *) guid { TJPlacement *placement = [placementDict_ objectForKey:guid]; if (placement != nil) { return [placement isContentReady]; } return false; } - (bool)isPlacementContentAvailable:(NSString *)guid { TJPlacement *placement = [placementDict_ objectForKey:guid]; if (placement != nil) { return [placement isContentAvailable]; } return false; } - (void)setPlacementBalance:(NSInteger)amount forCurrencyId:(NSString *)currencyId guid:(NSString *)guid { TJPlacement *placement = [placementDict_ objectForKey:guid]; if (placement != nil) { [placement setBalance:amount forCurrencyId:currencyId withCompletion:^(NSError *error) { if (error != nil) { NSMutableString *parameters = [[NSMutableString alloc] init]; [parameters appendString:@"OnSetCurrencyBalanceFailure,"]; [parameters appendString:guid]; [parameters appendString:@","]; [parameters appendString:placement.placementName]; [parameters appendString:@","]; [parameters appendString:[NSString stringWithFormat:@"%ld", error.code]]; [parameters appendString:@","]; [parameters appendString:error.localizedDescription]; UnitySendMessage([UNITY_GAME_OBJECT_NAME UTF8String], "OnNativePlacementCallback", [parameters UTF8String]); }else{ NSMutableString *parameters = [[NSMutableString alloc] init]; [parameters appendString:@"OnSetCurrencyBalanceSuccess,"]; [parameters appendString:guid]; [parameters appendString:@","]; [parameters appendString:placement.placementName]; UnitySendMessage([UNITY_GAME_OBJECT_NAME UTF8String], "OnNativePlacementCallback", [parameters UTF8String]); } }]; } } - (NSInteger)getPlacementBalanceForCurrencyId:(NSString *)currencyId guid:(NSString *)guid { TJPlacement *placement = [placementDict_ objectForKey:guid]; if (placement != nil) { return [placement getBalanceForCurrencyId:currencyId]; } return -1; } - (void)setRequiredAmount:(NSInteger)amount forCurrencyId:(NSString *)currencyId guid:(NSString *)guid { TJPlacement *placement = [placementDict_ objectForKey:guid]; if (placement != nil) { [placement setRequiredAmount:amount forCurrencyId:currencyId withCompletion:^(NSError *error) { if (error != nil) { NSMutableString *parameters = [[NSMutableString alloc] init]; [parameters appendString:@"OnSetRequiredAmountFailure,"]; [parameters appendString:guid]; [parameters appendString:@","]; [parameters appendString:placement.placementName]; [parameters appendString:@","]; [parameters appendString:[NSString stringWithFormat:@"%ld", error.code]]; [parameters appendString:@","]; [parameters appendString:error.localizedDescription]; UnitySendMessage([UNITY_GAME_OBJECT_NAME UTF8String], "OnNativePlacementCallback", [parameters UTF8String]); }else{ NSMutableString *parameters = [[NSMutableString alloc] init]; [parameters appendString:@"OnSetRequiredAmountSuccess,"]; [parameters appendString:guid]; [parameters appendString:@","]; [parameters appendString:placement.placementName]; UnitySendMessage([UNITY_GAME_OBJECT_NAME UTF8String], "OnNativePlacementCallback", [parameters UTF8String]); } }]; } } - (NSInteger)getRequiredAmountForCurrencyId:(NSString *)currencyId guid:(NSString *)guid { TJPlacement *placement = [placementDict_ objectForKey:guid]; if (placement != nil) { return [placement getRequiredAmountForCurrencyId:currencyId]; } return -1; } - (void)removePlacement:(NSString *)guid { [placementDict_ removeObjectForKey:guid]; [placementDelegateDict_ removeObjectForKey:guid]; } #pragma mark - Tapjoy Static Placement Delegate Methods - (void)requestDidSucceed:(NSString *)guid withName:(NSString *)placementName withContent:(BOOL)contentIsAvailable { placementName = [placementName stringByAddingPercentEncodingWithAllowedCharacters:URLFullCharacterSet]; NSMutableString *parameters = [[NSMutableString alloc] init]; [parameters appendString:@"OnPlacementRequestSuccess,"]; [parameters appendString:guid]; [parameters appendString:@","]; [parameters appendString:placementName]; [parameters appendString:@","]; [parameters appendString:[NSString stringWithFormat:@"%s", contentIsAvailable ? "true" : "false"]]; UnitySendMessage([UNITY_GAME_OBJECT_NAME UTF8String], "OnNativePlacementCallback", [parameters UTF8String]); } - (void)requestDidFail:(NSString *)guid withName:(NSString *)placementName error:(NSError*)error { placementName = [placementName stringByAddingPercentEncodingWithAllowedCharacters:URLFullCharacterSet]; NSMutableString *parameters = [[NSMutableString alloc] init]; [parameters appendString:@"OnPlacementRequestFailure,"]; [parameters appendString:guid]; [parameters appendString:@","]; [parameters appendString:placementName]; [parameters appendString:@","]; NSString *errorString = [error localizedDescription]; if (errorString == nil) { errorString = @""; } [parameters appendString: errorString]; UnitySendMessage([UNITY_GAME_OBJECT_NAME UTF8String], "OnNativePlacementCallback", [parameters UTF8String]); } - (void)contentIsReady:(NSString *)guid withName:(NSString *)placementName { placementName = [placementName stringByAddingPercentEncodingWithAllowedCharacters:URLFullCharacterSet]; NSMutableString *parameters = [[NSMutableString alloc] init]; [parameters appendString:@"OnPlacementContentReady,"]; [parameters appendString:guid]; [parameters appendString:@","]; [parameters appendString:placementName]; UnitySendMessage([UNITY_GAME_OBJECT_NAME UTF8String], "OnNativePlacementCallback", [parameters UTF8String]); } - (void)contentDidAppear:(NSString *)guid withName:(NSString *)placementName { placementName = [placementName stringByAddingPercentEncodingWithAllowedCharacters:URLFullCharacterSet]; NSMutableString *parameters = [[NSMutableString alloc] init]; [parameters appendString:@"OnPlacementContentShow,"]; [parameters appendString:guid]; [parameters appendString:@","]; [parameters appendString:placementName]; UnitySendMessage([UNITY_GAME_OBJECT_NAME UTF8String], "OnNativePlacementCallback", [parameters UTF8String]); } - (void)contentDidDisappear:(NSString *)guid withName:(NSString *)placementName { placementName = [placementName stringByAddingPercentEncodingWithAllowedCharacters:URLFullCharacterSet]; NSMutableString *parameters = [[NSMutableString alloc] init]; [parameters appendString:@"OnPlacementContentDismiss,"]; [parameters appendString:guid]; [parameters appendString:@","]; [parameters appendString:placementName]; UnitySendMessage([UNITY_GAME_OBJECT_NAME UTF8String], "OnNativePlacementCallback", [parameters UTF8String]); } - (void)setEntryPoint:(NSString *)guid value:(NSString *)value { TJPlacement *placement = [placementDict_ objectForKey:guid]; if (placement != nil) { const char *cStringValue = [value UTF8String]; placement.entryPoint = TJEntryPointFromString(cStringValue); } } #pragma mark Offerwall Discover // Request - (void)requestOfferwallDiscover:(NSString*)placementName height:(CGFloat)height { [offerwallDiscoverPlugin request:placementName height:(CGFloat)height]; } - (void)requestOfferwallDiscover:(NSString*)placementName left:(CGFloat)left top:(CGFloat)top width:(CGFloat)width height:(CGFloat)height { [offerwallDiscoverPlugin request:placementName left:(CGFloat)left top:(CGFloat)top width:(CGFloat)width height:(CGFloat)height]; } // Show - (void)showOfferwallDiscover { [offerwallDiscoverPlugin show:UnityGetGLView()]; } // Destroy - (void)destroyOfferwallDiscover { [offerwallDiscoverPlugin destroy]; } - (void)offerwallDiscoverRequestDidSucceed { NSMutableString *parameters = [[NSMutableString alloc] init]; [parameters appendString:@"OnOfferwallDiscoverRequestSuccess"]; UnitySendMessage([UNITY_GAME_OBJECT_NAME UTF8String], "OnNativeOfferwallDiscoverCallback", [parameters UTF8String]); } - (void)offerwallDiscoverRequestDidFail:(NSError *)error { NSMutableString *parameters = [[NSMutableString alloc] init]; [parameters appendString:@"OnOfferwallDiscoverRequestFailure"]; [parameters appendString:@","]; [parameters appendString:[NSString stringWithFormat:@"%li", [error code]]]; [parameters appendString:@","]; NSString *errorString = [error localizedDescription]; if (errorString == nil) { errorString = @""; } [parameters appendString: errorString]; UnitySendMessage([UNITY_GAME_OBJECT_NAME UTF8String], "OnNativeOfferwallDiscoverCallback", [parameters UTF8String]); } - (void)offerwallDiscoverContentReady { NSMutableString *parameters = [[NSMutableString alloc] init]; [parameters appendString:@"OnOfferwallDiscoverContentReady"]; UnitySendMessage([UNITY_GAME_OBJECT_NAME UTF8String], "OnNativeOfferwallDiscoverCallback", [parameters UTF8String]); } - (void)offerwallDiscoverContentError:(NSError *)error { NSMutableString *parameters = [[NSMutableString alloc] init]; [parameters appendString:@"OnOfferwallDiscoverContentError"]; [parameters appendString:@","]; [parameters appendString:[NSString stringWithFormat:@"%li", [error code]]]; [parameters appendString:@","]; NSString *errorString = [error localizedDescription]; if (errorString == nil) { errorString = @""; } [parameters appendString: errorString]; UnitySendMessage([UNITY_GAME_OBJECT_NAME UTF8String], "OnNativeOfferwallDiscoverCallback", [parameters UTF8String]); } #pragma mark Bridge methods between C# and Objective-C // Sets a value to a key in specific dictionary - (void)setKey:(NSString*)key ToValue:(NSString*)value InDictionary:(NSString*)dictionaryToAddTo { // Get dictionary to add key and value to, creates one if doesn't exist NSMutableDictionary* currentDictionary = [[TapjoyConnectPlugin sharedTapjoyConnectPlugin] getReferenceDictionary:dictionaryToAddTo]; [currentDictionary setObject:value forKey:key]; } // Sets an int value to a key in a specific dictionary - (void)setKey:(NSString*)key ToIntValue:(NSInteger)value InDictionary:(NSString*)dictionaryToAddTo { NSMutableDictionary* currentDictionary = [[TapjoyConnectPlugin sharedTapjoyConnectPlugin] getReferenceDictionary:dictionaryToAddTo]; [currentDictionary setObject:@(value) forKey:key]; } // Sets a dictionary as a vaule to a key in specific dictionary - (void)setKey:(NSString*)key ToDictionaryRefValue:(NSString*)dictionaryRefToAdd InDictionary:(NSString*)dictionaryToAddTo { // Get dictionary to add key and value to, creates one if doesn't exist NSMutableDictionary* dictionaryToTransferTo = [[TapjoyConnectPlugin sharedTapjoyConnectPlugin] getReferenceDictionary:dictionaryToAddTo]; // Get reference to dictionary that needs to be added NSMutableDictionary* dictionaryToBeSetAsValue = [[TapjoyConnectPlugin sharedTapjoyConnectPlugin] getReferenceDictionary:dictionaryRefToAdd AndCreateNewInstance:NO]; if (!dictionaryToBeSetAsValue) { NSLog(@"no dictionary reference by the name of: %@", dictionaryRefToAdd); return; } [dictionaryToTransferTo setObject:dictionaryToBeSetAsValue forKey:key]; } // Helper function to check if a dictionary is defined and if not creates one - (NSMutableDictionary*)getReferenceDictionary:(NSString*) dictionaryName { return [[TapjoyConnectPlugin sharedTapjoyConnectPlugin] getReferenceDictionary:dictionaryName AndCreateNewInstance:YES]; } // Helper function to check if a dictionary is defined and will or will not create a new instance if one doesn't exsits - (NSMutableDictionary*)getReferenceDictionary:(NSString*) dictionaryName AndCreateNewInstance:(BOOL) newInstance { NSMutableDictionary* currentDictionary = [cSharpDictionaryRefs_ objectForKey:dictionaryName]; if (!currentDictionary && newInstance) { currentDictionary = [[NSMutableDictionary alloc] init]; [cSharpDictionaryRefs_ setObject:currentDictionary forKey: dictionaryName]; } return currentDictionary; } @end // Converts C style string to NSString NSString* tjCreateNSString (const char* string) { if (string) return [NSString stringWithUTF8String: string]; else return @""; } char* tjDuplicateString(const char* string) { if (string == NULL) return NULL; char* dup = (char*)malloc(strlen(string) + 1); strcpy(dup, string); return dup; } // When native code plugin is implemented in .mm / .cpp file, then functions // should be surrounded with extern "C" block to conform C function naming rules extern "C" { void Tapjoy_Connect(const char* sdkKey) { [[Tapjoy sharedTapjoyConnect] setPlugin:@"unity"]; NSDictionary* flags = [[TapjoyConnectPlugin sharedTapjoyConnectPlugin] getReferenceDictionary:CONNECT_FLAG_KEY]; if (flags && [flags count] > 0) { [Tapjoy connect:tjCreateNSString(sdkKey) options:flags]; } else { [Tapjoy connect:tjCreateNSString(sdkKey)]; } } const char* Tapjoy_GetSDKVersion() { return tjDuplicateString([Tapjoy getVersion].UTF8String); } void Tapjoy_SetLoggingLevel(int loggingLevel) { [Tapjoy setLoggingLevel:(TJLoggerLevel)loggingLevel]; } int Tapjoy_GetLoggingLevel() { return (int)Tapjoy.loggingLevel; } void Tapjoy_GetPrivacyPolicy() { if (privacyPolicyInstance == nil) { privacyPolicyInstance = [Tapjoy getPrivacyPolicy]; } } void Tapjoy_SetUSPrivacy(const char* privacyConsent) { if (privacyPolicyInstance != nil) { [privacyPolicyInstance setUSPrivacy: tjCreateNSString(privacyConsent)]; } } void Tapjoy_SetSubjectToGDPRStatus(int gdprApplicable) { if (privacyPolicyInstance != nil) { [privacyPolicyInstance setSubjectToGDPRStatus: (gdprApplicable == 1) ? TJStatusTrue : (gdprApplicable == 0) ? TJStatusFalse : TJStatusUnknown]; } } void Tapjoy_SetUserConsentStatus(int consent) { if (privacyPolicyInstance != nil) { [privacyPolicyInstance setUserConsentStatus: (consent == 1) ? TJStatusTrue : (consent == 0) ? TJStatusFalse : TJStatusUnknown]; } } void Tapjoy_SetBelowConsentAgeStatus(int isBelowConsentAge) { if (privacyPolicyInstance != nil) { [privacyPolicyInstance setBelowConsentAgeStatus: (isBelowConsentAge == 1) ? TJStatusTrue : (isBelowConsentAge == 0) ? TJStatusFalse : TJStatusUnknown]; } } int Tapjoy_GetSubjectToGDPRStatus() { if (privacyPolicyInstance != nil) { return (int)privacyPolicyInstance.subjectToGDPRStatus; } return (int)TJStatusUnknown; } int Tapjoy_GetUserConsentStatus() { if (privacyPolicyInstance != nil) { return (int)privacyPolicyInstance.userConsentStatus; } return (int)TJStatusUnknown; } int Tapjoy_GetBelowConsentAgeStatus() { if (privacyPolicyInstance != nil) { return (int)privacyPolicyInstance.belowConsentAgeStatus; } return (int)TJStatusUnknown; } const char* Tapjoy_GetUSPrivacy() { if (privacyPolicyInstance != nil) { return tjDuplicateString([privacyPolicyInstance USPrivacy].UTF8String); } return nil; } void Tapjoy_OptOutAdvertisingID(bool optOut) { // do nothing } bool Tapjoy_GetOptOutAdvertisingID() { return false; } void Tapjoy_SetUnityVersion(const char* version) { // TODO: Set unity version } void Tapjoy_GetCurrencyBalance(void) { [Tapjoy getCurrencyBalanceWithCompletion:^(NSDictionary *parameters, NSError *error) { [[TapjoyConnectPlugin sharedTapjoyConnectPlugin] createCurrencyCallback:@"OnGetCurrencyBalanceResponse" withParameters:parameters andError:error]; }]; } void Tapjoy_SpendCurrency(int amount) { [Tapjoy spendCurrency:amount completion:^(NSDictionary *parameters, NSError *error) { [[TapjoyConnectPlugin sharedTapjoyConnectPlugin] createCurrencyCallback:@"OnSpendCurrencyResponse" withParameters:parameters andError:error]; }]; } void Tapjoy_AwardCurrency(int amount) { [Tapjoy awardCurrency:amount completion:^(NSDictionary *parameters, NSError *error) { [[TapjoyConnectPlugin sharedTapjoyConnectPlugin] createCurrencyCallback:@"OnAwardCurrencyResponse" withParameters:parameters andError:error]; }]; } void Tapjoy_ShowDefaultEarnedCurrencyAlert(void) { // Pops up a UIAlert notifying the user that they have successfully earned some currency. // This is the default alert, so you may place a custom alert here if you choose to do so. [Tapjoy showDefaultEarnedCurrencyAlert]; } //#pragma mark - Tapjoy Event C Layer void Tapjoy_CreatePlacement(const char* guid, const char* name) { [[TapjoyConnectPlugin sharedTapjoyConnectPlugin] createPlacement:tjCreateNSString(guid) withName:tjCreateNSString(name)]; } void Tapjoy_DismissPlacementContent() { [TJPlacement dismissContent]; } void Tapjoy_RequestPlacementContent(const char* guid) { [[TapjoyConnectPlugin sharedTapjoyConnectPlugin] requestPlacementContentWithGuid:tjCreateNSString(guid)]; } void Tapjoy_ShowPlacementContent(const char* guid) { [[TapjoyConnectPlugin sharedTapjoyConnectPlugin] showPlacementContentWithGuid:tjCreateNSString(guid)]; } bool Tapjoy_IsPlacementContentAvailable(const char* guid) { return [[TapjoyConnectPlugin sharedTapjoyConnectPlugin] isPlacementContentAvailable:tjCreateNSString(guid)]; } bool Tapjoy_IsPlacementContentReady(const char* guid) { return [[TapjoyConnectPlugin sharedTapjoyConnectPlugin] isPlacementContentReady:tjCreateNSString(guid)]; } void Tapjoy_SetEntryPoint(const char* guid, const char* entrypoint) { [[TapjoyConnectPlugin sharedTapjoyConnectPlugin] setEntryPoint:tjCreateNSString(guid) value:tjCreateNSString(entrypoint)]; } void Tapjoy_SetPlacementBalance(const char* guid, const char* currencyId, NSInteger amount) { return [[TapjoyConnectPlugin sharedTapjoyConnectPlugin] setPlacementBalance:amount forCurrencyId:tjCreateNSString(currencyId) guid:tjCreateNSString(guid)]; } NSInteger Tapjoy_GetPlacementBalance(const char* guid, const char* currencyId) { return [[TapjoyConnectPlugin sharedTapjoyConnectPlugin] getPlacementBalanceForCurrencyId:tjCreateNSString(currencyId) guid:tjCreateNSString(guid)]; } void Tapjoy_SetRequiredAmount(const char* guid, const char* currencyId, NSInteger amount) { return [[TapjoyConnectPlugin sharedTapjoyConnectPlugin] setRequiredAmount:amount forCurrencyId:tjCreateNSString(currencyId) guid:tjCreateNSString(guid)]; } NSInteger Tapjoy_GetRequiredAmount(const char* guid, const char* currencyId) { return [[TapjoyConnectPlugin sharedTapjoyConnectPlugin] getRequiredAmountForCurrencyId:tjCreateNSString(currencyId) guid:tjCreateNSString(guid)]; } void Tapjoy_RequestOfferwallDiscover(const char* placementName, float height) { [[TapjoyConnectPlugin sharedTapjoyConnectPlugin] requestOfferwallDiscover:tjCreateNSString(placementName) height:(CGFloat) height]; } void Tapjoy_RequestOfferwallDiscoverAtPosition(const char* placementName, float left, float top, float width, float height) { [[TapjoyConnectPlugin sharedTapjoyConnectPlugin] requestOfferwallDiscover:tjCreateNSString(placementName) left:(CGFloat) left top:(CGFloat) top width:(CGFloat) width height:(CGFloat) height]; } void Tapjoy_ShowOfferwallDiscover() { [[TapjoyConnectPlugin sharedTapjoyConnectPlugin] showOfferwallDiscover]; } void Tapjoy_DestroyOfferwallDiscover() { [[TapjoyConnectPlugin sharedTapjoyConnectPlugin] destroyOfferwallDiscover]; } void Tapjoy_RemovePlacement(const char* guid) { [[TapjoyConnectPlugin sharedTapjoyConnectPlugin] removePlacement:tjCreateNSString(guid)]; } /* User */ void Tapjoy_SetUserID(const char* userID) { [Tapjoy setUserIDWithCompletion:tjCreateNSString(userID) completion:^(BOOL success, NSError *error) { if (success) { UnitySendMessage([UNITY_GAME_OBJECT_NAME UTF8String], "OnNativeSetUserIDCallback", "OnSetUserIDSuccess"); } else { NSMutableString *errorMessage = @"OnSetUserIDFailure".mutableCopy; if (error != nil) { [errorMessage appendFormat:@",%ld,%@", error.code, error.localizedDescription]; } else { [errorMessage appendFormat:@",%ld,%@", -1, "Unknown Error setting user id."]; } UnitySendMessage([UNITY_GAME_OBJECT_NAME UTF8String], "OnNativeSetUserIDCallback", [errorMessage UTF8String]); } }]; } const char* Tapjoy_GetUserID() { return tjDuplicateString([Tapjoy getUserID].UTF8String); } /* Currency Callback Param */ void Tapjoy_SetCustomParameter(const char* customParam) { [Tapjoy setCustomParameter:tjCreateNSString(customParam)]; } const char* Tapjoy_GetCustomParameter() { return tjDuplicateString([Tapjoy getCustomParameter].UTF8String); } void Tapjoy_SetUserLevel(int userLevel) { [Tapjoy setUserLevel:userLevel]; } int Tapjoy_GetUserLevel() { return [Tapjoy getUserLevel]; } void Tapjoy_SetMaxLevel(int maxUserLevel) { [Tapjoy setMaxLevel:maxUserLevel]; } int Tapjoy_GetMaxLevel() { return [[Tapjoy getMaxLevel] intValue]; } void Tapjoy_SetUserSegment(int userSegment) { switch (userSegment) { case 0: [Tapjoy setUserSegment:TJSegmentNonPayer]; break; case 1: [Tapjoy setUserSegment:TJSegmentPayer]; break; case 2: [Tapjoy setUserSegment:TJSegmentVIP]; break; default: [Tapjoy setUserSegment:TJSegmentUnknown]; break; } } int Tapjoy_GetUserSegment() { return (int)[Tapjoy getUserSegment]; } double Tapjoy_GetScreenScale() { return (double)[UIScreen mainScreen].scale; } /* User Tags */ void Tapjoy_ClearUserTags() { [Tapjoy clearUserTags]; } const char* Tapjoy_GetUserTags() { NSError* error = nil; NSData *data = [NSJSONSerialization dataWithJSONObject:[[Tapjoy getUserTags] allObjects] options:NSJSONWritingPrettyPrinted error:&error]; NSString *serializedTags = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]; return tjDuplicateString(serializedTags.UTF8String); } void Tapjoy_AddUserTag(const char* tag) { [Tapjoy addUserTag:tjCreateNSString(tag)]; } void Tapjoy_RemoveUserTag(const char* tag) { [Tapjoy removeUserTag:tjCreateNSString(tag)]; } /* Track Purchase */ void Tapjoy_TrackPurchase(const char* currencyCode, double price) { [Tapjoy trackPurchaseWithCurrencyCode: tjCreateNSString(currencyCode) price: price]; } // Bridge methods between Objective-C and C# void Tapjoy_SetKeyToValueInDictionary(const char* key, const char* value, const char* dictionaryToAddTo) { [[TapjoyConnectPlugin sharedTapjoyConnectPlugin] setKey:tjCreateNSString(key) ToValue:tjCreateNSString(value) InDictionary:tjCreateNSString(dictionaryToAddTo)]; } void Tapjoy_SetKeyToIntInDictionary(const char* key, int value, const char* dictionaryToAddTo) { [[TapjoyConnectPlugin sharedTapjoyConnectPlugin] setKey:tjCreateNSString(key) ToIntValue:(NSInteger)value InDictionary:tjCreateNSString(dictionaryToAddTo)]; } void Tapjoy_SetKeyToDictionaryRefValueInDictionary(const char* key, const char* dictionaryRefToAdd, const char* dictionaryToAddTo) { [[TapjoyConnectPlugin sharedTapjoyConnectPlugin] setKey:tjCreateNSString(key) ToDictionaryRefValue:tjCreateNSString(dictionaryRefToAdd) InDictionary:tjCreateNSString(dictionaryToAddTo)]; } }