diff --git a/Config/FilterPlugin.ini b/Config/FilterPlugin.ini new file mode 100644 index 0000000..7204d1b --- /dev/null +++ b/Config/FilterPlugin.ini @@ -0,0 +1,2 @@ +[FilterPlugin] +/Documentation/ diff --git a/Documentation/MobileUtils_UserGuide.pdf b/Documentation/MobileUtils_UserGuide.pdf new file mode 100644 index 0000000..f8f3119 Binary files /dev/null and b/Documentation/MobileUtils_UserGuide.pdf differ diff --git a/LICENSE b/LICENSE index 09e84b1..b3905ca 100644 --- a/LICENSE +++ b/LICENSE @@ -1,6 +1,6 @@ The MIT License (MIT) -Copyright (c) 2016 gameDNA +Copyright (c) 2017 gameDNA Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal diff --git a/MobileUtils.uplugin b/MobileUtils.uplugin index 0098dd6..9b442cc 100644 --- a/MobileUtils.uplugin +++ b/MobileUtils.uplugin @@ -1,25 +1,27 @@ { "FileVersion": 3, "Version": 1, - "VersionName": "1.2.0", + "VersionName": "1.5.0", "FriendlyName": "Mobile Utils", "Description": "Additional utilities for mobile games", "Category": "Misc", "CreatedBy": "gameDNA", "CreatedByURL": "http://gamednastudio.com", "DocsURL": "https://github.com/gameDNAstudio/MobileUtils", - "MarketplaceURL": "", - "EngineVersion": "4.14.0", + "MarketplaceURL": "com.epicgames.launcher://ue/marketplace/content/94e8f674898a4589882c283436190676", + "EngineVersion": "4.16.0", "SupportURL": "mailto:support@gamednastudio.com", "Modules": [ { "Name": "MobileUtils", "Type": "Runtime", - "LoadingPhase": "PostConfigInit" + "LoadingPhase": "PostConfigInit", + "WhitelistPlatforms": [ "Win64", "Win32", "Mac", "IOS", "Android" ] } ], "EnabledByDefault": true, "CanContainContent": false, "IsBetaVersion": false, - "Installed": false + "Installed": true, + "RequiresBuildPlatform": false } diff --git a/README.md b/README.md index 5d15c41..bdfa5af 100644 --- a/README.md +++ b/README.md @@ -2,16 +2,19 @@ # Mobile Utils -The **Mobile Utils** plugin lets you integrate out-of-the-box mobile utitilites for iOS & Android into your [Unreal Engine 4](http://www.unrealengine.com) project. +**Mobile Utils** lets you integrate out-of-the-box mobile utilities for iOS & Android into an Unreal Engine 4 project. For example, it allows you to check an Internet connection and Google Play Services availability as well as get persistent Unique Device ID (you can identify users between application installations in order to, for example, store saved games in a cloud). This plugin is a mobile community initiative. Everyone can contribute and pull request with awesome new features to extend the editor and functionality of Unreal Engine 4. -* **Current version:** 1.2.0 -* **Binaries compiled for:** Unreal Engine 4.14 -* **Required Unreal Engine 4.14 or above.** +We want to make a big mobile plugin with many features from community so feel free to make pull request! After review, if all is good, it will be merged into plugin. Thank you! :-) + +* **Current version:** 1.5.0 +* **Binaries compiled for:** Unreal Engine 4.16 +* **Required Unreal Engine 4.16 or above.** ## Features * Checking internet connection availability * Checking Google Play Services availability * Getting persistent Unique Device ID +* Retrieving Auth Token from Online Subsystem * Works with dev & shipping builds * Out-of-the-box for iOS & Android * Additional SDK included @@ -27,19 +30,19 @@ Enable *Mobile Utils* in *Edit -> Plugins -> Misc -> Mobile Utils*. ![EnablePlugin](Resources/EnablePlugin.png) -#Recommended PR pipeline +# Recommended PR pipeline * Write java and/or Obj-C code in Android Studio or XCode depending on the platform(s) you wish to add functionality to * Test your code with a very simple app setup on your Android or iPhone * Integrate your code to the plugin **without** creating an interface to blueprints * Create a new sample project and test your code on a packaged project, at your desired device and platform * If everything works correctly, perform a Pull Request -* + The reason that we prohibit you from creating a new blueprint node is to ensure cross platform compatibility as well as a uniform look and feel throughout the codebase. After your PR gets merged we will make sure that a new blueprint node is created if needed. We recommend trying to integrate your changes to the actual engine's master branch first and if your PR doesn't get merged, then resort to adding functionality to this plugin. -#Integration to the plugin +# Integration to the plugin Here you will find the steps you need to take in order to add new functionality to this plugin. -##For Android +## For Android At /Source/MobileUtils/MobileUtils_APL.xml, Add your tested java code: @@ -62,7 +65,7 @@ Continue your integration: And now, some extra intel. Do not be afraid to open up the source of Unreal and look into the Android related parts of the system as well as pull requests that add features to the android part. You can find more information about JNI method signatures [here!](http://www.rgagnon.com/javadetails/java-0286.html) -##For iOS +## For iOS At /Source/MobileUtils/Private/IOS/MobileUtilsPlatform.h, Start integrating your code into the plugin: @@ -74,7 +77,7 @@ Continue your integration: In UE4 iOS specific code should be written in Objective-C. Remember you can mix C++ code with Objective-C code! -#Testing the plugin +# Testing the plugin In order to test your changes, create a new project with your engine version of choise (although, it should be greater than our current minimum requirement~4.12),then clone the plugin at *Project Folder*/Plugins and then regenerate project files. The new folder "MobileUtils" should then be visible. After building the development editor you will be able to use code that you integrated or existing blueprint nodes. Note that this happens if you want to make a PR. If you are just looking to use the plugin, check the [releases](https://github.com/gameDNAstudio/MobileUtils/releases) page. Plugin icon designed by _Freepik_. diff --git a/Resources/Splash.png b/Resources/Splash.png index bf096d5..9a4efa5 100644 Binary files a/Resources/Splash.png and b/Resources/Splash.png differ diff --git a/Source/MobileUtils/Classes/Interfaces/MobileUtilsInterface.h b/Source/MobileUtils/Classes/Interfaces/MobileUtilsInterface.h index efedb51..2787b31 100644 --- a/Source/MobileUtils/Classes/Interfaces/MobileUtilsInterface.h +++ b/Source/MobileUtils/Classes/Interfaces/MobileUtilsInterface.h @@ -4,6 +4,8 @@ #pragma once +#include "Runtime/Engine/Classes/Engine/Texture2D.h" + class IMobileUtilsInterface { @@ -28,4 +30,20 @@ class IMobileUtilsInterface * @return - Unique Device ID */ virtual FString GetPersistentUniqueDeviceId(); + + /** + * Prompt user to select an image from gallery. + * + * + */ + virtual void SelectImage(); + + /** + * Return the path to user's selected image. + * + * @return - The full file path of the selected image. + */ + virtual FString GetImagePath(); + + virtual UTexture2D* GetImgTexture(float& Height, float& Width); }; diff --git a/Source/MobileUtils/Classes/MobileUtilsBlueprintLibrary.h b/Source/MobileUtils/Classes/MobileUtilsBlueprintLibrary.h index 7c87c02..fd5f4d6 100644 --- a/Source/MobileUtils/Classes/MobileUtilsBlueprintLibrary.h +++ b/Source/MobileUtils/Classes/MobileUtilsBlueprintLibrary.h @@ -5,6 +5,7 @@ #pragma once #include "Kismet/BlueprintFunctionLibrary.h" +#include "Runtime/Engine/Classes/Engine/Texture2D.h" #include "MobileUtilsBlueprintLibrary.generated.h" @@ -36,4 +37,24 @@ class MOBILEUTILS_API UMobileUtilsBlueprintLibrary : public UBlueprintFunctionLi */ UFUNCTION(BlueprintCallable, BlueprintPure, Category = MobileUtils) static FString GetPersistentUniqueDeviceId(); + + + /** + * Start intent to select image. + * + * + */ + UFUNCTION(BlueprintCallable, Category = MobileUtils) + static void SelectImage(); + + /** + * Return the path to the image that the user selected. + * + * @return - full path to the image user selected in gallery prompt. + */ + UFUNCTION(BlueprintCallable, BlueprintPure, Category = MobileUtils) + static FString GetImagePath(); + + UFUNCTION(BlueprintCallable, Category = MobileUtils) + static UTexture2D* GetImgTexture(float& Height, float& Width); }; diff --git a/Source/MobileUtils/MobileUtils_APL.xml b/Source/MobileUtils/MobileUtils_UPL_Android.xml similarity index 98% rename from Source/MobileUtils/MobileUtils_APL.xml rename to Source/MobileUtils/MobileUtils_UPL_Android.xml index 35922e4..34a7f7a 100644 --- a/Source/MobileUtils/MobileUtils_APL.xml +++ b/Source/MobileUtils/MobileUtils_UPL_Android.xml @@ -2,7 +2,7 @@ diff --git a/Source/MobileUtils/MobileUtils_UPL_IOS.xml b/Source/MobileUtils/MobileUtils_UPL_IOS.xml new file mode 100644 index 0000000..72cef52 --- /dev/null +++ b/Source/MobileUtils/MobileUtils_UPL_IOS.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/Source/MobileUtils/Private/Android/MobileUtilsPlatform.cpp b/Source/MobileUtils/Private/Android/MobileUtilsPlatform.cpp index d88a5c5..8419252 100644 --- a/Source/MobileUtils/Private/Android/MobileUtilsPlatform.cpp +++ b/Source/MobileUtils/Private/Android/MobileUtilsPlatform.cpp @@ -1,60 +1,183 @@ -// Mobile Utils Plugin -// Created by Patryk Stepniewski -// Copyright (c) 2014-2016 gameDNA studio. All Rights Reserved. - -#include "MobileUtilsPrivatePCH.h" -#include "MobileUtilsPlatform.h" -#include "Runtime/Engine/Classes/Kismet/KismetSystemLibrary.h" - - -jmethodID FMobileUtilsPlatform::CheckInternetConnectionMethod; -jmethodID FMobileUtilsPlatform::CheckGooglePlayServicesMethod; -jmethodID FMobileUtilsPlatform::GetPersistentUniqueDeviceIdMethod; - -FMobileUtilsPlatform::FMobileUtilsPlatform() -{ - if (JNIEnv* Env = FAndroidApplication::GetJavaEnv()) - { - CheckInternetConnectionMethod = FJavaWrapper::FindMethod(Env, FJavaWrapper::GameActivityClassID, "AndroidThunkJava_CheckInternetConnection", "()Z", false); - CheckGooglePlayServicesMethod = FJavaWrapper::FindMethod(Env, FJavaWrapper::GameActivityClassID, "AndroidThunkJava_CheckGooglePlayServices", "()Z", false); - GetPersistentUniqueDeviceIdMethod = FJavaWrapper::FindMethod(Env, FJavaWrapper::GameActivityClassID, "AndroidThunkJava_GetPersistentUniqueDeviceId", "()Ljava/lang/String;", false); - } -} - -FMobileUtilsPlatform::~FMobileUtilsPlatform() -{ -} - -bool FMobileUtilsPlatform::CheckInternetConnection() -{ - bool bResult = false; - if (JNIEnv* Env = FAndroidApplication::GetJavaEnv()) - { - bResult = FJavaWrapper::CallBooleanMethod(Env, FJavaWrapper::GameActivityThis, FMobileUtilsPlatform::CheckInternetConnectionMethod); - } - return bResult; -} - -bool FMobileUtilsPlatform::CheckGooglePlayServices() -{ - bool bResult = false; - if (JNIEnv* Env = FAndroidApplication::GetJavaEnv()) - { - bResult = FJavaWrapper::CallBooleanMethod(Env, FJavaWrapper::GameActivityThis, FMobileUtilsPlatform::CheckGooglePlayServicesMethod); - } - return bResult; -} - -FString FMobileUtilsPlatform::GetPersistentUniqueDeviceId() -{ - FString ResultDeviceId = FString(""); - if (JNIEnv* Env = FAndroidApplication::GetJavaEnv()) - { - jstring ResultDeviceIdString = (jstring)FJavaWrapper::CallObjectMethod(Env, FJavaWrapper::GameActivityThis, FMobileUtilsPlatform::GetPersistentUniqueDeviceIdMethod); - const char *nativeDeviceIdString = Env->GetStringUTFChars(ResultDeviceIdString, 0); - ResultDeviceId = FString(nativeDeviceIdString); - Env->ReleaseStringUTFChars(ResultDeviceIdString, nativeDeviceIdString); - Env->DeleteLocalRef(ResultDeviceIdString); - } - return ResultDeviceId; -} +// Mobile Utils Plugin +// Created by Patryk Stepniewski +// Copyright (c) 2014-2016 gameDNA studio. All Rights Reserved. + +#include "MobileUtilsPrivatePCH.h" +#include "MobileUtilsPlatform.h" +#include "Runtime/Engine/Classes/Kismet/KismetSystemLibrary.h" + + +jmethodID FMobileUtilsPlatform::CheckInternetConnectionMethod; +jmethodID FMobileUtilsPlatform::CheckGooglePlayServicesMethod; +jmethodID FMobileUtilsPlatform::GetPersistentUniqueDeviceIdMethod; +jmethodID FMobileUtilsPlatform::SelectImageMethod; +jmethodID FMobileUtilsPlatform::GetImagePathMethod; +jstring ImageFilePath; + +FMobileUtilsPlatform::FMobileUtilsPlatform() +{ + if (JNIEnv* Env = FAndroidApplication::GetJavaEnv()) + { + CheckInternetConnectionMethod = FJavaWrapper::FindMethod(Env, FJavaWrapper::GameActivityClassID, "AndroidThunkJava_CheckInternetConnection", "()Z", false); + CheckGooglePlayServicesMethod = FJavaWrapper::FindMethod(Env, FJavaWrapper::GameActivityClassID, "AndroidThunkJava_CheckGooglePlayServices", "()Z", false); + GetPersistentUniqueDeviceIdMethod = FJavaWrapper::FindMethod(Env, FJavaWrapper::GameActivityClassID, "AndroidThunkJava_GetPersistentUniqueDeviceId", "()Ljava/lang/String;", false); + SelectImageMethod = FJavaWrapper::FindMethod(Env, FJavaWrapper::GameActivityClassID, "AndroidThunkJava_SelectImage", "()V", false); + GetImagePathMethod = FJavaWrapper::FindMethod(Env, FJavaWrapper::GameActivityClassID, "AndroidThunkJava_GetImagePath", "()Ljava/lang/String;", false); + } +} + +FMobileUtilsPlatform::~FMobileUtilsPlatform() +{ +} + +bool FMobileUtilsPlatform::CheckInternetConnection() +{ + bool bResult = false; + if (JNIEnv* Env = FAndroidApplication::GetJavaEnv()) + { + bResult = FJavaWrapper::CallBooleanMethod(Env, FJavaWrapper::GameActivityThis, FMobileUtilsPlatform::CheckInternetConnectionMethod); + } + return bResult; +} + +bool FMobileUtilsPlatform::CheckGooglePlayServices() +{ + bool bResult = false; + if (JNIEnv* Env = FAndroidApplication::GetJavaEnv()) + { + bResult = FJavaWrapper::CallBooleanMethod(Env, FJavaWrapper::GameActivityThis, FMobileUtilsPlatform::CheckGooglePlayServicesMethod); + } + return bResult; +} + +FString FMobileUtilsPlatform::GetPersistentUniqueDeviceId() +{ + FString ResultDeviceId = FString(""); + if (JNIEnv* Env = FAndroidApplication::GetJavaEnv()) + { + jstring ResultDeviceIdString = (jstring)FJavaWrapper::CallObjectMethod(Env, FJavaWrapper::GameActivityThis, FMobileUtilsPlatform::GetPersistentUniqueDeviceIdMethod); + const char *nativeDeviceIdString = Env->GetStringUTFChars(ResultDeviceIdString, 0); + ResultDeviceId = FString(nativeDeviceIdString); + Env->ReleaseStringUTFChars(ResultDeviceIdString, nativeDeviceIdString); + Env->DeleteLocalRef(ResultDeviceIdString); + } + return ResultDeviceId; +} + +void FMobileUtilsPlatform::SelectImage() +{ + if (JNIEnv* Env = FAndroidApplication::GetJavaEnv()) + { + FJavaWrapper::CallVoidMethod(Env, FJavaWrapper::GameActivityThis, FMobileUtilsPlatform::SelectImageMethod); + } +} + +FString FMobileUtilsPlatform::GetImagePath() +{ + FString ResultFilePath = FString(""); + if (JNIEnv* Env = FAndroidApplication::GetJavaEnv()) + { + jstring ResultFilePathString = (jstring)FJavaWrapper::CallObjectMethod(Env, FJavaWrapper::GameActivityThis, FMobileUtilsPlatform::GetImagePathMethod); + const char* nativeFilePathString = Env->GetStringUTFChars(ResultFilePathString, 0); + ResultFilePath = FString(nativeFilePathString); + Env->ReleaseStringUTFChars(ResultFilePathString, nativeFilePathString); + Env->DeleteLocalRef(ResultFilePathString); + } + return ResultFilePath; +} + +EImageFormat::Type FMobileUtilsPlatform::GetImageType(FString InPath) +{ + FString lhs; + FString Extension; + InPath.Split(FString("."), &lhs, &Extension, ESearchCase::IgnoreCase, ESearchDir::FromEnd); + Extension = Extension.ToLower(); + if (Extension == "png") + return EImageFormat::PNG; + if (Extension == "jpeg" || Extension == "jpg") + return EImageFormat::JPEG; + if (Extension == "bmp") + return EImageFormat::BMP; + return EImageFormat::Invalid; +} + +UTexture2D* FMobileUtilsPlatform::GetImgTexture(float& Height, float& Width) +{ + // I would be nothing without RaMa + FString ResultFilePath = FString(""); + if (JNIEnv* Env = FAndroidApplication::GetJavaEnv()) + { + jstring ResultFilePathString = (jstring)FJavaWrapper::CallObjectMethod(Env, FJavaWrapper::GameActivityThis, FMobileUtilsPlatform::GetImagePathMethod); + const char* nativeFilePathString = Env->GetStringUTFChars(ResultFilePathString, 0); + ResultFilePath = FString(nativeFilePathString); + Env->ReleaseStringUTFChars(ResultFilePathString, nativeFilePathString); + Env->DeleteLocalRef(ResultFilePathString); + + UTexture2D* LoadedTex = NULL; + + IImageWrapperModule& ImageWrapperModule = FModuleManager::LoadModuleChecked(FName("ImageWrapper")); + EImageFormat::Type ImageFormat = GetImageType(ResultFilePath); + IImageWrapperPtr ImageWrapper = ImageWrapperModule.CreateImageWrapper(ImageFormat); + TArray RawFileData; + FString ExternalFilePath = GetRootPath() + ResultFilePath; + if (!FFileHelper::LoadFileToArray(RawFileData, *ExternalFilePath)) + { + return NULL; + } + + + //Create T2D! + if (ImageWrapper.IsValid() && ImageWrapper->SetCompressed(RawFileData.GetData(), RawFileData.Num())) + { + const TArray* UncompressedBGRA = NULL; + if (ImageWrapper->GetRaw(ERGBFormat::BGRA, 8, UncompressedBGRA)) + { + Height = ImageWrapper->GetHeight(); + Width = ImageWrapper->GetWidth(); + LoadedTex = UTexture2D::CreateTransient(ImageWrapper->GetWidth(), ImageWrapper->GetHeight(), PF_B8G8R8A8); + + //Valid? + if (!LoadedTex) + { + return NULL; + } + + //Copy! + void* TextureData = LoadedTex->PlatformData->Mips[0].BulkData.Lock(LOCK_READ_WRITE); + FMemory::Memcpy(TextureData, UncompressedBGRA->GetData(), UncompressedBGRA->Num()); + LoadedTex->PlatformData->Mips[0].BulkData.Unlock(); + + //Update! + LoadedTex->UpdateResource(); + } + } + + // Success! + return LoadedTex; + + } + return NULL; + +} + +FString FMobileUtilsPlatform::GetRootPath() +{ + FString PathStr = ""; +#if PLATFORM_ANDROID + TArray Folders; + GExternalFilePath.ParseIntoArray(Folders, TEXT("/")); + for (FString Folder : Folders) + { + PathStr += FString("/.."); + } + +#endif + return PathStr; +} + + +// this is the start of developing a delegate system to elimnate the static global in GameActivity.java +extern "C" void Java_com_epicgames_ue4_GameActivity_nativeImageFilePath(jstring filepath) +{ + ImageFilePath = filepath; +} \ No newline at end of file diff --git a/Source/MobileUtils/Private/Android/MobileUtilsPlatform.h b/Source/MobileUtils/Private/Android/MobileUtilsPlatform.h index 2f4c480..064bef2 100644 --- a/Source/MobileUtils/Private/Android/MobileUtilsPlatform.h +++ b/Source/MobileUtils/Private/Android/MobileUtilsPlatform.h @@ -5,6 +5,7 @@ #pragma once #include "Interfaces/MobileUtilsInterface.h" +#include "Runtime/ImageWrapper/Public/Interfaces/IImageWrapperModule.h" #include "Android/AndroidJNI.h" #include "Android/AndroidApplication.h" #include @@ -18,9 +19,21 @@ class FMobileUtilsPlatform : public IMobileUtilsInterface virtual bool CheckInternetConnection() override; virtual bool CheckGooglePlayServices() override; virtual FString GetPersistentUniqueDeviceId() override; + virtual void SelectImage() override; + virtual FString GetImagePath() override; + UTexture2D* GetImgTexture(float& Height, float& Width) override; + FString GetRootPath(); + EImageFormat::Type GetImageType(FString InPath); // JNI Methods static jmethodID CheckInternetConnectionMethod; static jmethodID CheckGooglePlayServicesMethod; static jmethodID GetPersistentUniqueDeviceIdMethod; + static jmethodID SelectImageMethod; + static jmethodID GetImagePathMethod; + static jstring ImageFilePath; + + }; + +extern FString GExternalFilePath; \ No newline at end of file diff --git a/Source/MobileUtils/Private/MobileUtilsBlueprintLibrary.cpp b/Source/MobileUtils/Private/MobileUtilsBlueprintLibrary.cpp index 727c1e2..a2ec42b 100644 --- a/Source/MobileUtils/Private/MobileUtilsBlueprintLibrary.cpp +++ b/Source/MobileUtils/Private/MobileUtilsBlueprintLibrary.cpp @@ -38,3 +38,34 @@ FString UMobileUtilsBlueprintLibrary::GetPersistentUniqueDeviceId() return UKismetSystemLibrary::GetUniqueDeviceId(); #endif } + +// REMOVE BEFORE PULL REQUEST +// My stuff. + +void UMobileUtilsBlueprintLibrary::SelectImage() +{ +#if PLATFORM_ANDROID || PLATFORM_IOS + return IMobileUtils::Get().GetPlatformInterface()->SelectImage(); +#else + return; +#endif +} + +FString UMobileUtilsBlueprintLibrary::GetImagePath() +{ + #if PLATFORM_ANDROID || PLATFORM_IOS + return IMobileUtils::Get().GetPlatformInterface()->GetImagePath(); + #else + return FString(""); + #endif +} + +UTexture2D* UMobileUtilsBlueprintLibrary::GetImgTexture(float& Height, float& Width) +{ +#if PLATFORM_ANDROID || PLATFORM_IOS + return IMobileUtils::Get().GetPlatformInterface()->GetImgTexture(Height, Width); +#else + return NULL; +#endif +} + diff --git a/Source/MobileUtils/Private/MobileUtilsPrivatePCH.h b/Source/MobileUtils/Private/MobileUtilsPrivatePCH.h deleted file mode 100644 index 41fd398..0000000 --- a/Source/MobileUtils/Private/MobileUtilsPrivatePCH.h +++ /dev/null @@ -1,13 +0,0 @@ -// Mobile Utils Plugin -// Created by Patryk Stepniewski -// Copyright (c) 2014-2016 gameDNA studio. All Rights Reserved. - -#pragma once - -#include "CoreUObject.h" -#include "Engine.h" - -#include "IMobileUtils.h" -#include "MobileUtilsClasses.h" - -DECLARE_LOG_CATEGORY_EXTERN(LogMobileUtils, Log, All); diff --git a/Source/ThirdParty/Licenses/reachability.tps b/Source/ThirdParty/Licenses/reachability.tps new file mode 100644 index 0000000..2809baa --- /dev/null +++ b/Source/ThirdParty/Licenses/reachability.tps @@ -0,0 +1,61 @@ + + + Reachability + /MobileUtils/Source/ThirdParty/ + 2017-02-08T18:15:37.607266-04:00 + Provides Reachability library to use. + + Android + IOS + + + UE4 + + lib + https://developer.apple.com/library/content/samplecode/Reachability/Listings/LICENSE_txt.html#//apple_ref/doc/uid/DTS40007324-LICENSE_txt-DontLinkElementID_3 + + false + false + Full EULA Text + + IMPORTANT: This Apple software is supplied to you by Apple + Inc. ("Apple") in consideration of your agreement to the following + terms, and your use, installation, modification or redistribution of + this Apple software constitutes acceptance of these terms. If you do + not agree with these terms, please do not use, install, modify or + redistribute this Apple software. + + In consideration of your agreement to abide by the following terms, and + subject to these terms, Apple grants you a personal, non-exclusive + license, under Apple's copyrights in this original Apple software (the + "Apple Software"), to use, reproduce, modify and redistribute the Apple + Software, with or without modifications, in source and/or binary forms; + provided that if you redistribute the Apple Software in its entirety and + without modifications, you must retain this notice and the following + text and disclaimers in all such redistributions of the Apple Software. + Neither the name, trademarks, service marks or logos of Apple Inc. may + be used to endorse or promote products derived from the Apple Software + without specific prior written permission from Apple. Except as + expressly stated in this notice, no other rights or licenses, express or + implied, are granted by Apple herein, including but not limited to any + patent rights that may be infringed by your derivative works or by other + works in which the Apple Software may be incorporated. + + The Apple Software is provided by Apple on an "AS IS" basis. APPLE + MAKES NO WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION + THE IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS + FOR A PARTICULAR PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND + OPERATION ALONE OR IN COMBINATION WITH YOUR PRODUCTS. + + IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL + OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) ARISING IN ANY WAY OUT OF THE USE, REPRODUCTION, + MODIFICATION AND/OR DISTRIBUTION OF THE APPLE SOFTWARE, HOWEVER CAUSED + AND WHETHER UNDER THEORY OF CONTRACT, TORT (INCLUDING NEGLIGENCE), + STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN ADVISED OF THE + POSSIBILITY OF SUCH DAMAGE. + + Copyright (C) 2016 Apple Inc. All Rights Reserved. + + diff --git a/Source/ThirdParty/Licenses/sskeychain.tps b/Source/ThirdParty/Licenses/sskeychain.tps new file mode 100644 index 0000000..3085fce --- /dev/null +++ b/Source/ThirdParty/Licenses/sskeychain.tps @@ -0,0 +1,42 @@ + + + SSKeychain + /MobileUtils/Source/ThirdParty/ + 2017-02-08T18:15:37.607266-04:00 + Provides SSKeychain to use. + + IOS + Android + + + UE4 + + lib + https://github.com/samsoffes/sskeychain/blob/master/LICENSE + + false + false + Full EULA Text + + Copyright (c) 2010-2012 Sam Soffes. + + 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. + +