diff --git a/examples/AnalyticsCollection/AnalyticsCollection.jucer b/examples/AnalyticsCollection/AnalyticsCollection.jucer
new file mode 100644
index 0000000000..f44c74a169
--- /dev/null
+++ b/examples/AnalyticsCollection/AnalyticsCollection.jucer
@@ -0,0 +1,109 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/examples/AnalyticsCollection/Builds/Android/app/CMakeLists.txt b/examples/AnalyticsCollection/Builds/Android/app/CMakeLists.txt
new file mode 100644
index 0000000000..525b985c00
--- /dev/null
+++ b/examples/AnalyticsCollection/Builds/Android/app/CMakeLists.txt
@@ -0,0 +1,1535 @@
+# Automatically generated makefile, created by the Projucer
+# Don't edit this file! Your changes will be overwritten when you re-save the Projucer project!
+
+cmake_minimum_required(VERSION 3.4.1)
+
+SET(BINARY_NAME "juce_jni")
+
+add_library("cpufeatures" STATIC "${ANDROID_NDK}/sources/android/cpufeatures/cpu-features.c")
+set_source_files_properties("${ANDROID_NDK}/sources/android/cpufeatures/cpu-features.c" PROPERTIES COMPILE_FLAGS "-Wno-sign-conversion -Wno-gnu-statement-expression")
+
+add_definitions("-DJUCE_ANDROID=1" "-DJUCE_ANDROID_API_VERSION=10" "-DJUCE_ANDROID_ACTIVITY_CLASSNAME=com_yourcompany_analyticscollection_AnalyticsCollection" "-DJUCE_ANDROID_ACTIVITY_CLASSPATH=\"com/yourcompany/analyticscollection/AnalyticsCollection\"" "-DJUCE_PUSH_NOTIFICATIONS=1" "-DJUCER_ANDROIDSTUDIO_7F0E4A25=1" "-DJUCE_APP_VERSION=1.0.0" "-DJUCE_APP_VERSION_HEX=0x10000")
+
+include_directories( AFTER
+ "../../../JuceLibraryCode"
+ "../../../../../modules"
+ "${ANDROID_NDK}/sources/android/cpufeatures"
+)
+
+enable_language(ASM)
+
+IF(JUCE_BUILD_CONFIGFURATION MATCHES "DEBUG")
+ add_definitions("-DDEBUG=1" "-D_DEBUG=1")
+ELSEIF(JUCE_BUILD_CONFIGFURATION MATCHES "RELEASE")
+ add_definitions("-DNDEBUG=1")
+ELSE(JUCE_BUILD_CONFIGFURATION MATCHES "DEBUG")
+ MESSAGE( FATAL_ERROR "No matching build-configuration found." )
+ENDIF(JUCE_BUILD_CONFIGFURATION MATCHES "DEBUG")
+
+add_library( ${BINARY_NAME}
+
+ SHARED
+
+ "../../../Source/GoogleAnalyticsDestination.h"
+ "../../../Source/MainComponent.h"
+ "../../../Source/Main.cpp"
+ "../../../../../modules/juce_analytics/analytics/juce_Analytics.cpp"
+ "../../../../../modules/juce_analytics/analytics/juce_Analytics.h"
+ "../../../../../modules/juce_analytics/analytics/juce_ButtonTracker.cpp"
+ "../../../../../modules/juce_analytics/analytics/juce_ButtonTracker.h"
+ "../../../../../modules/juce_analytics/destinations/juce_AnalyticsDestination.h"
+ "../../../../../modules/juce_analytics/destinations/juce_ThreadedAnalyticsDestination.cpp"
+ "../../../../../modules/juce_analytics/destinations/juce_ThreadedAnalyticsDestination.h"
+ "../../../../../modules/juce_analytics/juce_analytics.cpp"
+ "../../../../../modules/juce_analytics/juce_analytics.h"
+ "../../../../../modules/juce_core/containers/juce_AbstractFifo.cpp"
+ "../../../../../modules/juce_core/containers/juce_AbstractFifo.h"
+ "../../../../../modules/juce_core/containers/juce_Array.h"
+ "../../../../../modules/juce_core/containers/juce_ArrayAllocationBase.h"
+ "../../../../../modules/juce_core/containers/juce_DynamicObject.cpp"
+ "../../../../../modules/juce_core/containers/juce_DynamicObject.h"
+ "../../../../../modules/juce_core/containers/juce_ElementComparator.h"
+ "../../../../../modules/juce_core/containers/juce_HashMap.h"
+ "../../../../../modules/juce_core/containers/juce_HashMap_test.cpp"
+ "../../../../../modules/juce_core/containers/juce_LinkedListPointer.h"
+ "../../../../../modules/juce_core/containers/juce_ListenerList.cpp"
+ "../../../../../modules/juce_core/containers/juce_ListenerList.h"
+ "../../../../../modules/juce_core/containers/juce_NamedValueSet.cpp"
+ "../../../../../modules/juce_core/containers/juce_NamedValueSet.h"
+ "../../../../../modules/juce_core/containers/juce_OwnedArray.h"
+ "../../../../../modules/juce_core/containers/juce_PropertySet.cpp"
+ "../../../../../modules/juce_core/containers/juce_PropertySet.h"
+ "../../../../../modules/juce_core/containers/juce_ReferenceCountedArray.h"
+ "../../../../../modules/juce_core/containers/juce_ScopedValueSetter.h"
+ "../../../../../modules/juce_core/containers/juce_SortedSet.h"
+ "../../../../../modules/juce_core/containers/juce_SparseSet.h"
+ "../../../../../modules/juce_core/containers/juce_Variant.cpp"
+ "../../../../../modules/juce_core/containers/juce_Variant.h"
+ "../../../../../modules/juce_core/files/juce_DirectoryIterator.cpp"
+ "../../../../../modules/juce_core/files/juce_DirectoryIterator.h"
+ "../../../../../modules/juce_core/files/juce_File.cpp"
+ "../../../../../modules/juce_core/files/juce_File.h"
+ "../../../../../modules/juce_core/files/juce_FileFilter.cpp"
+ "../../../../../modules/juce_core/files/juce_FileFilter.h"
+ "../../../../../modules/juce_core/files/juce_FileInputStream.cpp"
+ "../../../../../modules/juce_core/files/juce_FileInputStream.h"
+ "../../../../../modules/juce_core/files/juce_FileOutputStream.cpp"
+ "../../../../../modules/juce_core/files/juce_FileOutputStream.h"
+ "../../../../../modules/juce_core/files/juce_FileSearchPath.cpp"
+ "../../../../../modules/juce_core/files/juce_FileSearchPath.h"
+ "../../../../../modules/juce_core/files/juce_MemoryMappedFile.h"
+ "../../../../../modules/juce_core/files/juce_TemporaryFile.cpp"
+ "../../../../../modules/juce_core/files/juce_TemporaryFile.h"
+ "../../../../../modules/juce_core/files/juce_WildcardFileFilter.cpp"
+ "../../../../../modules/juce_core/files/juce_WildcardFileFilter.h"
+ "../../../../../modules/juce_core/javascript/juce_Javascript.cpp"
+ "../../../../../modules/juce_core/javascript/juce_Javascript.h"
+ "../../../../../modules/juce_core/javascript/juce_JSON.cpp"
+ "../../../../../modules/juce_core/javascript/juce_JSON.h"
+ "../../../../../modules/juce_core/logging/juce_FileLogger.cpp"
+ "../../../../../modules/juce_core/logging/juce_FileLogger.h"
+ "../../../../../modules/juce_core/logging/juce_Logger.cpp"
+ "../../../../../modules/juce_core/logging/juce_Logger.h"
+ "../../../../../modules/juce_core/maths/juce_BigInteger.cpp"
+ "../../../../../modules/juce_core/maths/juce_BigInteger.h"
+ "../../../../../modules/juce_core/maths/juce_Expression.cpp"
+ "../../../../../modules/juce_core/maths/juce_Expression.h"
+ "../../../../../modules/juce_core/maths/juce_MathsFunctions.h"
+ "../../../../../modules/juce_core/maths/juce_NormalisableRange.h"
+ "../../../../../modules/juce_core/maths/juce_Random.cpp"
+ "../../../../../modules/juce_core/maths/juce_Random.h"
+ "../../../../../modules/juce_core/maths/juce_Range.h"
+ "../../../../../modules/juce_core/maths/juce_StatisticsAccumulator.h"
+ "../../../../../modules/juce_core/memory/juce_Atomic.h"
+ "../../../../../modules/juce_core/memory/juce_ByteOrder.h"
+ "../../../../../modules/juce_core/memory/juce_ContainerDeletePolicy.h"
+ "../../../../../modules/juce_core/memory/juce_HeapBlock.h"
+ "../../../../../modules/juce_core/memory/juce_LeakedObjectDetector.h"
+ "../../../../../modules/juce_core/memory/juce_Memory.h"
+ "../../../../../modules/juce_core/memory/juce_MemoryBlock.cpp"
+ "../../../../../modules/juce_core/memory/juce_MemoryBlock.h"
+ "../../../../../modules/juce_core/memory/juce_OptionalScopedPointer.h"
+ "../../../../../modules/juce_core/memory/juce_ReferenceCountedObject.h"
+ "../../../../../modules/juce_core/memory/juce_ScopedPointer.h"
+ "../../../../../modules/juce_core/memory/juce_SharedResourcePointer.h"
+ "../../../../../modules/juce_core/memory/juce_Singleton.h"
+ "../../../../../modules/juce_core/memory/juce_WeakReference.h"
+ "../../../../../modules/juce_core/misc/juce_Result.cpp"
+ "../../../../../modules/juce_core/misc/juce_Result.h"
+ "../../../../../modules/juce_core/misc/juce_RuntimePermissions.cpp"
+ "../../../../../modules/juce_core/misc/juce_RuntimePermissions.h"
+ "../../../../../modules/juce_core/misc/juce_StdFunctionCompat.cpp"
+ "../../../../../modules/juce_core/misc/juce_StdFunctionCompat.h"
+ "../../../../../modules/juce_core/misc/juce_Uuid.cpp"
+ "../../../../../modules/juce_core/misc/juce_Uuid.h"
+ "../../../../../modules/juce_core/misc/juce_WindowsRegistry.h"
+ "../../../../../modules/juce_core/native/juce_android_Files.cpp"
+ "../../../../../modules/juce_core/native/juce_android_JNIHelpers.h"
+ "../../../../../modules/juce_core/native/juce_android_Misc.cpp"
+ "../../../../../modules/juce_core/native/juce_android_Network.cpp"
+ "../../../../../modules/juce_core/native/juce_android_RuntimePermissions.cpp"
+ "../../../../../modules/juce_core/native/juce_android_SystemStats.cpp"
+ "../../../../../modules/juce_core/native/juce_android_Threads.cpp"
+ "../../../../../modules/juce_core/native/juce_BasicNativeHeaders.h"
+ "../../../../../modules/juce_core/native/juce_curl_Network.cpp"
+ "../../../../../modules/juce_core/native/juce_linux_CommonFile.cpp"
+ "../../../../../modules/juce_core/native/juce_linux_Files.cpp"
+ "../../../../../modules/juce_core/native/juce_linux_Network.cpp"
+ "../../../../../modules/juce_core/native/juce_linux_SystemStats.cpp"
+ "../../../../../modules/juce_core/native/juce_linux_Threads.cpp"
+ "../../../../../modules/juce_core/native/juce_mac_ClangBugWorkaround.h"
+ "../../../../../modules/juce_core/native/juce_mac_Files.mm"
+ "../../../../../modules/juce_core/native/juce_mac_Network.mm"
+ "../../../../../modules/juce_core/native/juce_mac_Strings.mm"
+ "../../../../../modules/juce_core/native/juce_mac_SystemStats.mm"
+ "../../../../../modules/juce_core/native/juce_mac_Threads.mm"
+ "../../../../../modules/juce_core/native/juce_osx_ObjCHelpers.h"
+ "../../../../../modules/juce_core/native/juce_posix_NamedPipe.cpp"
+ "../../../../../modules/juce_core/native/juce_posix_SharedCode.h"
+ "../../../../../modules/juce_core/native/juce_win32_ComSmartPtr.h"
+ "../../../../../modules/juce_core/native/juce_win32_Files.cpp"
+ "../../../../../modules/juce_core/native/juce_win32_Network.cpp"
+ "../../../../../modules/juce_core/native/juce_win32_Registry.cpp"
+ "../../../../../modules/juce_core/native/juce_win32_SystemStats.cpp"
+ "../../../../../modules/juce_core/native/juce_win32_Threads.cpp"
+ "../../../../../modules/juce_core/network/juce_IPAddress.cpp"
+ "../../../../../modules/juce_core/network/juce_IPAddress.h"
+ "../../../../../modules/juce_core/network/juce_MACAddress.cpp"
+ "../../../../../modules/juce_core/network/juce_MACAddress.h"
+ "../../../../../modules/juce_core/network/juce_NamedPipe.cpp"
+ "../../../../../modules/juce_core/network/juce_NamedPipe.h"
+ "../../../../../modules/juce_core/network/juce_Socket.cpp"
+ "../../../../../modules/juce_core/network/juce_Socket.h"
+ "../../../../../modules/juce_core/network/juce_URL.cpp"
+ "../../../../../modules/juce_core/network/juce_URL.h"
+ "../../../../../modules/juce_core/network/juce_WebInputStream.cpp"
+ "../../../../../modules/juce_core/network/juce_WebInputStream.h"
+ "../../../../../modules/juce_core/streams/juce_BufferedInputStream.cpp"
+ "../../../../../modules/juce_core/streams/juce_BufferedInputStream.h"
+ "../../../../../modules/juce_core/streams/juce_FileInputSource.cpp"
+ "../../../../../modules/juce_core/streams/juce_FileInputSource.h"
+ "../../../../../modules/juce_core/streams/juce_InputSource.h"
+ "../../../../../modules/juce_core/streams/juce_InputStream.cpp"
+ "../../../../../modules/juce_core/streams/juce_InputStream.h"
+ "../../../../../modules/juce_core/streams/juce_MemoryInputStream.cpp"
+ "../../../../../modules/juce_core/streams/juce_MemoryInputStream.h"
+ "../../../../../modules/juce_core/streams/juce_MemoryOutputStream.cpp"
+ "../../../../../modules/juce_core/streams/juce_MemoryOutputStream.h"
+ "../../../../../modules/juce_core/streams/juce_OutputStream.cpp"
+ "../../../../../modules/juce_core/streams/juce_OutputStream.h"
+ "../../../../../modules/juce_core/streams/juce_SubregionStream.cpp"
+ "../../../../../modules/juce_core/streams/juce_SubregionStream.h"
+ "../../../../../modules/juce_core/system/juce_CompilerSupport.h"
+ "../../../../../modules/juce_core/system/juce_PlatformDefs.h"
+ "../../../../../modules/juce_core/system/juce_StandardHeader.h"
+ "../../../../../modules/juce_core/system/juce_SystemStats.cpp"
+ "../../../../../modules/juce_core/system/juce_SystemStats.h"
+ "../../../../../modules/juce_core/system/juce_TargetPlatform.h"
+ "../../../../../modules/juce_core/text/juce_Base64.cpp"
+ "../../../../../modules/juce_core/text/juce_Base64.h"
+ "../../../../../modules/juce_core/text/juce_CharacterFunctions.cpp"
+ "../../../../../modules/juce_core/text/juce_CharacterFunctions.h"
+ "../../../../../modules/juce_core/text/juce_CharPointer_ASCII.h"
+ "../../../../../modules/juce_core/text/juce_CharPointer_UTF8.h"
+ "../../../../../modules/juce_core/text/juce_CharPointer_UTF16.h"
+ "../../../../../modules/juce_core/text/juce_CharPointer_UTF32.h"
+ "../../../../../modules/juce_core/text/juce_Identifier.cpp"
+ "../../../../../modules/juce_core/text/juce_Identifier.h"
+ "../../../../../modules/juce_core/text/juce_LocalisedStrings.cpp"
+ "../../../../../modules/juce_core/text/juce_LocalisedStrings.h"
+ "../../../../../modules/juce_core/text/juce_NewLine.h"
+ "../../../../../modules/juce_core/text/juce_String.cpp"
+ "../../../../../modules/juce_core/text/juce_String.h"
+ "../../../../../modules/juce_core/text/juce_StringArray.cpp"
+ "../../../../../modules/juce_core/text/juce_StringArray.h"
+ "../../../../../modules/juce_core/text/juce_StringPairArray.cpp"
+ "../../../../../modules/juce_core/text/juce_StringPairArray.h"
+ "../../../../../modules/juce_core/text/juce_StringPool.cpp"
+ "../../../../../modules/juce_core/text/juce_StringPool.h"
+ "../../../../../modules/juce_core/text/juce_StringRef.h"
+ "../../../../../modules/juce_core/text/juce_TextDiff.cpp"
+ "../../../../../modules/juce_core/text/juce_TextDiff.h"
+ "../../../../../modules/juce_core/threads/juce_ChildProcess.cpp"
+ "../../../../../modules/juce_core/threads/juce_ChildProcess.h"
+ "../../../../../modules/juce_core/threads/juce_CriticalSection.h"
+ "../../../../../modules/juce_core/threads/juce_DynamicLibrary.h"
+ "../../../../../modules/juce_core/threads/juce_HighResolutionTimer.cpp"
+ "../../../../../modules/juce_core/threads/juce_HighResolutionTimer.h"
+ "../../../../../modules/juce_core/threads/juce_InterProcessLock.h"
+ "../../../../../modules/juce_core/threads/juce_Process.h"
+ "../../../../../modules/juce_core/threads/juce_ReadWriteLock.cpp"
+ "../../../../../modules/juce_core/threads/juce_ReadWriteLock.h"
+ "../../../../../modules/juce_core/threads/juce_ScopedLock.h"
+ "../../../../../modules/juce_core/threads/juce_ScopedReadLock.h"
+ "../../../../../modules/juce_core/threads/juce_ScopedWriteLock.h"
+ "../../../../../modules/juce_core/threads/juce_SpinLock.h"
+ "../../../../../modules/juce_core/threads/juce_Thread.cpp"
+ "../../../../../modules/juce_core/threads/juce_Thread.h"
+ "../../../../../modules/juce_core/threads/juce_ThreadLocalValue.h"
+ "../../../../../modules/juce_core/threads/juce_ThreadPool.cpp"
+ "../../../../../modules/juce_core/threads/juce_ThreadPool.h"
+ "../../../../../modules/juce_core/threads/juce_TimeSliceThread.cpp"
+ "../../../../../modules/juce_core/threads/juce_TimeSliceThread.h"
+ "../../../../../modules/juce_core/threads/juce_WaitableEvent.h"
+ "../../../../../modules/juce_core/time/juce_PerformanceCounter.cpp"
+ "../../../../../modules/juce_core/time/juce_PerformanceCounter.h"
+ "../../../../../modules/juce_core/time/juce_RelativeTime.cpp"
+ "../../../../../modules/juce_core/time/juce_RelativeTime.h"
+ "../../../../../modules/juce_core/time/juce_Time.cpp"
+ "../../../../../modules/juce_core/time/juce_Time.h"
+ "../../../../../modules/juce_core/unit_tests/juce_UnitTest.cpp"
+ "../../../../../modules/juce_core/unit_tests/juce_UnitTest.h"
+ "../../../../../modules/juce_core/xml/juce_XmlDocument.cpp"
+ "../../../../../modules/juce_core/xml/juce_XmlDocument.h"
+ "../../../../../modules/juce_core/xml/juce_XmlElement.cpp"
+ "../../../../../modules/juce_core/xml/juce_XmlElement.h"
+ "../../../../../modules/juce_core/zip/zlib/adler32.c"
+ "../../../../../modules/juce_core/zip/zlib/compress.c"
+ "../../../../../modules/juce_core/zip/zlib/crc32.c"
+ "../../../../../modules/juce_core/zip/zlib/crc32.h"
+ "../../../../../modules/juce_core/zip/zlib/deflate.c"
+ "../../../../../modules/juce_core/zip/zlib/deflate.h"
+ "../../../../../modules/juce_core/zip/zlib/infback.c"
+ "../../../../../modules/juce_core/zip/zlib/inffast.c"
+ "../../../../../modules/juce_core/zip/zlib/inffast.h"
+ "../../../../../modules/juce_core/zip/zlib/inffixed.h"
+ "../../../../../modules/juce_core/zip/zlib/inflate.c"
+ "../../../../../modules/juce_core/zip/zlib/inflate.h"
+ "../../../../../modules/juce_core/zip/zlib/inftrees.c"
+ "../../../../../modules/juce_core/zip/zlib/inftrees.h"
+ "../../../../../modules/juce_core/zip/zlib/trees.c"
+ "../../../../../modules/juce_core/zip/zlib/trees.h"
+ "../../../../../modules/juce_core/zip/zlib/uncompr.c"
+ "../../../../../modules/juce_core/zip/zlib/zconf.h"
+ "../../../../../modules/juce_core/zip/zlib/zconf.in.h"
+ "../../../../../modules/juce_core/zip/zlib/zlib.h"
+ "../../../../../modules/juce_core/zip/zlib/zutil.c"
+ "../../../../../modules/juce_core/zip/zlib/zutil.h"
+ "../../../../../modules/juce_core/zip/juce_GZIPCompressorOutputStream.cpp"
+ "../../../../../modules/juce_core/zip/juce_GZIPCompressorOutputStream.h"
+ "../../../../../modules/juce_core/zip/juce_GZIPDecompressorInputStream.cpp"
+ "../../../../../modules/juce_core/zip/juce_GZIPDecompressorInputStream.h"
+ "../../../../../modules/juce_core/zip/juce_ZipFile.cpp"
+ "../../../../../modules/juce_core/zip/juce_ZipFile.h"
+ "../../../../../modules/juce_core/juce_core.cpp"
+ "../../../../../modules/juce_core/juce_core.mm"
+ "../../../../../modules/juce_core/juce_core.h"
+ "../../../../../modules/juce_data_structures/app_properties/juce_ApplicationProperties.cpp"
+ "../../../../../modules/juce_data_structures/app_properties/juce_ApplicationProperties.h"
+ "../../../../../modules/juce_data_structures/app_properties/juce_PropertiesFile.cpp"
+ "../../../../../modules/juce_data_structures/app_properties/juce_PropertiesFile.h"
+ "../../../../../modules/juce_data_structures/undomanager/juce_UndoableAction.h"
+ "../../../../../modules/juce_data_structures/undomanager/juce_UndoManager.cpp"
+ "../../../../../modules/juce_data_structures/undomanager/juce_UndoManager.h"
+ "../../../../../modules/juce_data_structures/values/juce_CachedValue.cpp"
+ "../../../../../modules/juce_data_structures/values/juce_CachedValue.h"
+ "../../../../../modules/juce_data_structures/values/juce_Value.cpp"
+ "../../../../../modules/juce_data_structures/values/juce_Value.h"
+ "../../../../../modules/juce_data_structures/values/juce_ValueTree.cpp"
+ "../../../../../modules/juce_data_structures/values/juce_ValueTree.h"
+ "../../../../../modules/juce_data_structures/values/juce_ValueTreeSynchroniser.cpp"
+ "../../../../../modules/juce_data_structures/values/juce_ValueTreeSynchroniser.h"
+ "../../../../../modules/juce_data_structures/juce_data_structures.cpp"
+ "../../../../../modules/juce_data_structures/juce_data_structures.mm"
+ "../../../../../modules/juce_data_structures/juce_data_structures.h"
+ "../../../../../modules/juce_events/broadcasters/juce_ActionBroadcaster.cpp"
+ "../../../../../modules/juce_events/broadcasters/juce_ActionBroadcaster.h"
+ "../../../../../modules/juce_events/broadcasters/juce_ActionListener.h"
+ "../../../../../modules/juce_events/broadcasters/juce_AsyncUpdater.cpp"
+ "../../../../../modules/juce_events/broadcasters/juce_AsyncUpdater.h"
+ "../../../../../modules/juce_events/broadcasters/juce_ChangeBroadcaster.cpp"
+ "../../../../../modules/juce_events/broadcasters/juce_ChangeBroadcaster.h"
+ "../../../../../modules/juce_events/broadcasters/juce_ChangeListener.h"
+ "../../../../../modules/juce_events/interprocess/juce_ConnectedChildProcess.cpp"
+ "../../../../../modules/juce_events/interprocess/juce_ConnectedChildProcess.h"
+ "../../../../../modules/juce_events/interprocess/juce_InterprocessConnection.cpp"
+ "../../../../../modules/juce_events/interprocess/juce_InterprocessConnection.h"
+ "../../../../../modules/juce_events/interprocess/juce_InterprocessConnectionServer.cpp"
+ "../../../../../modules/juce_events/interprocess/juce_InterprocessConnectionServer.h"
+ "../../../../../modules/juce_events/messages/juce_ApplicationBase.cpp"
+ "../../../../../modules/juce_events/messages/juce_ApplicationBase.h"
+ "../../../../../modules/juce_events/messages/juce_CallbackMessage.h"
+ "../../../../../modules/juce_events/messages/juce_DeletedAtShutdown.cpp"
+ "../../../../../modules/juce_events/messages/juce_DeletedAtShutdown.h"
+ "../../../../../modules/juce_events/messages/juce_Initialisation.h"
+ "../../../../../modules/juce_events/messages/juce_Message.h"
+ "../../../../../modules/juce_events/messages/juce_MessageListener.cpp"
+ "../../../../../modules/juce_events/messages/juce_MessageListener.h"
+ "../../../../../modules/juce_events/messages/juce_MessageManager.cpp"
+ "../../../../../modules/juce_events/messages/juce_MessageManager.h"
+ "../../../../../modules/juce_events/messages/juce_MountedVolumeListChangeDetector.h"
+ "../../../../../modules/juce_events/messages/juce_NotificationType.h"
+ "../../../../../modules/juce_events/native/juce_android_Messaging.cpp"
+ "../../../../../modules/juce_events/native/juce_ios_MessageManager.mm"
+ "../../../../../modules/juce_events/native/juce_linux_EventLoop.h"
+ "../../../../../modules/juce_events/native/juce_linux_Messaging.cpp"
+ "../../../../../modules/juce_events/native/juce_mac_MessageManager.mm"
+ "../../../../../modules/juce_events/native/juce_osx_MessageQueue.h"
+ "../../../../../modules/juce_events/native/juce_win32_HiddenMessageWindow.h"
+ "../../../../../modules/juce_events/native/juce_win32_Messaging.cpp"
+ "../../../../../modules/juce_events/native/juce_win32_WinRTWrapper.cpp"
+ "../../../../../modules/juce_events/native/juce_win32_WinRTWrapper.h"
+ "../../../../../modules/juce_events/timers/juce_MultiTimer.cpp"
+ "../../../../../modules/juce_events/timers/juce_MultiTimer.h"
+ "../../../../../modules/juce_events/timers/juce_Timer.cpp"
+ "../../../../../modules/juce_events/timers/juce_Timer.h"
+ "../../../../../modules/juce_events/juce_events.cpp"
+ "../../../../../modules/juce_events/juce_events.mm"
+ "../../../../../modules/juce_events/juce_events.h"
+ "../../../../../modules/juce_graphics/colour/juce_Colour.cpp"
+ "../../../../../modules/juce_graphics/colour/juce_Colour.h"
+ "../../../../../modules/juce_graphics/colour/juce_ColourGradient.cpp"
+ "../../../../../modules/juce_graphics/colour/juce_ColourGradient.h"
+ "../../../../../modules/juce_graphics/colour/juce_Colours.cpp"
+ "../../../../../modules/juce_graphics/colour/juce_Colours.h"
+ "../../../../../modules/juce_graphics/colour/juce_FillType.cpp"
+ "../../../../../modules/juce_graphics/colour/juce_FillType.h"
+ "../../../../../modules/juce_graphics/colour/juce_PixelFormats.h"
+ "../../../../../modules/juce_graphics/contexts/juce_GraphicsContext.cpp"
+ "../../../../../modules/juce_graphics/contexts/juce_GraphicsContext.h"
+ "../../../../../modules/juce_graphics/contexts/juce_LowLevelGraphicsContext.h"
+ "../../../../../modules/juce_graphics/contexts/juce_LowLevelGraphicsPostScriptRenderer.cpp"
+ "../../../../../modules/juce_graphics/contexts/juce_LowLevelGraphicsPostScriptRenderer.h"
+ "../../../../../modules/juce_graphics/contexts/juce_LowLevelGraphicsSoftwareRenderer.cpp"
+ "../../../../../modules/juce_graphics/contexts/juce_LowLevelGraphicsSoftwareRenderer.h"
+ "../../../../../modules/juce_graphics/effects/juce_DropShadowEffect.cpp"
+ "../../../../../modules/juce_graphics/effects/juce_DropShadowEffect.h"
+ "../../../../../modules/juce_graphics/effects/juce_GlowEffect.cpp"
+ "../../../../../modules/juce_graphics/effects/juce_GlowEffect.h"
+ "../../../../../modules/juce_graphics/effects/juce_ImageEffectFilter.h"
+ "../../../../../modules/juce_graphics/fonts/juce_AttributedString.cpp"
+ "../../../../../modules/juce_graphics/fonts/juce_AttributedString.h"
+ "../../../../../modules/juce_graphics/fonts/juce_CustomTypeface.cpp"
+ "../../../../../modules/juce_graphics/fonts/juce_CustomTypeface.h"
+ "../../../../../modules/juce_graphics/fonts/juce_Font.cpp"
+ "../../../../../modules/juce_graphics/fonts/juce_Font.h"
+ "../../../../../modules/juce_graphics/fonts/juce_GlyphArrangement.cpp"
+ "../../../../../modules/juce_graphics/fonts/juce_GlyphArrangement.h"
+ "../../../../../modules/juce_graphics/fonts/juce_TextLayout.cpp"
+ "../../../../../modules/juce_graphics/fonts/juce_TextLayout.h"
+ "../../../../../modules/juce_graphics/fonts/juce_Typeface.cpp"
+ "../../../../../modules/juce_graphics/fonts/juce_Typeface.h"
+ "../../../../../modules/juce_graphics/geometry/juce_AffineTransform.cpp"
+ "../../../../../modules/juce_graphics/geometry/juce_AffineTransform.h"
+ "../../../../../modules/juce_graphics/geometry/juce_BorderSize.h"
+ "../../../../../modules/juce_graphics/geometry/juce_EdgeTable.cpp"
+ "../../../../../modules/juce_graphics/geometry/juce_EdgeTable.h"
+ "../../../../../modules/juce_graphics/geometry/juce_Line.h"
+ "../../../../../modules/juce_graphics/geometry/juce_Path.cpp"
+ "../../../../../modules/juce_graphics/geometry/juce_Path.h"
+ "../../../../../modules/juce_graphics/geometry/juce_PathIterator.cpp"
+ "../../../../../modules/juce_graphics/geometry/juce_PathIterator.h"
+ "../../../../../modules/juce_graphics/geometry/juce_PathStrokeType.cpp"
+ "../../../../../modules/juce_graphics/geometry/juce_PathStrokeType.h"
+ "../../../../../modules/juce_graphics/geometry/juce_Point.h"
+ "../../../../../modules/juce_graphics/geometry/juce_Rectangle.h"
+ "../../../../../modules/juce_graphics/geometry/juce_RectangleList.h"
+ "../../../../../modules/juce_graphics/image_formats/jpglib/cderror.h"
+ "../../../../../modules/juce_graphics/image_formats/jpglib/changes to libjpeg for JUCE.txt"
+ "../../../../../modules/juce_graphics/image_formats/jpglib/jcapimin.c"
+ "../../../../../modules/juce_graphics/image_formats/jpglib/jcapistd.c"
+ "../../../../../modules/juce_graphics/image_formats/jpglib/jccoefct.c"
+ "../../../../../modules/juce_graphics/image_formats/jpglib/jccolor.c"
+ "../../../../../modules/juce_graphics/image_formats/jpglib/jcdctmgr.c"
+ "../../../../../modules/juce_graphics/image_formats/jpglib/jchuff.c"
+ "../../../../../modules/juce_graphics/image_formats/jpglib/jchuff.h"
+ "../../../../../modules/juce_graphics/image_formats/jpglib/jcinit.c"
+ "../../../../../modules/juce_graphics/image_formats/jpglib/jcmainct.c"
+ "../../../../../modules/juce_graphics/image_formats/jpglib/jcmarker.c"
+ "../../../../../modules/juce_graphics/image_formats/jpglib/jcmaster.c"
+ "../../../../../modules/juce_graphics/image_formats/jpglib/jcomapi.c"
+ "../../../../../modules/juce_graphics/image_formats/jpglib/jconfig.h"
+ "../../../../../modules/juce_graphics/image_formats/jpglib/jcparam.c"
+ "../../../../../modules/juce_graphics/image_formats/jpglib/jcphuff.c"
+ "../../../../../modules/juce_graphics/image_formats/jpglib/jcprepct.c"
+ "../../../../../modules/juce_graphics/image_formats/jpglib/jcsample.c"
+ "../../../../../modules/juce_graphics/image_formats/jpglib/jctrans.c"
+ "../../../../../modules/juce_graphics/image_formats/jpglib/jdapimin.c"
+ "../../../../../modules/juce_graphics/image_formats/jpglib/jdapistd.c"
+ "../../../../../modules/juce_graphics/image_formats/jpglib/jdatasrc.c"
+ "../../../../../modules/juce_graphics/image_formats/jpglib/jdcoefct.c"
+ "../../../../../modules/juce_graphics/image_formats/jpglib/jdcolor.c"
+ "../../../../../modules/juce_graphics/image_formats/jpglib/jdct.h"
+ "../../../../../modules/juce_graphics/image_formats/jpglib/jddctmgr.c"
+ "../../../../../modules/juce_graphics/image_formats/jpglib/jdhuff.c"
+ "../../../../../modules/juce_graphics/image_formats/jpglib/jdhuff.h"
+ "../../../../../modules/juce_graphics/image_formats/jpglib/jdinput.c"
+ "../../../../../modules/juce_graphics/image_formats/jpglib/jdmainct.c"
+ "../../../../../modules/juce_graphics/image_formats/jpglib/jdmarker.c"
+ "../../../../../modules/juce_graphics/image_formats/jpglib/jdmaster.c"
+ "../../../../../modules/juce_graphics/image_formats/jpglib/jdmerge.c"
+ "../../../../../modules/juce_graphics/image_formats/jpglib/jdphuff.c"
+ "../../../../../modules/juce_graphics/image_formats/jpglib/jdpostct.c"
+ "../../../../../modules/juce_graphics/image_formats/jpglib/jdsample.c"
+ "../../../../../modules/juce_graphics/image_formats/jpglib/jdtrans.c"
+ "../../../../../modules/juce_graphics/image_formats/jpglib/jerror.c"
+ "../../../../../modules/juce_graphics/image_formats/jpglib/jerror.h"
+ "../../../../../modules/juce_graphics/image_formats/jpglib/jfdctflt.c"
+ "../../../../../modules/juce_graphics/image_formats/jpglib/jfdctfst.c"
+ "../../../../../modules/juce_graphics/image_formats/jpglib/jfdctint.c"
+ "../../../../../modules/juce_graphics/image_formats/jpglib/jidctflt.c"
+ "../../../../../modules/juce_graphics/image_formats/jpglib/jidctfst.c"
+ "../../../../../modules/juce_graphics/image_formats/jpglib/jidctint.c"
+ "../../../../../modules/juce_graphics/image_formats/jpglib/jidctred.c"
+ "../../../../../modules/juce_graphics/image_formats/jpglib/jinclude.h"
+ "../../../../../modules/juce_graphics/image_formats/jpglib/jmemmgr.c"
+ "../../../../../modules/juce_graphics/image_formats/jpglib/jmemnobs.c"
+ "../../../../../modules/juce_graphics/image_formats/jpglib/jmemsys.h"
+ "../../../../../modules/juce_graphics/image_formats/jpglib/jmorecfg.h"
+ "../../../../../modules/juce_graphics/image_formats/jpglib/jpegint.h"
+ "../../../../../modules/juce_graphics/image_formats/jpglib/jpeglib.h"
+ "../../../../../modules/juce_graphics/image_formats/jpglib/jquant1.c"
+ "../../../../../modules/juce_graphics/image_formats/jpglib/jquant2.c"
+ "../../../../../modules/juce_graphics/image_formats/jpglib/jutils.c"
+ "../../../../../modules/juce_graphics/image_formats/jpglib/jversion.h"
+ "../../../../../modules/juce_graphics/image_formats/jpglib/transupp.c"
+ "../../../../../modules/juce_graphics/image_formats/jpglib/transupp.h"
+ "../../../../../modules/juce_graphics/image_formats/pnglib/libpng_readme.txt"
+ "../../../../../modules/juce_graphics/image_formats/pnglib/png.c"
+ "../../../../../modules/juce_graphics/image_formats/pnglib/png.h"
+ "../../../../../modules/juce_graphics/image_formats/pnglib/pngconf.h"
+ "../../../../../modules/juce_graphics/image_formats/pnglib/pngerror.c"
+ "../../../../../modules/juce_graphics/image_formats/pnglib/pngget.c"
+ "../../../../../modules/juce_graphics/image_formats/pnglib/pnginfo.h"
+ "../../../../../modules/juce_graphics/image_formats/pnglib/pngmem.c"
+ "../../../../../modules/juce_graphics/image_formats/pnglib/pngpread.c"
+ "../../../../../modules/juce_graphics/image_formats/pnglib/pngpriv.h"
+ "../../../../../modules/juce_graphics/image_formats/pnglib/pngread.c"
+ "../../../../../modules/juce_graphics/image_formats/pnglib/pngrio.c"
+ "../../../../../modules/juce_graphics/image_formats/pnglib/pngrtran.c"
+ "../../../../../modules/juce_graphics/image_formats/pnglib/pngrutil.c"
+ "../../../../../modules/juce_graphics/image_formats/pnglib/pngset.c"
+ "../../../../../modules/juce_graphics/image_formats/pnglib/pngstruct.h"
+ "../../../../../modules/juce_graphics/image_formats/pnglib/pngtrans.c"
+ "../../../../../modules/juce_graphics/image_formats/pnglib/pngwio.c"
+ "../../../../../modules/juce_graphics/image_formats/pnglib/pngwrite.c"
+ "../../../../../modules/juce_graphics/image_formats/pnglib/pngwtran.c"
+ "../../../../../modules/juce_graphics/image_formats/pnglib/pngwutil.c"
+ "../../../../../modules/juce_graphics/image_formats/juce_GIFLoader.cpp"
+ "../../../../../modules/juce_graphics/image_formats/juce_JPEGLoader.cpp"
+ "../../../../../modules/juce_graphics/image_formats/juce_PNGLoader.cpp"
+ "../../../../../modules/juce_graphics/images/juce_Image.cpp"
+ "../../../../../modules/juce_graphics/images/juce_Image.h"
+ "../../../../../modules/juce_graphics/images/juce_ImageCache.cpp"
+ "../../../../../modules/juce_graphics/images/juce_ImageCache.h"
+ "../../../../../modules/juce_graphics/images/juce_ImageConvolutionKernel.cpp"
+ "../../../../../modules/juce_graphics/images/juce_ImageConvolutionKernel.h"
+ "../../../../../modules/juce_graphics/images/juce_ImageFileFormat.cpp"
+ "../../../../../modules/juce_graphics/images/juce_ImageFileFormat.h"
+ "../../../../../modules/juce_graphics/native/juce_android_Fonts.cpp"
+ "../../../../../modules/juce_graphics/native/juce_android_GraphicsContext.cpp"
+ "../../../../../modules/juce_graphics/native/juce_android_IconHelpers.cpp"
+ "../../../../../modules/juce_graphics/native/juce_freetype_Fonts.cpp"
+ "../../../../../modules/juce_graphics/native/juce_linux_Fonts.cpp"
+ "../../../../../modules/juce_graphics/native/juce_linux_IconHelpers.cpp"
+ "../../../../../modules/juce_graphics/native/juce_mac_CoreGraphicsContext.h"
+ "../../../../../modules/juce_graphics/native/juce_mac_CoreGraphicsContext.mm"
+ "../../../../../modules/juce_graphics/native/juce_mac_CoreGraphicsHelpers.h"
+ "../../../../../modules/juce_graphics/native/juce_mac_Fonts.mm"
+ "../../../../../modules/juce_graphics/native/juce_mac_IconHelpers.cpp"
+ "../../../../../modules/juce_graphics/native/juce_RenderingHelpers.h"
+ "../../../../../modules/juce_graphics/native/juce_win32_Direct2DGraphicsContext.cpp"
+ "../../../../../modules/juce_graphics/native/juce_win32_Direct2DGraphicsContext.h"
+ "../../../../../modules/juce_graphics/native/juce_win32_DirectWriteTypeface.cpp"
+ "../../../../../modules/juce_graphics/native/juce_win32_DirectWriteTypeLayout.cpp"
+ "../../../../../modules/juce_graphics/native/juce_win32_Fonts.cpp"
+ "../../../../../modules/juce_graphics/native/juce_win32_IconHelpers.cpp"
+ "../../../../../modules/juce_graphics/placement/juce_Justification.h"
+ "../../../../../modules/juce_graphics/placement/juce_RectanglePlacement.cpp"
+ "../../../../../modules/juce_graphics/placement/juce_RectanglePlacement.h"
+ "../../../../../modules/juce_graphics/juce_graphics.cpp"
+ "../../../../../modules/juce_graphics/juce_graphics.mm"
+ "../../../../../modules/juce_graphics/juce_graphics.h"
+ "../../../../../modules/juce_gui_basics/application/juce_Application.cpp"
+ "../../../../../modules/juce_gui_basics/application/juce_Application.h"
+ "../../../../../modules/juce_gui_basics/buttons/juce_ArrowButton.cpp"
+ "../../../../../modules/juce_gui_basics/buttons/juce_ArrowButton.h"
+ "../../../../../modules/juce_gui_basics/buttons/juce_Button.cpp"
+ "../../../../../modules/juce_gui_basics/buttons/juce_Button.h"
+ "../../../../../modules/juce_gui_basics/buttons/juce_DrawableButton.cpp"
+ "../../../../../modules/juce_gui_basics/buttons/juce_DrawableButton.h"
+ "../../../../../modules/juce_gui_basics/buttons/juce_HyperlinkButton.cpp"
+ "../../../../../modules/juce_gui_basics/buttons/juce_HyperlinkButton.h"
+ "../../../../../modules/juce_gui_basics/buttons/juce_ImageButton.cpp"
+ "../../../../../modules/juce_gui_basics/buttons/juce_ImageButton.h"
+ "../../../../../modules/juce_gui_basics/buttons/juce_ShapeButton.cpp"
+ "../../../../../modules/juce_gui_basics/buttons/juce_ShapeButton.h"
+ "../../../../../modules/juce_gui_basics/buttons/juce_TextButton.cpp"
+ "../../../../../modules/juce_gui_basics/buttons/juce_TextButton.h"
+ "../../../../../modules/juce_gui_basics/buttons/juce_ToggleButton.cpp"
+ "../../../../../modules/juce_gui_basics/buttons/juce_ToggleButton.h"
+ "../../../../../modules/juce_gui_basics/buttons/juce_ToolbarButton.cpp"
+ "../../../../../modules/juce_gui_basics/buttons/juce_ToolbarButton.h"
+ "../../../../../modules/juce_gui_basics/commands/juce_ApplicationCommandID.h"
+ "../../../../../modules/juce_gui_basics/commands/juce_ApplicationCommandInfo.cpp"
+ "../../../../../modules/juce_gui_basics/commands/juce_ApplicationCommandInfo.h"
+ "../../../../../modules/juce_gui_basics/commands/juce_ApplicationCommandManager.cpp"
+ "../../../../../modules/juce_gui_basics/commands/juce_ApplicationCommandManager.h"
+ "../../../../../modules/juce_gui_basics/commands/juce_ApplicationCommandTarget.cpp"
+ "../../../../../modules/juce_gui_basics/commands/juce_ApplicationCommandTarget.h"
+ "../../../../../modules/juce_gui_basics/commands/juce_KeyPressMappingSet.cpp"
+ "../../../../../modules/juce_gui_basics/commands/juce_KeyPressMappingSet.h"
+ "../../../../../modules/juce_gui_basics/components/juce_CachedComponentImage.h"
+ "../../../../../modules/juce_gui_basics/components/juce_Component.cpp"
+ "../../../../../modules/juce_gui_basics/components/juce_Component.h"
+ "../../../../../modules/juce_gui_basics/components/juce_ComponentListener.cpp"
+ "../../../../../modules/juce_gui_basics/components/juce_ComponentListener.h"
+ "../../../../../modules/juce_gui_basics/components/juce_Desktop.cpp"
+ "../../../../../modules/juce_gui_basics/components/juce_Desktop.h"
+ "../../../../../modules/juce_gui_basics/components/juce_ModalComponentManager.cpp"
+ "../../../../../modules/juce_gui_basics/components/juce_ModalComponentManager.h"
+ "../../../../../modules/juce_gui_basics/drawables/juce_Drawable.cpp"
+ "../../../../../modules/juce_gui_basics/drawables/juce_Drawable.h"
+ "../../../../../modules/juce_gui_basics/drawables/juce_DrawableComposite.cpp"
+ "../../../../../modules/juce_gui_basics/drawables/juce_DrawableComposite.h"
+ "../../../../../modules/juce_gui_basics/drawables/juce_DrawableImage.cpp"
+ "../../../../../modules/juce_gui_basics/drawables/juce_DrawableImage.h"
+ "../../../../../modules/juce_gui_basics/drawables/juce_DrawablePath.cpp"
+ "../../../../../modules/juce_gui_basics/drawables/juce_DrawablePath.h"
+ "../../../../../modules/juce_gui_basics/drawables/juce_DrawableRectangle.cpp"
+ "../../../../../modules/juce_gui_basics/drawables/juce_DrawableRectangle.h"
+ "../../../../../modules/juce_gui_basics/drawables/juce_DrawableShape.cpp"
+ "../../../../../modules/juce_gui_basics/drawables/juce_DrawableShape.h"
+ "../../../../../modules/juce_gui_basics/drawables/juce_DrawableText.cpp"
+ "../../../../../modules/juce_gui_basics/drawables/juce_DrawableText.h"
+ "../../../../../modules/juce_gui_basics/drawables/juce_SVGParser.cpp"
+ "../../../../../modules/juce_gui_basics/filebrowser/juce_DirectoryContentsDisplayComponent.cpp"
+ "../../../../../modules/juce_gui_basics/filebrowser/juce_DirectoryContentsDisplayComponent.h"
+ "../../../../../modules/juce_gui_basics/filebrowser/juce_DirectoryContentsList.cpp"
+ "../../../../../modules/juce_gui_basics/filebrowser/juce_DirectoryContentsList.h"
+ "../../../../../modules/juce_gui_basics/filebrowser/juce_FileBrowserComponent.cpp"
+ "../../../../../modules/juce_gui_basics/filebrowser/juce_FileBrowserComponent.h"
+ "../../../../../modules/juce_gui_basics/filebrowser/juce_FileBrowserListener.h"
+ "../../../../../modules/juce_gui_basics/filebrowser/juce_FileChooser.cpp"
+ "../../../../../modules/juce_gui_basics/filebrowser/juce_FileChooser.h"
+ "../../../../../modules/juce_gui_basics/filebrowser/juce_FileChooserDialogBox.cpp"
+ "../../../../../modules/juce_gui_basics/filebrowser/juce_FileChooserDialogBox.h"
+ "../../../../../modules/juce_gui_basics/filebrowser/juce_FileListComponent.cpp"
+ "../../../../../modules/juce_gui_basics/filebrowser/juce_FileListComponent.h"
+ "../../../../../modules/juce_gui_basics/filebrowser/juce_FilenameComponent.cpp"
+ "../../../../../modules/juce_gui_basics/filebrowser/juce_FilenameComponent.h"
+ "../../../../../modules/juce_gui_basics/filebrowser/juce_FilePreviewComponent.h"
+ "../../../../../modules/juce_gui_basics/filebrowser/juce_FileSearchPathListComponent.cpp"
+ "../../../../../modules/juce_gui_basics/filebrowser/juce_FileSearchPathListComponent.h"
+ "../../../../../modules/juce_gui_basics/filebrowser/juce_FileTreeComponent.cpp"
+ "../../../../../modules/juce_gui_basics/filebrowser/juce_FileTreeComponent.h"
+ "../../../../../modules/juce_gui_basics/filebrowser/juce_ImagePreviewComponent.cpp"
+ "../../../../../modules/juce_gui_basics/filebrowser/juce_ImagePreviewComponent.h"
+ "../../../../../modules/juce_gui_basics/keyboard/juce_CaretComponent.cpp"
+ "../../../../../modules/juce_gui_basics/keyboard/juce_CaretComponent.h"
+ "../../../../../modules/juce_gui_basics/keyboard/juce_KeyboardFocusTraverser.cpp"
+ "../../../../../modules/juce_gui_basics/keyboard/juce_KeyboardFocusTraverser.h"
+ "../../../../../modules/juce_gui_basics/keyboard/juce_KeyListener.cpp"
+ "../../../../../modules/juce_gui_basics/keyboard/juce_KeyListener.h"
+ "../../../../../modules/juce_gui_basics/keyboard/juce_KeyPress.cpp"
+ "../../../../../modules/juce_gui_basics/keyboard/juce_KeyPress.h"
+ "../../../../../modules/juce_gui_basics/keyboard/juce_ModifierKeys.cpp"
+ "../../../../../modules/juce_gui_basics/keyboard/juce_ModifierKeys.h"
+ "../../../../../modules/juce_gui_basics/keyboard/juce_SystemClipboard.h"
+ "../../../../../modules/juce_gui_basics/keyboard/juce_TextEditorKeyMapper.h"
+ "../../../../../modules/juce_gui_basics/keyboard/juce_TextInputTarget.h"
+ "../../../../../modules/juce_gui_basics/layout/juce_AnimatedPosition.h"
+ "../../../../../modules/juce_gui_basics/layout/juce_AnimatedPositionBehaviours.h"
+ "../../../../../modules/juce_gui_basics/layout/juce_ComponentAnimator.cpp"
+ "../../../../../modules/juce_gui_basics/layout/juce_ComponentAnimator.h"
+ "../../../../../modules/juce_gui_basics/layout/juce_ComponentBoundsConstrainer.cpp"
+ "../../../../../modules/juce_gui_basics/layout/juce_ComponentBoundsConstrainer.h"
+ "../../../../../modules/juce_gui_basics/layout/juce_ComponentBuilder.cpp"
+ "../../../../../modules/juce_gui_basics/layout/juce_ComponentBuilder.h"
+ "../../../../../modules/juce_gui_basics/layout/juce_ComponentMovementWatcher.cpp"
+ "../../../../../modules/juce_gui_basics/layout/juce_ComponentMovementWatcher.h"
+ "../../../../../modules/juce_gui_basics/layout/juce_ConcertinaPanel.cpp"
+ "../../../../../modules/juce_gui_basics/layout/juce_ConcertinaPanel.h"
+ "../../../../../modules/juce_gui_basics/layout/juce_FlexBox.cpp"
+ "../../../../../modules/juce_gui_basics/layout/juce_FlexBox.h"
+ "../../../../../modules/juce_gui_basics/layout/juce_FlexItem.h"
+ "../../../../../modules/juce_gui_basics/layout/juce_Grid.cpp"
+ "../../../../../modules/juce_gui_basics/layout/juce_Grid.h"
+ "../../../../../modules/juce_gui_basics/layout/juce_GridItem.cpp"
+ "../../../../../modules/juce_gui_basics/layout/juce_GridItem.h"
+ "../../../../../modules/juce_gui_basics/layout/juce_GridUnitTests.cpp"
+ "../../../../../modules/juce_gui_basics/layout/juce_GroupComponent.cpp"
+ "../../../../../modules/juce_gui_basics/layout/juce_GroupComponent.h"
+ "../../../../../modules/juce_gui_basics/layout/juce_MultiDocumentPanel.cpp"
+ "../../../../../modules/juce_gui_basics/layout/juce_MultiDocumentPanel.h"
+ "../../../../../modules/juce_gui_basics/layout/juce_ResizableBorderComponent.cpp"
+ "../../../../../modules/juce_gui_basics/layout/juce_ResizableBorderComponent.h"
+ "../../../../../modules/juce_gui_basics/layout/juce_ResizableCornerComponent.cpp"
+ "../../../../../modules/juce_gui_basics/layout/juce_ResizableCornerComponent.h"
+ "../../../../../modules/juce_gui_basics/layout/juce_ResizableEdgeComponent.cpp"
+ "../../../../../modules/juce_gui_basics/layout/juce_ResizableEdgeComponent.h"
+ "../../../../../modules/juce_gui_basics/layout/juce_ScrollBar.cpp"
+ "../../../../../modules/juce_gui_basics/layout/juce_ScrollBar.h"
+ "../../../../../modules/juce_gui_basics/layout/juce_StretchableLayoutManager.cpp"
+ "../../../../../modules/juce_gui_basics/layout/juce_StretchableLayoutManager.h"
+ "../../../../../modules/juce_gui_basics/layout/juce_StretchableLayoutResizerBar.cpp"
+ "../../../../../modules/juce_gui_basics/layout/juce_StretchableLayoutResizerBar.h"
+ "../../../../../modules/juce_gui_basics/layout/juce_StretchableObjectResizer.cpp"
+ "../../../../../modules/juce_gui_basics/layout/juce_StretchableObjectResizer.h"
+ "../../../../../modules/juce_gui_basics/layout/juce_TabbedButtonBar.cpp"
+ "../../../../../modules/juce_gui_basics/layout/juce_TabbedButtonBar.h"
+ "../../../../../modules/juce_gui_basics/layout/juce_TabbedComponent.cpp"
+ "../../../../../modules/juce_gui_basics/layout/juce_TabbedComponent.h"
+ "../../../../../modules/juce_gui_basics/layout/juce_Viewport.cpp"
+ "../../../../../modules/juce_gui_basics/layout/juce_Viewport.h"
+ "../../../../../modules/juce_gui_basics/lookandfeel/juce_LookAndFeel.cpp"
+ "../../../../../modules/juce_gui_basics/lookandfeel/juce_LookAndFeel.h"
+ "../../../../../modules/juce_gui_basics/lookandfeel/juce_LookAndFeel_V1.cpp"
+ "../../../../../modules/juce_gui_basics/lookandfeel/juce_LookAndFeel_V1.h"
+ "../../../../../modules/juce_gui_basics/lookandfeel/juce_LookAndFeel_V2.cpp"
+ "../../../../../modules/juce_gui_basics/lookandfeel/juce_LookAndFeel_V2.h"
+ "../../../../../modules/juce_gui_basics/lookandfeel/juce_LookAndFeel_V3.cpp"
+ "../../../../../modules/juce_gui_basics/lookandfeel/juce_LookAndFeel_V3.h"
+ "../../../../../modules/juce_gui_basics/lookandfeel/juce_LookAndFeel_V4.cpp"
+ "../../../../../modules/juce_gui_basics/lookandfeel/juce_LookAndFeel_V4.h"
+ "../../../../../modules/juce_gui_basics/menus/juce_MenuBarComponent.cpp"
+ "../../../../../modules/juce_gui_basics/menus/juce_MenuBarComponent.h"
+ "../../../../../modules/juce_gui_basics/menus/juce_MenuBarModel.cpp"
+ "../../../../../modules/juce_gui_basics/menus/juce_MenuBarModel.h"
+ "../../../../../modules/juce_gui_basics/menus/juce_PopupMenu.cpp"
+ "../../../../../modules/juce_gui_basics/menus/juce_PopupMenu.h"
+ "../../../../../modules/juce_gui_basics/misc/juce_BubbleComponent.cpp"
+ "../../../../../modules/juce_gui_basics/misc/juce_BubbleComponent.h"
+ "../../../../../modules/juce_gui_basics/misc/juce_DropShadower.cpp"
+ "../../../../../modules/juce_gui_basics/misc/juce_DropShadower.h"
+ "../../../../../modules/juce_gui_basics/misc/juce_JUCESplashScreen.cpp"
+ "../../../../../modules/juce_gui_basics/misc/juce_JUCESplashScreen.h"
+ "../../../../../modules/juce_gui_basics/mouse/juce_ComponentDragger.cpp"
+ "../../../../../modules/juce_gui_basics/mouse/juce_ComponentDragger.h"
+ "../../../../../modules/juce_gui_basics/mouse/juce_DragAndDropContainer.cpp"
+ "../../../../../modules/juce_gui_basics/mouse/juce_DragAndDropContainer.h"
+ "../../../../../modules/juce_gui_basics/mouse/juce_DragAndDropTarget.h"
+ "../../../../../modules/juce_gui_basics/mouse/juce_FileDragAndDropTarget.h"
+ "../../../../../modules/juce_gui_basics/mouse/juce_LassoComponent.h"
+ "../../../../../modules/juce_gui_basics/mouse/juce_MouseCursor.cpp"
+ "../../../../../modules/juce_gui_basics/mouse/juce_MouseCursor.h"
+ "../../../../../modules/juce_gui_basics/mouse/juce_MouseEvent.cpp"
+ "../../../../../modules/juce_gui_basics/mouse/juce_MouseEvent.h"
+ "../../../../../modules/juce_gui_basics/mouse/juce_MouseInactivityDetector.cpp"
+ "../../../../../modules/juce_gui_basics/mouse/juce_MouseInactivityDetector.h"
+ "../../../../../modules/juce_gui_basics/mouse/juce_MouseInputSource.cpp"
+ "../../../../../modules/juce_gui_basics/mouse/juce_MouseInputSource.h"
+ "../../../../../modules/juce_gui_basics/mouse/juce_MouseListener.cpp"
+ "../../../../../modules/juce_gui_basics/mouse/juce_MouseListener.h"
+ "../../../../../modules/juce_gui_basics/mouse/juce_SelectedItemSet.h"
+ "../../../../../modules/juce_gui_basics/mouse/juce_TextDragAndDropTarget.h"
+ "../../../../../modules/juce_gui_basics/mouse/juce_TooltipClient.h"
+ "../../../../../modules/juce_gui_basics/native/juce_android_FileChooser.cpp"
+ "../../../../../modules/juce_gui_basics/native/juce_android_Windowing.cpp"
+ "../../../../../modules/juce_gui_basics/native/juce_ios_UIViewComponentPeer.mm"
+ "../../../../../modules/juce_gui_basics/native/juce_ios_Windowing.mm"
+ "../../../../../modules/juce_gui_basics/native/juce_linux_FileChooser.cpp"
+ "../../../../../modules/juce_gui_basics/native/juce_linux_X11.cpp"
+ "../../../../../modules/juce_gui_basics/native/juce_linux_X11.h"
+ "../../../../../modules/juce_gui_basics/native/juce_linux_X11_Clipboard.cpp"
+ "../../../../../modules/juce_gui_basics/native/juce_linux_X11_Windowing.cpp"
+ "../../../../../modules/juce_gui_basics/native/juce_mac_FileChooser.mm"
+ "../../../../../modules/juce_gui_basics/native/juce_mac_MainMenu.mm"
+ "../../../../../modules/juce_gui_basics/native/juce_mac_MouseCursor.mm"
+ "../../../../../modules/juce_gui_basics/native/juce_mac_NSViewComponentPeer.mm"
+ "../../../../../modules/juce_gui_basics/native/juce_mac_Windowing.mm"
+ "../../../../../modules/juce_gui_basics/native/juce_MultiTouchMapper.h"
+ "../../../../../modules/juce_gui_basics/native/juce_win32_DragAndDrop.cpp"
+ "../../../../../modules/juce_gui_basics/native/juce_win32_FileChooser.cpp"
+ "../../../../../modules/juce_gui_basics/native/juce_win32_Windowing.cpp"
+ "../../../../../modules/juce_gui_basics/positioning/juce_MarkerList.cpp"
+ "../../../../../modules/juce_gui_basics/positioning/juce_MarkerList.h"
+ "../../../../../modules/juce_gui_basics/positioning/juce_RelativeCoordinate.cpp"
+ "../../../../../modules/juce_gui_basics/positioning/juce_RelativeCoordinate.h"
+ "../../../../../modules/juce_gui_basics/positioning/juce_RelativeCoordinatePositioner.cpp"
+ "../../../../../modules/juce_gui_basics/positioning/juce_RelativeCoordinatePositioner.h"
+ "../../../../../modules/juce_gui_basics/positioning/juce_RelativeParallelogram.cpp"
+ "../../../../../modules/juce_gui_basics/positioning/juce_RelativeParallelogram.h"
+ "../../../../../modules/juce_gui_basics/positioning/juce_RelativePoint.cpp"
+ "../../../../../modules/juce_gui_basics/positioning/juce_RelativePoint.h"
+ "../../../../../modules/juce_gui_basics/positioning/juce_RelativePointPath.cpp"
+ "../../../../../modules/juce_gui_basics/positioning/juce_RelativePointPath.h"
+ "../../../../../modules/juce_gui_basics/positioning/juce_RelativeRectangle.cpp"
+ "../../../../../modules/juce_gui_basics/positioning/juce_RelativeRectangle.h"
+ "../../../../../modules/juce_gui_basics/properties/juce_BooleanPropertyComponent.cpp"
+ "../../../../../modules/juce_gui_basics/properties/juce_BooleanPropertyComponent.h"
+ "../../../../../modules/juce_gui_basics/properties/juce_ButtonPropertyComponent.cpp"
+ "../../../../../modules/juce_gui_basics/properties/juce_ButtonPropertyComponent.h"
+ "../../../../../modules/juce_gui_basics/properties/juce_ChoicePropertyComponent.cpp"
+ "../../../../../modules/juce_gui_basics/properties/juce_ChoicePropertyComponent.h"
+ "../../../../../modules/juce_gui_basics/properties/juce_PropertyComponent.cpp"
+ "../../../../../modules/juce_gui_basics/properties/juce_PropertyComponent.h"
+ "../../../../../modules/juce_gui_basics/properties/juce_PropertyPanel.cpp"
+ "../../../../../modules/juce_gui_basics/properties/juce_PropertyPanel.h"
+ "../../../../../modules/juce_gui_basics/properties/juce_SliderPropertyComponent.cpp"
+ "../../../../../modules/juce_gui_basics/properties/juce_SliderPropertyComponent.h"
+ "../../../../../modules/juce_gui_basics/properties/juce_TextPropertyComponent.cpp"
+ "../../../../../modules/juce_gui_basics/properties/juce_TextPropertyComponent.h"
+ "../../../../../modules/juce_gui_basics/widgets/juce_ComboBox.cpp"
+ "../../../../../modules/juce_gui_basics/widgets/juce_ComboBox.h"
+ "../../../../../modules/juce_gui_basics/widgets/juce_ImageComponent.cpp"
+ "../../../../../modules/juce_gui_basics/widgets/juce_ImageComponent.h"
+ "../../../../../modules/juce_gui_basics/widgets/juce_Label.cpp"
+ "../../../../../modules/juce_gui_basics/widgets/juce_Label.h"
+ "../../../../../modules/juce_gui_basics/widgets/juce_ListBox.cpp"
+ "../../../../../modules/juce_gui_basics/widgets/juce_ListBox.h"
+ "../../../../../modules/juce_gui_basics/widgets/juce_ProgressBar.cpp"
+ "../../../../../modules/juce_gui_basics/widgets/juce_ProgressBar.h"
+ "../../../../../modules/juce_gui_basics/widgets/juce_Slider.cpp"
+ "../../../../../modules/juce_gui_basics/widgets/juce_Slider.h"
+ "../../../../../modules/juce_gui_basics/widgets/juce_TableHeaderComponent.cpp"
+ "../../../../../modules/juce_gui_basics/widgets/juce_TableHeaderComponent.h"
+ "../../../../../modules/juce_gui_basics/widgets/juce_TableListBox.cpp"
+ "../../../../../modules/juce_gui_basics/widgets/juce_TableListBox.h"
+ "../../../../../modules/juce_gui_basics/widgets/juce_TextEditor.cpp"
+ "../../../../../modules/juce_gui_basics/widgets/juce_TextEditor.h"
+ "../../../../../modules/juce_gui_basics/widgets/juce_Toolbar.cpp"
+ "../../../../../modules/juce_gui_basics/widgets/juce_Toolbar.h"
+ "../../../../../modules/juce_gui_basics/widgets/juce_ToolbarItemComponent.cpp"
+ "../../../../../modules/juce_gui_basics/widgets/juce_ToolbarItemComponent.h"
+ "../../../../../modules/juce_gui_basics/widgets/juce_ToolbarItemFactory.h"
+ "../../../../../modules/juce_gui_basics/widgets/juce_ToolbarItemPalette.cpp"
+ "../../../../../modules/juce_gui_basics/widgets/juce_ToolbarItemPalette.h"
+ "../../../../../modules/juce_gui_basics/widgets/juce_TreeView.cpp"
+ "../../../../../modules/juce_gui_basics/widgets/juce_TreeView.h"
+ "../../../../../modules/juce_gui_basics/windows/juce_AlertWindow.cpp"
+ "../../../../../modules/juce_gui_basics/windows/juce_AlertWindow.h"
+ "../../../../../modules/juce_gui_basics/windows/juce_CallOutBox.cpp"
+ "../../../../../modules/juce_gui_basics/windows/juce_CallOutBox.h"
+ "../../../../../modules/juce_gui_basics/windows/juce_ComponentPeer.cpp"
+ "../../../../../modules/juce_gui_basics/windows/juce_ComponentPeer.h"
+ "../../../../../modules/juce_gui_basics/windows/juce_DialogWindow.cpp"
+ "../../../../../modules/juce_gui_basics/windows/juce_DialogWindow.h"
+ "../../../../../modules/juce_gui_basics/windows/juce_DocumentWindow.cpp"
+ "../../../../../modules/juce_gui_basics/windows/juce_DocumentWindow.h"
+ "../../../../../modules/juce_gui_basics/windows/juce_NativeMessageBox.h"
+ "../../../../../modules/juce_gui_basics/windows/juce_ResizableWindow.cpp"
+ "../../../../../modules/juce_gui_basics/windows/juce_ResizableWindow.h"
+ "../../../../../modules/juce_gui_basics/windows/juce_ThreadWithProgressWindow.cpp"
+ "../../../../../modules/juce_gui_basics/windows/juce_ThreadWithProgressWindow.h"
+ "../../../../../modules/juce_gui_basics/windows/juce_TooltipWindow.cpp"
+ "../../../../../modules/juce_gui_basics/windows/juce_TooltipWindow.h"
+ "../../../../../modules/juce_gui_basics/windows/juce_TopLevelWindow.cpp"
+ "../../../../../modules/juce_gui_basics/windows/juce_TopLevelWindow.h"
+ "../../../../../modules/juce_gui_basics/juce_gui_basics.cpp"
+ "../../../../../modules/juce_gui_basics/juce_gui_basics.mm"
+ "../../../../../modules/juce_gui_basics/juce_gui_basics.h"
+ "../../../JuceLibraryCode/AppConfig.h"
+ "../../../JuceLibraryCode/include_juce_analytics.cpp"
+ "../../../JuceLibraryCode/include_juce_core.cpp"
+ "../../../JuceLibraryCode/include_juce_data_structures.cpp"
+ "../../../JuceLibraryCode/include_juce_events.cpp"
+ "../../../JuceLibraryCode/include_juce_graphics.cpp"
+ "../../../JuceLibraryCode/include_juce_gui_basics.cpp"
+ "../../../JuceLibraryCode/JuceHeader.h"
+)
+
+set_source_files_properties("../../../Source/GoogleAnalyticsDestination.h" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../Source/MainComponent.h" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_analytics/analytics/juce_Analytics.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_analytics/analytics/juce_Analytics.h" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_analytics/analytics/juce_ButtonTracker.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_analytics/analytics/juce_ButtonTracker.h" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_analytics/destinations/juce_AnalyticsDestination.h" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_analytics/destinations/juce_ThreadedAnalyticsDestination.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_analytics/destinations/juce_ThreadedAnalyticsDestination.h" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_analytics/juce_analytics.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_analytics/juce_analytics.h" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_core/containers/juce_AbstractFifo.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_core/containers/juce_AbstractFifo.h" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_core/containers/juce_Array.h" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_core/containers/juce_ArrayAllocationBase.h" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_core/containers/juce_DynamicObject.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_core/containers/juce_DynamicObject.h" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_core/containers/juce_ElementComparator.h" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_core/containers/juce_HashMap.h" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_core/containers/juce_HashMap_test.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_core/containers/juce_LinkedListPointer.h" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_core/containers/juce_ListenerList.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_core/containers/juce_ListenerList.h" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_core/containers/juce_NamedValueSet.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_core/containers/juce_NamedValueSet.h" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_core/containers/juce_OwnedArray.h" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_core/containers/juce_PropertySet.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_core/containers/juce_PropertySet.h" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_core/containers/juce_ReferenceCountedArray.h" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_core/containers/juce_ScopedValueSetter.h" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_core/containers/juce_SortedSet.h" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_core/containers/juce_SparseSet.h" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_core/containers/juce_Variant.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_core/containers/juce_Variant.h" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_core/files/juce_DirectoryIterator.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_core/files/juce_DirectoryIterator.h" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_core/files/juce_File.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_core/files/juce_File.h" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_core/files/juce_FileFilter.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_core/files/juce_FileFilter.h" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_core/files/juce_FileInputStream.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_core/files/juce_FileInputStream.h" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_core/files/juce_FileOutputStream.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_core/files/juce_FileOutputStream.h" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_core/files/juce_FileSearchPath.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_core/files/juce_FileSearchPath.h" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_core/files/juce_MemoryMappedFile.h" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_core/files/juce_TemporaryFile.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_core/files/juce_TemporaryFile.h" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_core/files/juce_WildcardFileFilter.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_core/files/juce_WildcardFileFilter.h" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_core/javascript/juce_Javascript.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_core/javascript/juce_Javascript.h" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_core/javascript/juce_JSON.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_core/javascript/juce_JSON.h" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_core/logging/juce_FileLogger.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_core/logging/juce_FileLogger.h" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_core/logging/juce_Logger.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_core/logging/juce_Logger.h" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_core/maths/juce_BigInteger.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_core/maths/juce_BigInteger.h" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_core/maths/juce_Expression.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_core/maths/juce_Expression.h" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_core/maths/juce_MathsFunctions.h" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_core/maths/juce_NormalisableRange.h" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_core/maths/juce_Random.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_core/maths/juce_Random.h" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_core/maths/juce_Range.h" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_core/maths/juce_StatisticsAccumulator.h" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_core/memory/juce_Atomic.h" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_core/memory/juce_ByteOrder.h" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_core/memory/juce_ContainerDeletePolicy.h" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_core/memory/juce_HeapBlock.h" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_core/memory/juce_LeakedObjectDetector.h" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_core/memory/juce_Memory.h" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_core/memory/juce_MemoryBlock.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_core/memory/juce_MemoryBlock.h" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_core/memory/juce_OptionalScopedPointer.h" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_core/memory/juce_ReferenceCountedObject.h" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_core/memory/juce_ScopedPointer.h" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_core/memory/juce_SharedResourcePointer.h" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_core/memory/juce_Singleton.h" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_core/memory/juce_WeakReference.h" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_core/misc/juce_Result.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_core/misc/juce_Result.h" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_core/misc/juce_RuntimePermissions.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_core/misc/juce_RuntimePermissions.h" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_core/misc/juce_StdFunctionCompat.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_core/misc/juce_StdFunctionCompat.h" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_core/misc/juce_Uuid.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_core/misc/juce_Uuid.h" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_core/misc/juce_WindowsRegistry.h" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_core/native/juce_android_Files.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_core/native/juce_android_JNIHelpers.h" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_core/native/juce_android_Misc.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_core/native/juce_android_Network.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_core/native/juce_android_RuntimePermissions.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_core/native/juce_android_SystemStats.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_core/native/juce_android_Threads.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_core/native/juce_BasicNativeHeaders.h" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_core/native/juce_curl_Network.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_core/native/juce_linux_CommonFile.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_core/native/juce_linux_Files.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_core/native/juce_linux_Network.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_core/native/juce_linux_SystemStats.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_core/native/juce_linux_Threads.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_core/native/juce_mac_ClangBugWorkaround.h" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_core/native/juce_mac_Files.mm" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_core/native/juce_mac_Network.mm" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_core/native/juce_mac_Strings.mm" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_core/native/juce_mac_SystemStats.mm" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_core/native/juce_mac_Threads.mm" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_core/native/juce_osx_ObjCHelpers.h" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_core/native/juce_posix_NamedPipe.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_core/native/juce_posix_SharedCode.h" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_core/native/juce_win32_ComSmartPtr.h" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_core/native/juce_win32_Files.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_core/native/juce_win32_Network.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_core/native/juce_win32_Registry.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_core/native/juce_win32_SystemStats.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_core/native/juce_win32_Threads.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_core/network/juce_IPAddress.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_core/network/juce_IPAddress.h" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_core/network/juce_MACAddress.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_core/network/juce_MACAddress.h" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_core/network/juce_NamedPipe.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_core/network/juce_NamedPipe.h" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_core/network/juce_Socket.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_core/network/juce_Socket.h" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_core/network/juce_URL.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_core/network/juce_URL.h" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_core/network/juce_WebInputStream.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_core/network/juce_WebInputStream.h" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_core/streams/juce_BufferedInputStream.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_core/streams/juce_BufferedInputStream.h" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_core/streams/juce_FileInputSource.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_core/streams/juce_FileInputSource.h" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_core/streams/juce_InputSource.h" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_core/streams/juce_InputStream.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_core/streams/juce_InputStream.h" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_core/streams/juce_MemoryInputStream.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_core/streams/juce_MemoryInputStream.h" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_core/streams/juce_MemoryOutputStream.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_core/streams/juce_MemoryOutputStream.h" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_core/streams/juce_OutputStream.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_core/streams/juce_OutputStream.h" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_core/streams/juce_SubregionStream.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_core/streams/juce_SubregionStream.h" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_core/system/juce_CompilerSupport.h" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_core/system/juce_PlatformDefs.h" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_core/system/juce_StandardHeader.h" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_core/system/juce_SystemStats.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_core/system/juce_SystemStats.h" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_core/system/juce_TargetPlatform.h" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_core/text/juce_Base64.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_core/text/juce_Base64.h" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_core/text/juce_CharacterFunctions.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_core/text/juce_CharacterFunctions.h" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_core/text/juce_CharPointer_ASCII.h" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_core/text/juce_CharPointer_UTF8.h" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_core/text/juce_CharPointer_UTF16.h" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_core/text/juce_CharPointer_UTF32.h" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_core/text/juce_Identifier.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_core/text/juce_Identifier.h" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_core/text/juce_LocalisedStrings.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_core/text/juce_LocalisedStrings.h" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_core/text/juce_NewLine.h" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_core/text/juce_String.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_core/text/juce_String.h" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_core/text/juce_StringArray.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_core/text/juce_StringArray.h" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_core/text/juce_StringPairArray.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_core/text/juce_StringPairArray.h" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_core/text/juce_StringPool.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_core/text/juce_StringPool.h" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_core/text/juce_StringRef.h" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_core/text/juce_TextDiff.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_core/text/juce_TextDiff.h" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_core/threads/juce_ChildProcess.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_core/threads/juce_ChildProcess.h" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_core/threads/juce_CriticalSection.h" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_core/threads/juce_DynamicLibrary.h" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_core/threads/juce_HighResolutionTimer.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_core/threads/juce_HighResolutionTimer.h" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_core/threads/juce_InterProcessLock.h" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_core/threads/juce_Process.h" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_core/threads/juce_ReadWriteLock.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_core/threads/juce_ReadWriteLock.h" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_core/threads/juce_ScopedLock.h" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_core/threads/juce_ScopedReadLock.h" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_core/threads/juce_ScopedWriteLock.h" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_core/threads/juce_SpinLock.h" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_core/threads/juce_Thread.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_core/threads/juce_Thread.h" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_core/threads/juce_ThreadLocalValue.h" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_core/threads/juce_ThreadPool.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_core/threads/juce_ThreadPool.h" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_core/threads/juce_TimeSliceThread.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_core/threads/juce_TimeSliceThread.h" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_core/threads/juce_WaitableEvent.h" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_core/time/juce_PerformanceCounter.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_core/time/juce_PerformanceCounter.h" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_core/time/juce_RelativeTime.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_core/time/juce_RelativeTime.h" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_core/time/juce_Time.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_core/time/juce_Time.h" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_core/unit_tests/juce_UnitTest.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_core/unit_tests/juce_UnitTest.h" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_core/xml/juce_XmlDocument.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_core/xml/juce_XmlDocument.h" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_core/xml/juce_XmlElement.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_core/xml/juce_XmlElement.h" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_core/zip/zlib/adler32.c" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_core/zip/zlib/compress.c" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_core/zip/zlib/crc32.c" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_core/zip/zlib/crc32.h" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_core/zip/zlib/deflate.c" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_core/zip/zlib/deflate.h" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_core/zip/zlib/infback.c" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_core/zip/zlib/inffast.c" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_core/zip/zlib/inffast.h" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_core/zip/zlib/inffixed.h" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_core/zip/zlib/inflate.c" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_core/zip/zlib/inflate.h" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_core/zip/zlib/inftrees.c" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_core/zip/zlib/inftrees.h" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_core/zip/zlib/trees.c" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_core/zip/zlib/trees.h" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_core/zip/zlib/uncompr.c" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_core/zip/zlib/zconf.h" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_core/zip/zlib/zconf.in.h" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_core/zip/zlib/zlib.h" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_core/zip/zlib/zutil.c" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_core/zip/zlib/zutil.h" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_core/zip/juce_GZIPCompressorOutputStream.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_core/zip/juce_GZIPCompressorOutputStream.h" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_core/zip/juce_GZIPDecompressorInputStream.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_core/zip/juce_GZIPDecompressorInputStream.h" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_core/zip/juce_ZipFile.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_core/zip/juce_ZipFile.h" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_core/juce_core.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_core/juce_core.mm" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_core/juce_core.h" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_data_structures/app_properties/juce_ApplicationProperties.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_data_structures/app_properties/juce_ApplicationProperties.h" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_data_structures/app_properties/juce_PropertiesFile.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_data_structures/app_properties/juce_PropertiesFile.h" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_data_structures/undomanager/juce_UndoableAction.h" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_data_structures/undomanager/juce_UndoManager.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_data_structures/undomanager/juce_UndoManager.h" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_data_structures/values/juce_CachedValue.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_data_structures/values/juce_CachedValue.h" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_data_structures/values/juce_Value.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_data_structures/values/juce_Value.h" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_data_structures/values/juce_ValueTree.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_data_structures/values/juce_ValueTree.h" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_data_structures/values/juce_ValueTreeSynchroniser.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_data_structures/values/juce_ValueTreeSynchroniser.h" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_data_structures/juce_data_structures.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_data_structures/juce_data_structures.mm" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_data_structures/juce_data_structures.h" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_events/broadcasters/juce_ActionBroadcaster.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_events/broadcasters/juce_ActionBroadcaster.h" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_events/broadcasters/juce_ActionListener.h" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_events/broadcasters/juce_AsyncUpdater.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_events/broadcasters/juce_AsyncUpdater.h" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_events/broadcasters/juce_ChangeBroadcaster.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_events/broadcasters/juce_ChangeBroadcaster.h" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_events/broadcasters/juce_ChangeListener.h" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_events/interprocess/juce_ConnectedChildProcess.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_events/interprocess/juce_ConnectedChildProcess.h" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_events/interprocess/juce_InterprocessConnection.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_events/interprocess/juce_InterprocessConnection.h" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_events/interprocess/juce_InterprocessConnectionServer.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_events/interprocess/juce_InterprocessConnectionServer.h" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_events/messages/juce_ApplicationBase.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_events/messages/juce_ApplicationBase.h" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_events/messages/juce_CallbackMessage.h" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_events/messages/juce_DeletedAtShutdown.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_events/messages/juce_DeletedAtShutdown.h" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_events/messages/juce_Initialisation.h" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_events/messages/juce_Message.h" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_events/messages/juce_MessageListener.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_events/messages/juce_MessageListener.h" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_events/messages/juce_MessageManager.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_events/messages/juce_MessageManager.h" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_events/messages/juce_MountedVolumeListChangeDetector.h" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_events/messages/juce_NotificationType.h" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_events/native/juce_android_Messaging.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_events/native/juce_ios_MessageManager.mm" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_events/native/juce_linux_EventLoop.h" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_events/native/juce_linux_Messaging.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_events/native/juce_mac_MessageManager.mm" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_events/native/juce_osx_MessageQueue.h" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_events/native/juce_win32_HiddenMessageWindow.h" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_events/native/juce_win32_Messaging.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_events/native/juce_win32_WinRTWrapper.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_events/native/juce_win32_WinRTWrapper.h" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_events/timers/juce_MultiTimer.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_events/timers/juce_MultiTimer.h" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_events/timers/juce_Timer.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_events/timers/juce_Timer.h" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_events/juce_events.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_events/juce_events.mm" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_events/juce_events.h" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_graphics/colour/juce_Colour.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_graphics/colour/juce_Colour.h" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_graphics/colour/juce_ColourGradient.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_graphics/colour/juce_ColourGradient.h" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_graphics/colour/juce_Colours.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_graphics/colour/juce_Colours.h" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_graphics/colour/juce_FillType.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_graphics/colour/juce_FillType.h" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_graphics/colour/juce_PixelFormats.h" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_graphics/contexts/juce_GraphicsContext.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_graphics/contexts/juce_GraphicsContext.h" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_graphics/contexts/juce_LowLevelGraphicsContext.h" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_graphics/contexts/juce_LowLevelGraphicsPostScriptRenderer.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_graphics/contexts/juce_LowLevelGraphicsPostScriptRenderer.h" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_graphics/contexts/juce_LowLevelGraphicsSoftwareRenderer.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_graphics/contexts/juce_LowLevelGraphicsSoftwareRenderer.h" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_graphics/effects/juce_DropShadowEffect.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_graphics/effects/juce_DropShadowEffect.h" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_graphics/effects/juce_GlowEffect.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_graphics/effects/juce_GlowEffect.h" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_graphics/effects/juce_ImageEffectFilter.h" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_graphics/fonts/juce_AttributedString.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_graphics/fonts/juce_AttributedString.h" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_graphics/fonts/juce_CustomTypeface.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_graphics/fonts/juce_CustomTypeface.h" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_graphics/fonts/juce_Font.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_graphics/fonts/juce_Font.h" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_graphics/fonts/juce_GlyphArrangement.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_graphics/fonts/juce_GlyphArrangement.h" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_graphics/fonts/juce_TextLayout.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_graphics/fonts/juce_TextLayout.h" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_graphics/fonts/juce_Typeface.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_graphics/fonts/juce_Typeface.h" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_graphics/geometry/juce_AffineTransform.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_graphics/geometry/juce_AffineTransform.h" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_graphics/geometry/juce_BorderSize.h" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_graphics/geometry/juce_EdgeTable.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_graphics/geometry/juce_EdgeTable.h" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_graphics/geometry/juce_Line.h" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_graphics/geometry/juce_Path.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_graphics/geometry/juce_Path.h" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_graphics/geometry/juce_PathIterator.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_graphics/geometry/juce_PathIterator.h" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_graphics/geometry/juce_PathStrokeType.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_graphics/geometry/juce_PathStrokeType.h" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_graphics/geometry/juce_Point.h" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_graphics/geometry/juce_Rectangle.h" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_graphics/geometry/juce_RectangleList.h" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/cderror.h" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/changes to libjpeg for JUCE.txt" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/jcapimin.c" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/jcapistd.c" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/jccoefct.c" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/jccolor.c" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/jcdctmgr.c" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/jchuff.c" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/jchuff.h" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/jcinit.c" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/jcmainct.c" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/jcmarker.c" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/jcmaster.c" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/jcomapi.c" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/jconfig.h" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/jcparam.c" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/jcphuff.c" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/jcprepct.c" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/jcsample.c" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/jctrans.c" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/jdapimin.c" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/jdapistd.c" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/jdatasrc.c" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/jdcoefct.c" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/jdcolor.c" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/jdct.h" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/jddctmgr.c" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/jdhuff.c" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/jdhuff.h" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/jdinput.c" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/jdmainct.c" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/jdmarker.c" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/jdmaster.c" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/jdmerge.c" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/jdphuff.c" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/jdpostct.c" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/jdsample.c" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/jdtrans.c" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/jerror.c" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/jerror.h" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/jfdctflt.c" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/jfdctfst.c" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/jfdctint.c" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/jidctflt.c" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/jidctfst.c" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/jidctint.c" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/jidctred.c" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/jinclude.h" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/jmemmgr.c" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/jmemnobs.c" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/jmemsys.h" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/jmorecfg.h" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/jpegint.h" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/jpeglib.h" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/jquant1.c" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/jquant2.c" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/jutils.c" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/jversion.h" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/transupp.c" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/transupp.h" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_graphics/image_formats/pnglib/libpng_readme.txt" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_graphics/image_formats/pnglib/png.c" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_graphics/image_formats/pnglib/png.h" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_graphics/image_formats/pnglib/pngconf.h" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_graphics/image_formats/pnglib/pngerror.c" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_graphics/image_formats/pnglib/pngget.c" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_graphics/image_formats/pnglib/pnginfo.h" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_graphics/image_formats/pnglib/pngmem.c" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_graphics/image_formats/pnglib/pngpread.c" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_graphics/image_formats/pnglib/pngpriv.h" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_graphics/image_formats/pnglib/pngread.c" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_graphics/image_formats/pnglib/pngrio.c" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_graphics/image_formats/pnglib/pngrtran.c" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_graphics/image_formats/pnglib/pngrutil.c" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_graphics/image_formats/pnglib/pngset.c" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_graphics/image_formats/pnglib/pngstruct.h" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_graphics/image_formats/pnglib/pngtrans.c" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_graphics/image_formats/pnglib/pngwio.c" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_graphics/image_formats/pnglib/pngwrite.c" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_graphics/image_formats/pnglib/pngwtran.c" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_graphics/image_formats/pnglib/pngwutil.c" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_graphics/image_formats/juce_GIFLoader.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_graphics/image_formats/juce_JPEGLoader.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_graphics/image_formats/juce_PNGLoader.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_graphics/images/juce_Image.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_graphics/images/juce_Image.h" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_graphics/images/juce_ImageCache.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_graphics/images/juce_ImageCache.h" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_graphics/images/juce_ImageConvolutionKernel.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_graphics/images/juce_ImageConvolutionKernel.h" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_graphics/images/juce_ImageFileFormat.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_graphics/images/juce_ImageFileFormat.h" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_graphics/native/juce_android_Fonts.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_graphics/native/juce_android_GraphicsContext.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_graphics/native/juce_android_IconHelpers.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_graphics/native/juce_freetype_Fonts.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_graphics/native/juce_linux_Fonts.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_graphics/native/juce_linux_IconHelpers.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_graphics/native/juce_mac_CoreGraphicsContext.h" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_graphics/native/juce_mac_CoreGraphicsContext.mm" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_graphics/native/juce_mac_CoreGraphicsHelpers.h" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_graphics/native/juce_mac_Fonts.mm" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_graphics/native/juce_mac_IconHelpers.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_graphics/native/juce_RenderingHelpers.h" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_graphics/native/juce_win32_Direct2DGraphicsContext.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_graphics/native/juce_win32_Direct2DGraphicsContext.h" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_graphics/native/juce_win32_DirectWriteTypeface.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_graphics/native/juce_win32_DirectWriteTypeLayout.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_graphics/native/juce_win32_Fonts.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_graphics/native/juce_win32_IconHelpers.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_graphics/placement/juce_Justification.h" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_graphics/placement/juce_RectanglePlacement.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_graphics/placement/juce_RectanglePlacement.h" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_graphics/juce_graphics.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_graphics/juce_graphics.mm" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_graphics/juce_graphics.h" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_gui_basics/application/juce_Application.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_gui_basics/application/juce_Application.h" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_gui_basics/buttons/juce_ArrowButton.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_gui_basics/buttons/juce_ArrowButton.h" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_gui_basics/buttons/juce_Button.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_gui_basics/buttons/juce_Button.h" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_gui_basics/buttons/juce_DrawableButton.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_gui_basics/buttons/juce_DrawableButton.h" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_gui_basics/buttons/juce_HyperlinkButton.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_gui_basics/buttons/juce_HyperlinkButton.h" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_gui_basics/buttons/juce_ImageButton.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_gui_basics/buttons/juce_ImageButton.h" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_gui_basics/buttons/juce_ShapeButton.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_gui_basics/buttons/juce_ShapeButton.h" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_gui_basics/buttons/juce_TextButton.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_gui_basics/buttons/juce_TextButton.h" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_gui_basics/buttons/juce_ToggleButton.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_gui_basics/buttons/juce_ToggleButton.h" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_gui_basics/buttons/juce_ToolbarButton.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_gui_basics/buttons/juce_ToolbarButton.h" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_gui_basics/commands/juce_ApplicationCommandID.h" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_gui_basics/commands/juce_ApplicationCommandInfo.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_gui_basics/commands/juce_ApplicationCommandInfo.h" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_gui_basics/commands/juce_ApplicationCommandManager.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_gui_basics/commands/juce_ApplicationCommandManager.h" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_gui_basics/commands/juce_ApplicationCommandTarget.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_gui_basics/commands/juce_ApplicationCommandTarget.h" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_gui_basics/commands/juce_KeyPressMappingSet.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_gui_basics/commands/juce_KeyPressMappingSet.h" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_gui_basics/components/juce_CachedComponentImage.h" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_gui_basics/components/juce_Component.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_gui_basics/components/juce_Component.h" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_gui_basics/components/juce_ComponentListener.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_gui_basics/components/juce_ComponentListener.h" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_gui_basics/components/juce_Desktop.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_gui_basics/components/juce_Desktop.h" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_gui_basics/components/juce_ModalComponentManager.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_gui_basics/components/juce_ModalComponentManager.h" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_gui_basics/drawables/juce_Drawable.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_gui_basics/drawables/juce_Drawable.h" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_gui_basics/drawables/juce_DrawableComposite.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_gui_basics/drawables/juce_DrawableComposite.h" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_gui_basics/drawables/juce_DrawableImage.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_gui_basics/drawables/juce_DrawableImage.h" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_gui_basics/drawables/juce_DrawablePath.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_gui_basics/drawables/juce_DrawablePath.h" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_gui_basics/drawables/juce_DrawableRectangle.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_gui_basics/drawables/juce_DrawableRectangle.h" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_gui_basics/drawables/juce_DrawableShape.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_gui_basics/drawables/juce_DrawableShape.h" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_gui_basics/drawables/juce_DrawableText.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_gui_basics/drawables/juce_DrawableText.h" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_gui_basics/drawables/juce_SVGParser.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_gui_basics/filebrowser/juce_DirectoryContentsDisplayComponent.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_gui_basics/filebrowser/juce_DirectoryContentsDisplayComponent.h" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_gui_basics/filebrowser/juce_DirectoryContentsList.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_gui_basics/filebrowser/juce_DirectoryContentsList.h" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_gui_basics/filebrowser/juce_FileBrowserComponent.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_gui_basics/filebrowser/juce_FileBrowserComponent.h" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_gui_basics/filebrowser/juce_FileBrowserListener.h" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_gui_basics/filebrowser/juce_FileChooser.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_gui_basics/filebrowser/juce_FileChooser.h" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_gui_basics/filebrowser/juce_FileChooserDialogBox.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_gui_basics/filebrowser/juce_FileChooserDialogBox.h" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_gui_basics/filebrowser/juce_FileListComponent.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_gui_basics/filebrowser/juce_FileListComponent.h" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_gui_basics/filebrowser/juce_FilenameComponent.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_gui_basics/filebrowser/juce_FilenameComponent.h" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_gui_basics/filebrowser/juce_FilePreviewComponent.h" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_gui_basics/filebrowser/juce_FileSearchPathListComponent.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_gui_basics/filebrowser/juce_FileSearchPathListComponent.h" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_gui_basics/filebrowser/juce_FileTreeComponent.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_gui_basics/filebrowser/juce_FileTreeComponent.h" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_gui_basics/filebrowser/juce_ImagePreviewComponent.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_gui_basics/filebrowser/juce_ImagePreviewComponent.h" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_gui_basics/keyboard/juce_CaretComponent.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_gui_basics/keyboard/juce_CaretComponent.h" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_gui_basics/keyboard/juce_KeyboardFocusTraverser.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_gui_basics/keyboard/juce_KeyboardFocusTraverser.h" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_gui_basics/keyboard/juce_KeyListener.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_gui_basics/keyboard/juce_KeyListener.h" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_gui_basics/keyboard/juce_KeyPress.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_gui_basics/keyboard/juce_KeyPress.h" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_gui_basics/keyboard/juce_ModifierKeys.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_gui_basics/keyboard/juce_ModifierKeys.h" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_gui_basics/keyboard/juce_SystemClipboard.h" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_gui_basics/keyboard/juce_TextEditorKeyMapper.h" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_gui_basics/keyboard/juce_TextInputTarget.h" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_gui_basics/layout/juce_AnimatedPosition.h" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_gui_basics/layout/juce_AnimatedPositionBehaviours.h" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_gui_basics/layout/juce_ComponentAnimator.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_gui_basics/layout/juce_ComponentAnimator.h" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_gui_basics/layout/juce_ComponentBoundsConstrainer.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_gui_basics/layout/juce_ComponentBoundsConstrainer.h" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_gui_basics/layout/juce_ComponentBuilder.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_gui_basics/layout/juce_ComponentBuilder.h" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_gui_basics/layout/juce_ComponentMovementWatcher.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_gui_basics/layout/juce_ComponentMovementWatcher.h" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_gui_basics/layout/juce_ConcertinaPanel.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_gui_basics/layout/juce_ConcertinaPanel.h" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_gui_basics/layout/juce_FlexBox.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_gui_basics/layout/juce_FlexBox.h" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_gui_basics/layout/juce_FlexItem.h" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_gui_basics/layout/juce_Grid.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_gui_basics/layout/juce_Grid.h" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_gui_basics/layout/juce_GridItem.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_gui_basics/layout/juce_GridItem.h" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_gui_basics/layout/juce_GridUnitTests.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_gui_basics/layout/juce_GroupComponent.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_gui_basics/layout/juce_GroupComponent.h" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_gui_basics/layout/juce_MultiDocumentPanel.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_gui_basics/layout/juce_MultiDocumentPanel.h" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_gui_basics/layout/juce_ResizableBorderComponent.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_gui_basics/layout/juce_ResizableBorderComponent.h" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_gui_basics/layout/juce_ResizableCornerComponent.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_gui_basics/layout/juce_ResizableCornerComponent.h" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_gui_basics/layout/juce_ResizableEdgeComponent.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_gui_basics/layout/juce_ResizableEdgeComponent.h" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_gui_basics/layout/juce_ScrollBar.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_gui_basics/layout/juce_ScrollBar.h" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_gui_basics/layout/juce_StretchableLayoutManager.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_gui_basics/layout/juce_StretchableLayoutManager.h" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_gui_basics/layout/juce_StretchableLayoutResizerBar.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_gui_basics/layout/juce_StretchableLayoutResizerBar.h" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_gui_basics/layout/juce_StretchableObjectResizer.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_gui_basics/layout/juce_StretchableObjectResizer.h" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_gui_basics/layout/juce_TabbedButtonBar.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_gui_basics/layout/juce_TabbedButtonBar.h" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_gui_basics/layout/juce_TabbedComponent.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_gui_basics/layout/juce_TabbedComponent.h" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_gui_basics/layout/juce_Viewport.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_gui_basics/layout/juce_Viewport.h" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_gui_basics/lookandfeel/juce_LookAndFeel.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_gui_basics/lookandfeel/juce_LookAndFeel.h" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_gui_basics/lookandfeel/juce_LookAndFeel_V1.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_gui_basics/lookandfeel/juce_LookAndFeel_V1.h" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_gui_basics/lookandfeel/juce_LookAndFeel_V2.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_gui_basics/lookandfeel/juce_LookAndFeel_V2.h" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_gui_basics/lookandfeel/juce_LookAndFeel_V3.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_gui_basics/lookandfeel/juce_LookAndFeel_V3.h" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_gui_basics/lookandfeel/juce_LookAndFeel_V4.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_gui_basics/lookandfeel/juce_LookAndFeel_V4.h" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_gui_basics/menus/juce_MenuBarComponent.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_gui_basics/menus/juce_MenuBarComponent.h" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_gui_basics/menus/juce_MenuBarModel.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_gui_basics/menus/juce_MenuBarModel.h" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_gui_basics/menus/juce_PopupMenu.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_gui_basics/menus/juce_PopupMenu.h" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_gui_basics/misc/juce_BubbleComponent.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_gui_basics/misc/juce_BubbleComponent.h" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_gui_basics/misc/juce_DropShadower.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_gui_basics/misc/juce_DropShadower.h" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_gui_basics/misc/juce_JUCESplashScreen.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_gui_basics/misc/juce_JUCESplashScreen.h" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_gui_basics/mouse/juce_ComponentDragger.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_gui_basics/mouse/juce_ComponentDragger.h" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_gui_basics/mouse/juce_DragAndDropContainer.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_gui_basics/mouse/juce_DragAndDropContainer.h" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_gui_basics/mouse/juce_DragAndDropTarget.h" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_gui_basics/mouse/juce_FileDragAndDropTarget.h" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_gui_basics/mouse/juce_LassoComponent.h" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_gui_basics/mouse/juce_MouseCursor.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_gui_basics/mouse/juce_MouseCursor.h" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_gui_basics/mouse/juce_MouseEvent.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_gui_basics/mouse/juce_MouseEvent.h" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_gui_basics/mouse/juce_MouseInactivityDetector.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_gui_basics/mouse/juce_MouseInactivityDetector.h" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_gui_basics/mouse/juce_MouseInputSource.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_gui_basics/mouse/juce_MouseInputSource.h" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_gui_basics/mouse/juce_MouseListener.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_gui_basics/mouse/juce_MouseListener.h" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_gui_basics/mouse/juce_SelectedItemSet.h" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_gui_basics/mouse/juce_TextDragAndDropTarget.h" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_gui_basics/mouse/juce_TooltipClient.h" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_gui_basics/native/juce_android_FileChooser.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_gui_basics/native/juce_android_Windowing.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_gui_basics/native/juce_ios_UIViewComponentPeer.mm" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_gui_basics/native/juce_ios_Windowing.mm" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_gui_basics/native/juce_linux_FileChooser.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_gui_basics/native/juce_linux_X11.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_gui_basics/native/juce_linux_X11.h" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_gui_basics/native/juce_linux_X11_Clipboard.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_gui_basics/native/juce_linux_X11_Windowing.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_gui_basics/native/juce_mac_FileChooser.mm" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_gui_basics/native/juce_mac_MainMenu.mm" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_gui_basics/native/juce_mac_MouseCursor.mm" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_gui_basics/native/juce_mac_NSViewComponentPeer.mm" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_gui_basics/native/juce_mac_Windowing.mm" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_gui_basics/native/juce_MultiTouchMapper.h" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_gui_basics/native/juce_win32_DragAndDrop.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_gui_basics/native/juce_win32_FileChooser.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_gui_basics/native/juce_win32_Windowing.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_gui_basics/positioning/juce_MarkerList.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_gui_basics/positioning/juce_MarkerList.h" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_gui_basics/positioning/juce_RelativeCoordinate.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_gui_basics/positioning/juce_RelativeCoordinate.h" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_gui_basics/positioning/juce_RelativeCoordinatePositioner.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_gui_basics/positioning/juce_RelativeCoordinatePositioner.h" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_gui_basics/positioning/juce_RelativeParallelogram.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_gui_basics/positioning/juce_RelativeParallelogram.h" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_gui_basics/positioning/juce_RelativePoint.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_gui_basics/positioning/juce_RelativePoint.h" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_gui_basics/positioning/juce_RelativePointPath.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_gui_basics/positioning/juce_RelativePointPath.h" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_gui_basics/positioning/juce_RelativeRectangle.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_gui_basics/positioning/juce_RelativeRectangle.h" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_gui_basics/properties/juce_BooleanPropertyComponent.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_gui_basics/properties/juce_BooleanPropertyComponent.h" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_gui_basics/properties/juce_ButtonPropertyComponent.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_gui_basics/properties/juce_ButtonPropertyComponent.h" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_gui_basics/properties/juce_ChoicePropertyComponent.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_gui_basics/properties/juce_ChoicePropertyComponent.h" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_gui_basics/properties/juce_PropertyComponent.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_gui_basics/properties/juce_PropertyComponent.h" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_gui_basics/properties/juce_PropertyPanel.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_gui_basics/properties/juce_PropertyPanel.h" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_gui_basics/properties/juce_SliderPropertyComponent.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_gui_basics/properties/juce_SliderPropertyComponent.h" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_gui_basics/properties/juce_TextPropertyComponent.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_gui_basics/properties/juce_TextPropertyComponent.h" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_gui_basics/widgets/juce_ComboBox.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_gui_basics/widgets/juce_ComboBox.h" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_gui_basics/widgets/juce_ImageComponent.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_gui_basics/widgets/juce_ImageComponent.h" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_gui_basics/widgets/juce_Label.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_gui_basics/widgets/juce_Label.h" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_gui_basics/widgets/juce_ListBox.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_gui_basics/widgets/juce_ListBox.h" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_gui_basics/widgets/juce_ProgressBar.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_gui_basics/widgets/juce_ProgressBar.h" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_gui_basics/widgets/juce_Slider.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_gui_basics/widgets/juce_Slider.h" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_gui_basics/widgets/juce_TableHeaderComponent.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_gui_basics/widgets/juce_TableHeaderComponent.h" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_gui_basics/widgets/juce_TableListBox.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_gui_basics/widgets/juce_TableListBox.h" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_gui_basics/widgets/juce_TextEditor.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_gui_basics/widgets/juce_TextEditor.h" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_gui_basics/widgets/juce_Toolbar.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_gui_basics/widgets/juce_Toolbar.h" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_gui_basics/widgets/juce_ToolbarItemComponent.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_gui_basics/widgets/juce_ToolbarItemComponent.h" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_gui_basics/widgets/juce_ToolbarItemFactory.h" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_gui_basics/widgets/juce_ToolbarItemPalette.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_gui_basics/widgets/juce_ToolbarItemPalette.h" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_gui_basics/widgets/juce_TreeView.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_gui_basics/widgets/juce_TreeView.h" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_gui_basics/windows/juce_AlertWindow.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_gui_basics/windows/juce_AlertWindow.h" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_gui_basics/windows/juce_CallOutBox.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_gui_basics/windows/juce_CallOutBox.h" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_gui_basics/windows/juce_ComponentPeer.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_gui_basics/windows/juce_ComponentPeer.h" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_gui_basics/windows/juce_DialogWindow.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_gui_basics/windows/juce_DialogWindow.h" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_gui_basics/windows/juce_DocumentWindow.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_gui_basics/windows/juce_DocumentWindow.h" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_gui_basics/windows/juce_NativeMessageBox.h" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_gui_basics/windows/juce_ResizableWindow.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_gui_basics/windows/juce_ResizableWindow.h" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_gui_basics/windows/juce_ThreadWithProgressWindow.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_gui_basics/windows/juce_ThreadWithProgressWindow.h" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_gui_basics/windows/juce_TooltipWindow.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_gui_basics/windows/juce_TooltipWindow.h" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_gui_basics/windows/juce_TopLevelWindow.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_gui_basics/windows/juce_TopLevelWindow.h" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_gui_basics/juce_gui_basics.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_gui_basics/juce_gui_basics.mm" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_gui_basics/juce_gui_basics.h" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../JuceLibraryCode/AppConfig.h" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../JuceLibraryCode/JuceHeader.h" PROPERTIES HEADER_FILE_ONLY TRUE)
+
+find_library(log "log")
+find_library(android "android")
+find_library(glesv2 "GLESv2")
+find_library(egl "EGL")
+
+target_link_libraries( ${BINARY_NAME}
+
+ ${log}
+ ${android}
+ ${glesv2}
+ ${egl}
+ "cpufeatures"
+)
diff --git a/examples/AnalyticsCollection/Builds/Android/app/build.gradle b/examples/AnalyticsCollection/Builds/Android/app/build.gradle
new file mode 100644
index 0000000000..7ac213639e
--- /dev/null
+++ b/examples/AnalyticsCollection/Builds/Android/app/build.gradle
@@ -0,0 +1,89 @@
+apply plugin: 'com.android.application'
+
+android {
+ compileSdkVersion 10
+ buildToolsVersion "26.0.0"
+ externalNativeBuild {
+ cmake {
+ path "CMakeLists.txt"
+ }
+ }
+ signingConfigs {
+ juceSigning {
+ storeFile file("${System.properties['user.home']}${File.separator}.android${File.separator}debug.keystore")
+ storePassword "android"
+ keyAlias "androiddebugkey"
+ keyPassword "android"
+ storeType "jks"
+ }
+ }
+
+ defaultConfig {
+ applicationId "com.yourcompany.analyticscollection"
+ minSdkVersion 10
+ targetSdkVersion 10
+ externalNativeBuild {
+ cmake {
+ arguments "-DANDROID_TOOLCHAIN=clang", "-DANDROID_PLATFORM=android-10", "-DANDROID_STL=c++_static", "-DANDROID_CPP_FEATURES=exceptions rtti", "-DANDROID_ARM_MODE=arm", "-DANDROID_ARM_NEON=TRUE"
+ cFlags "-fsigned-char"
+ cppFlags "-fsigned-char", "-std=c++11"
+ }
+ }
+ }
+
+ buildTypes {
+ debug {
+ initWith debug
+ debuggable true
+ jniDebuggable true
+ signingConfig signingConfigs.juceSigning
+ }
+ release {
+ initWith release
+ debuggable false
+ jniDebuggable false
+ signingConfig signingConfigs.juceSigning
+ }
+ }
+
+ productFlavors {
+ debug_ {
+ ndk {
+ abiFilters "armeabi", "x86"
+ }
+ externalNativeBuild {
+ cmake {
+ arguments "-DJUCE_BUILD_CONFIGFURATION=DEBUG", "-DCMAKE_CXX_FLAGS_DEBUG=-O0", "-DCMAKE_C_FLAGS_DEBUG=-O0"
+ }
+ }
+ }
+ release_ {
+ externalNativeBuild {
+ cmake {
+ arguments "-DJUCE_BUILD_CONFIGFURATION=RELEASE", "-DCMAKE_CXX_FLAGS_RELEASE=-O3", "-DCMAKE_C_FLAGS_RELEASE=-O3"
+ }
+ }
+ }
+ }
+
+ variantFilter { variant ->
+ def names = variant.flavors*.name
+ if (names.contains ("debug_")
+ && variant.buildType.name != "debug") {
+ setIgnore(true)
+ }
+ if (names.contains ("release_")
+ && variant.buildType.name != "release") {
+ setIgnore(true)
+ }
+ }
+
+repositories {
+}
+
+dependencies {
+}
+
+
+}
+
diff --git a/examples/AnalyticsCollection/Builds/Android/app/src/debug/res/values/string.xml b/examples/AnalyticsCollection/Builds/Android/app/src/debug/res/values/string.xml
new file mode 100644
index 0000000000..8b89f78e6e
--- /dev/null
+++ b/examples/AnalyticsCollection/Builds/Android/app/src/debug/res/values/string.xml
@@ -0,0 +1,5 @@
+
+
+
+ AnalyticsCollection
+
diff --git a/examples/AnalyticsCollection/Builds/Android/app/src/main/AndroidManifest.xml b/examples/AnalyticsCollection/Builds/Android/app/src/main/AndroidManifest.xml
new file mode 100644
index 0000000000..e97620df86
--- /dev/null
+++ b/examples/AnalyticsCollection/Builds/Android/app/src/main/AndroidManifest.xml
@@ -0,0 +1,22 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/examples/AnalyticsCollection/Builds/Android/app/src/main/java/com/android/vending/billing/IInAppBillingService.java b/examples/AnalyticsCollection/Builds/Android/app/src/main/java/com/android/vending/billing/IInAppBillingService.java
new file mode 100644
index 0000000000..0bb31cb5d3
--- /dev/null
+++ b/examples/AnalyticsCollection/Builds/Android/app/src/main/java/com/android/vending/billing/IInAppBillingService.java
@@ -0,0 +1,971 @@
+/*
+ ==============================================================================
+
+ This file is part of the JUCE library.
+ Copyright (c) 2017 - ROLI Ltd.
+
+ JUCE is an open source library subject to commercial or open-source
+ licensing.
+
+ The code included in this file is provided under the terms of the ISC license
+ http://www.isc.org/downloads/software-support-policy/isc-license. Permission
+ To use, copy, modify, and/or distribute this software for any purpose with or
+ without fee is hereby granted provided that the above copyright notice and
+ this permission notice appear in all copies.
+
+ JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER
+ EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE
+ DISCLAIMED.
+
+ ==============================================================================
+*/
+
+package com.android.vending.billing;
+/**
+ * InAppBillingService is the service that provides in-app billing version 3 and beyond.
+ * This service provides the following features:
+ * 1. Provides a new API to get details of in-app items published for the app including
+ * price, type, title and description.
+ * 2. The purchase flow is synchronous and purchase information is available immediately
+ * after it completes.
+ * 3. Purchase information of in-app purchases is maintained within the Google Play system
+ * till the purchase is consumed.
+ * 4. An API to consume a purchase of an inapp item. All purchases of one-time
+ * in-app items are consumable and thereafter can be purchased again.
+ * 5. An API to get current purchases of the user immediately. This will not contain any
+ * consumed purchases.
+ *
+ * All calls will give a response code with the following possible values
+ * RESULT_OK = 0 - success
+ * RESULT_USER_CANCELED = 1 - User pressed back or canceled a dialog
+ * RESULT_SERVICE_UNAVAILABLE = 2 - The network connection is down
+ * RESULT_BILLING_UNAVAILABLE = 3 - This billing API version is not supported for the type requested
+ * RESULT_ITEM_UNAVAILABLE = 4 - Requested SKU is not available for purchase
+ * RESULT_DEVELOPER_ERROR = 5 - Invalid arguments provided to the API
+ * RESULT_ERROR = 6 - Fatal error during the API action
+ * RESULT_ITEM_ALREADY_OWNED = 7 - Failure to purchase since item is already owned
+ * RESULT_ITEM_NOT_OWNED = 8 - Failure to consume since item is not owned
+ */
+public interface IInAppBillingService extends android.os.IInterface
+ {
+ /** Local-side IPC implementation stub class. */
+ public static abstract class Stub extends android.os.Binder implements com.android.vending.billing.IInAppBillingService
+ {
+ private static final java.lang.String DESCRIPTOR = "com.android.vending.billing.IInAppBillingService";
+ /** Construct the stub at attach it to the interface. */
+ public Stub()
+ {
+ this.attachInterface(this, DESCRIPTOR);
+ }
+ /**
+ * Cast an IBinder object into an com.android.vending.billing.IInAppBillingService interface,
+ * generating a proxy if needed.
+ */
+ public static com.android.vending.billing.IInAppBillingService asInterface(android.os.IBinder obj)
+ {
+ if ((obj==null)) {
+ return null;
+ }
+ android.os.IInterface iin = obj.queryLocalInterface(DESCRIPTOR);
+ if (((iin!=null)&&(iin instanceof com.android.vending.billing.IInAppBillingService))) {
+ return ((com.android.vending.billing.IInAppBillingService)iin);
+ }
+ return new com.android.vending.billing.IInAppBillingService.Stub.Proxy(obj);
+ }
+ @Override public android.os.IBinder asBinder()
+ {
+ return this;
+ }
+ @Override public boolean onTransact(int code, android.os.Parcel data, android.os.Parcel reply, int flags) throws android.os.RemoteException
+ {
+ switch (code)
+ {
+ case INTERFACE_TRANSACTION:
+ {
+ reply.writeString(DESCRIPTOR);
+ return true;
+ }
+ case TRANSACTION_isBillingSupported:
+ {
+ data.enforceInterface(DESCRIPTOR);
+ int _arg0;
+ _arg0 = data.readInt();
+ java.lang.String _arg1;
+ _arg1 = data.readString();
+ java.lang.String _arg2;
+ _arg2 = data.readString();
+ int _result = this.isBillingSupported(_arg0, _arg1, _arg2);
+ reply.writeNoException();
+ reply.writeInt(_result);
+ return true;
+ }
+ case TRANSACTION_getSkuDetails:
+ {
+ data.enforceInterface(DESCRIPTOR);
+ int _arg0;
+ _arg0 = data.readInt();
+ java.lang.String _arg1;
+ _arg1 = data.readString();
+ java.lang.String _arg2;
+ _arg2 = data.readString();
+ android.os.Bundle _arg3;
+ if ((0!=data.readInt())) {
+ _arg3 = android.os.Bundle.CREATOR.createFromParcel(data);
+ }
+ else {
+ _arg3 = null;
+ }
+ android.os.Bundle _result = this.getSkuDetails(_arg0, _arg1, _arg2, _arg3);
+ reply.writeNoException();
+ if ((_result!=null)) {
+ reply.writeInt(1);
+ _result.writeToParcel(reply, android.os.Parcelable.PARCELABLE_WRITE_RETURN_VALUE);
+ }
+ else {
+ reply.writeInt(0);
+ }
+ return true;
+ }
+ case TRANSACTION_getBuyIntent:
+ {
+ data.enforceInterface(DESCRIPTOR);
+ int _arg0;
+ _arg0 = data.readInt();
+ java.lang.String _arg1;
+ _arg1 = data.readString();
+ java.lang.String _arg2;
+ _arg2 = data.readString();
+ java.lang.String _arg3;
+ _arg3 = data.readString();
+ java.lang.String _arg4;
+ _arg4 = data.readString();
+ android.os.Bundle _result = this.getBuyIntent(_arg0, _arg1, _arg2, _arg3, _arg4);
+ reply.writeNoException();
+ if ((_result!=null)) {
+ reply.writeInt(1);
+ _result.writeToParcel(reply, android.os.Parcelable.PARCELABLE_WRITE_RETURN_VALUE);
+ }
+ else {
+ reply.writeInt(0);
+ }
+ return true;
+ }
+ case TRANSACTION_getPurchases:
+ {
+ data.enforceInterface(DESCRIPTOR);
+ int _arg0;
+ _arg0 = data.readInt();
+ java.lang.String _arg1;
+ _arg1 = data.readString();
+ java.lang.String _arg2;
+ _arg2 = data.readString();
+ java.lang.String _arg3;
+ _arg3 = data.readString();
+ android.os.Bundle _result = this.getPurchases(_arg0, _arg1, _arg2, _arg3);
+ reply.writeNoException();
+ if ((_result!=null)) {
+ reply.writeInt(1);
+ _result.writeToParcel(reply, android.os.Parcelable.PARCELABLE_WRITE_RETURN_VALUE);
+ }
+ else {
+ reply.writeInt(0);
+ }
+ return true;
+ }
+ case TRANSACTION_consumePurchase:
+ {
+ data.enforceInterface(DESCRIPTOR);
+ int _arg0;
+ _arg0 = data.readInt();
+ java.lang.String _arg1;
+ _arg1 = data.readString();
+ java.lang.String _arg2;
+ _arg2 = data.readString();
+ int _result = this.consumePurchase(_arg0, _arg1, _arg2);
+ reply.writeNoException();
+ reply.writeInt(_result);
+ return true;
+ }
+ case TRANSACTION_stub:
+ {
+ data.enforceInterface(DESCRIPTOR);
+ int _arg0;
+ _arg0 = data.readInt();
+ java.lang.String _arg1;
+ _arg1 = data.readString();
+ java.lang.String _arg2;
+ _arg2 = data.readString();
+ int _result = this.stub(_arg0, _arg1, _arg2);
+ reply.writeNoException();
+ reply.writeInt(_result);
+ return true;
+ }
+ case TRANSACTION_getBuyIntentToReplaceSkus:
+ {
+ data.enforceInterface(DESCRIPTOR);
+ int _arg0;
+ _arg0 = data.readInt();
+ java.lang.String _arg1;
+ _arg1 = data.readString();
+ java.util.List _arg2;
+ _arg2 = data.createStringArrayList();
+ java.lang.String _arg3;
+ _arg3 = data.readString();
+ java.lang.String _arg4;
+ _arg4 = data.readString();
+ java.lang.String _arg5;
+ _arg5 = data.readString();
+ android.os.Bundle _result = this.getBuyIntentToReplaceSkus(_arg0, _arg1, _arg2, _arg3, _arg4, _arg5);
+ reply.writeNoException();
+ if ((_result!=null)) {
+ reply.writeInt(1);
+ _result.writeToParcel(reply, android.os.Parcelable.PARCELABLE_WRITE_RETURN_VALUE);
+ }
+ else {
+ reply.writeInt(0);
+ }
+ return true;
+ }
+ case TRANSACTION_getBuyIntentExtraParams:
+ {
+ data.enforceInterface(DESCRIPTOR);
+ int _arg0;
+ _arg0 = data.readInt();
+ java.lang.String _arg1;
+ _arg1 = data.readString();
+ java.lang.String _arg2;
+ _arg2 = data.readString();
+ java.lang.String _arg3;
+ _arg3 = data.readString();
+ java.lang.String _arg4;
+ _arg4 = data.readString();
+ android.os.Bundle _arg5;
+ if ((0!=data.readInt())) {
+ _arg5 = android.os.Bundle.CREATOR.createFromParcel(data);
+ }
+ else {
+ _arg5 = null;
+ }
+ android.os.Bundle _result = this.getBuyIntentExtraParams(_arg0, _arg1, _arg2, _arg3, _arg4, _arg5);
+ reply.writeNoException();
+ if ((_result!=null)) {
+ reply.writeInt(1);
+ _result.writeToParcel(reply, android.os.Parcelable.PARCELABLE_WRITE_RETURN_VALUE);
+ }
+ else {
+ reply.writeInt(0);
+ }
+ return true;
+ }
+ case TRANSACTION_getPurchaseHistory:
+ {
+ data.enforceInterface(DESCRIPTOR);
+ int _arg0;
+ _arg0 = data.readInt();
+ java.lang.String _arg1;
+ _arg1 = data.readString();
+ java.lang.String _arg2;
+ _arg2 = data.readString();
+ java.lang.String _arg3;
+ _arg3 = data.readString();
+ android.os.Bundle _arg4;
+ if ((0!=data.readInt())) {
+ _arg4 = android.os.Bundle.CREATOR.createFromParcel(data);
+ }
+ else {
+ _arg4 = null;
+ }
+ android.os.Bundle _result = this.getPurchaseHistory(_arg0, _arg1, _arg2, _arg3, _arg4);
+ reply.writeNoException();
+ if ((_result!=null)) {
+ reply.writeInt(1);
+ _result.writeToParcel(reply, android.os.Parcelable.PARCELABLE_WRITE_RETURN_VALUE);
+ }
+ else {
+ reply.writeInt(0);
+ }
+ return true;
+ }
+ case TRANSACTION_isBillingSupportedExtraParams:
+ {
+ data.enforceInterface(DESCRIPTOR);
+ int _arg0;
+ _arg0 = data.readInt();
+ java.lang.String _arg1;
+ _arg1 = data.readString();
+ java.lang.String _arg2;
+ _arg2 = data.readString();
+ android.os.Bundle _arg3;
+ if ((0!=data.readInt())) {
+ _arg3 = android.os.Bundle.CREATOR.createFromParcel(data);
+ }
+ else {
+ _arg3 = null;
+ }
+ int _result = this.isBillingSupportedExtraParams(_arg0, _arg1, _arg2, _arg3);
+ reply.writeNoException();
+ reply.writeInt(_result);
+ return true;
+ }
+ }
+ return super.onTransact(code, data, reply, flags);
+ }
+ private static class Proxy implements com.android.vending.billing.IInAppBillingService
+ {
+ private android.os.IBinder mRemote;
+ Proxy(android.os.IBinder remote)
+ {
+ mRemote = remote;
+ }
+ @Override public android.os.IBinder asBinder()
+ {
+ return mRemote;
+ }
+ public java.lang.String getInterfaceDescriptor()
+ {
+ return DESCRIPTOR;
+ }
+ @Override public int isBillingSupported(int apiVersion, java.lang.String packageName, java.lang.String type) throws android.os.RemoteException
+ {
+ android.os.Parcel _data = android.os.Parcel.obtain();
+ android.os.Parcel _reply = android.os.Parcel.obtain();
+ int _result;
+ try {
+ _data.writeInterfaceToken(DESCRIPTOR);
+ _data.writeInt(apiVersion);
+ _data.writeString(packageName);
+ _data.writeString(type);
+ mRemote.transact(Stub.TRANSACTION_isBillingSupported, _data, _reply, 0);
+ _reply.readException();
+ _result = _reply.readInt();
+ }
+ finally {
+ _reply.recycle();
+ _data.recycle();
+ }
+ return _result;
+ }
+ /**
+ * Provides details of a list of SKUs
+ * Given a list of SKUs of a valid type in the skusBundle, this returns a bundle
+ * with a list JSON strings containing the productId, price, title and description.
+ * This API can be called with a maximum of 20 SKUs.
+ * @param apiVersion billing API version that the app is using
+ * @param packageName the package name of the calling app
+ * @param type of the in-app items ("inapp" for one-time purchases
+ * and "subs" for subscriptions)
+ * @param skusBundle bundle containing a StringArrayList of SKUs with key "ITEM_ID_LIST"
+ * @return Bundle containing the following key-value pairs
+ * "RESPONSE_CODE" with int value, RESULT_OK(0) if success, appropriate response codes
+ * on failures.
+ * "DETAILS_LIST" with a StringArrayList containing purchase information
+ * in JSON format similar to:
+ * '{ "productId" : "exampleSku",
+ * "type" : "inapp",
+ * "price" : "$5.00",
+ * "price_currency": "USD",
+ * "price_amount_micros": 5000000,
+ * "title : "Example Title",
+ * "description" : "This is an example description" }'
+ */
+ @Override public android.os.Bundle getSkuDetails(int apiVersion, java.lang.String packageName, java.lang.String type, android.os.Bundle skusBundle) throws android.os.RemoteException
+ {
+ android.os.Parcel _data = android.os.Parcel.obtain();
+ android.os.Parcel _reply = android.os.Parcel.obtain();
+ android.os.Bundle _result;
+ try {
+ _data.writeInterfaceToken(DESCRIPTOR);
+ _data.writeInt(apiVersion);
+ _data.writeString(packageName);
+ _data.writeString(type);
+ if ((skusBundle!=null)) {
+ _data.writeInt(1);
+ skusBundle.writeToParcel(_data, 0);
+ }
+ else {
+ _data.writeInt(0);
+ }
+ mRemote.transact(Stub.TRANSACTION_getSkuDetails, _data, _reply, 0);
+ _reply.readException();
+ if ((0!=_reply.readInt())) {
+ _result = android.os.Bundle.CREATOR.createFromParcel(_reply);
+ }
+ else {
+ _result = null;
+ }
+ }
+ finally {
+ _reply.recycle();
+ _data.recycle();
+ }
+ return _result;
+ }
+ /**
+ * Returns a pending intent to launch the purchase flow for an in-app item by providing a SKU,
+ * the type, a unique purchase token and an optional developer payload.
+ * @param apiVersion billing API version that the app is using
+ * @param packageName package name of the calling app
+ * @param sku the SKU of the in-app item as published in the developer console
+ * @param type of the in-app item being purchased ("inapp" for one-time purchases
+ * and "subs" for subscriptions)
+ * @param developerPayload optional argument to be sent back with the purchase information
+ * @return Bundle containing the following key-value pairs
+ * "RESPONSE_CODE" with int value, RESULT_OK(0) if success, appropriate response codes
+ * on failures.
+ * "BUY_INTENT" - PendingIntent to start the purchase flow
+ *
+ * The Pending intent should be launched with startIntentSenderForResult. When purchase flow
+ * has completed, the onActivityResult() will give a resultCode of OK or CANCELED.
+ * If the purchase is successful, the result data will contain the following key-value pairs
+ * "RESPONSE_CODE" with int value, RESULT_OK(0) if success, appropriate response
+ * codes on failures.
+ * "INAPP_PURCHASE_DATA" - String in JSON format similar to
+ * '{"orderId":"12999763169054705758.1371079406387615",
+ * "packageName":"com.example.app",
+ * "productId":"exampleSku",
+ * "purchaseTime":1345678900000,
+ * "purchaseToken" : "122333444455555",
+ * "developerPayload":"example developer payload" }'
+ * "INAPP_DATA_SIGNATURE" - String containing the signature of the purchase data that
+ * was signed with the private key of the developer
+ */
+ @Override public android.os.Bundle getBuyIntent(int apiVersion, java.lang.String packageName, java.lang.String sku, java.lang.String type, java.lang.String developerPayload) throws android.os.RemoteException
+ {
+ android.os.Parcel _data = android.os.Parcel.obtain();
+ android.os.Parcel _reply = android.os.Parcel.obtain();
+ android.os.Bundle _result;
+ try {
+ _data.writeInterfaceToken(DESCRIPTOR);
+ _data.writeInt(apiVersion);
+ _data.writeString(packageName);
+ _data.writeString(sku);
+ _data.writeString(type);
+ _data.writeString(developerPayload);
+ mRemote.transact(Stub.TRANSACTION_getBuyIntent, _data, _reply, 0);
+ _reply.readException();
+ if ((0!=_reply.readInt())) {
+ _result = android.os.Bundle.CREATOR.createFromParcel(_reply);
+ }
+ else {
+ _result = null;
+ }
+ }
+ finally {
+ _reply.recycle();
+ _data.recycle();
+ }
+ return _result;
+ }
+ /**
+ * Returns the current SKUs owned by the user of the type and package name specified along with
+ * purchase information and a signature of the data to be validated.
+ * This will return all SKUs that have been purchased in V3 and managed items purchased using
+ * V1 and V2 that have not been consumed.
+ * @param apiVersion billing API version that the app is using
+ * @param packageName package name of the calling app
+ * @param type of the in-app items being requested ("inapp" for one-time purchases
+ * and "subs" for subscriptions)
+ * @param continuationToken to be set as null for the first call, if the number of owned
+ * skus are too many, a continuationToken is returned in the response bundle.
+ * This method can be called again with the continuation token to get the next set of
+ * owned skus.
+ * @return Bundle containing the following key-value pairs
+ * "RESPONSE_CODE" with int value, RESULT_OK(0) if success, appropriate response codes
+ on failures.
+ * "INAPP_PURCHASE_ITEM_LIST" - StringArrayList containing the list of SKUs
+ * "INAPP_PURCHASE_DATA_LIST" - StringArrayList containing the purchase information
+ * "INAPP_DATA_SIGNATURE_LIST"- StringArrayList containing the signatures
+ * of the purchase information
+ * "INAPP_CONTINUATION_TOKEN" - String containing a continuation token for the
+ * next set of in-app purchases. Only set if the
+ * user has more owned skus than the current list.
+ */
+ @Override public android.os.Bundle getPurchases(int apiVersion, java.lang.String packageName, java.lang.String type, java.lang.String continuationToken) throws android.os.RemoteException
+ {
+ android.os.Parcel _data = android.os.Parcel.obtain();
+ android.os.Parcel _reply = android.os.Parcel.obtain();
+ android.os.Bundle _result;
+ try {
+ _data.writeInterfaceToken(DESCRIPTOR);
+ _data.writeInt(apiVersion);
+ _data.writeString(packageName);
+ _data.writeString(type);
+ _data.writeString(continuationToken);
+ mRemote.transact(Stub.TRANSACTION_getPurchases, _data, _reply, 0);
+ _reply.readException();
+ if ((0!=_reply.readInt())) {
+ _result = android.os.Bundle.CREATOR.createFromParcel(_reply);
+ }
+ else {
+ _result = null;
+ }
+ }
+ finally {
+ _reply.recycle();
+ _data.recycle();
+ }
+ return _result;
+ }
+ @Override public int consumePurchase(int apiVersion, java.lang.String packageName, java.lang.String purchaseToken) throws android.os.RemoteException
+ {
+ android.os.Parcel _data = android.os.Parcel.obtain();
+ android.os.Parcel _reply = android.os.Parcel.obtain();
+ int _result;
+ try {
+ _data.writeInterfaceToken(DESCRIPTOR);
+ _data.writeInt(apiVersion);
+ _data.writeString(packageName);
+ _data.writeString(purchaseToken);
+ mRemote.transact(Stub.TRANSACTION_consumePurchase, _data, _reply, 0);
+ _reply.readException();
+ _result = _reply.readInt();
+ }
+ finally {
+ _reply.recycle();
+ _data.recycle();
+ }
+ return _result;
+ }
+ @Override public int stub(int apiVersion, java.lang.String packageName, java.lang.String type) throws android.os.RemoteException
+ {
+ android.os.Parcel _data = android.os.Parcel.obtain();
+ android.os.Parcel _reply = android.os.Parcel.obtain();
+ int _result;
+ try {
+ _data.writeInterfaceToken(DESCRIPTOR);
+ _data.writeInt(apiVersion);
+ _data.writeString(packageName);
+ _data.writeString(type);
+ mRemote.transact(Stub.TRANSACTION_stub, _data, _reply, 0);
+ _reply.readException();
+ _result = _reply.readInt();
+ }
+ finally {
+ _reply.recycle();
+ _data.recycle();
+ }
+ return _result;
+ }
+ /**
+ * Returns a pending intent to launch the purchase flow for upgrading or downgrading a
+ * subscription. The existing owned SKU(s) should be provided along with the new SKU that
+ * the user is upgrading or downgrading to.
+ * @param apiVersion billing API version that the app is using, must be 5 or later
+ * @param packageName package name of the calling app
+ * @param oldSkus the SKU(s) that the user is upgrading or downgrading from,
+ * if null or empty this method will behave like {@link #getBuyIntent}
+ * @param newSku the SKU that the user is upgrading or downgrading to
+ * @param type of the item being purchased, currently must be "subs"
+ * @param developerPayload optional argument to be sent back with the purchase information
+ * @return Bundle containing the following key-value pairs
+ * "RESPONSE_CODE" with int value, RESULT_OK(0) if success, appropriate response codes
+ * on failures.
+ * "BUY_INTENT" - PendingIntent to start the purchase flow
+ *
+ * The Pending intent should be launched with startIntentSenderForResult. When purchase flow
+ * has completed, the onActivityResult() will give a resultCode of OK or CANCELED.
+ * If the purchase is successful, the result data will contain the following key-value pairs
+ * "RESPONSE_CODE" with int value, RESULT_OK(0) if success, appropriate response
+ * codes on failures.
+ * "INAPP_PURCHASE_DATA" - String in JSON format similar to
+ * '{"orderId":"12999763169054705758.1371079406387615",
+ * "packageName":"com.example.app",
+ * "productId":"exampleSku",
+ * "purchaseTime":1345678900000,
+ * "purchaseToken" : "122333444455555",
+ * "developerPayload":"example developer payload" }'
+ * "INAPP_DATA_SIGNATURE" - String containing the signature of the purchase data that
+ * was signed with the private key of the developer
+ */
+ @Override public android.os.Bundle getBuyIntentToReplaceSkus(int apiVersion, java.lang.String packageName, java.util.List oldSkus, java.lang.String newSku, java.lang.String type, java.lang.String developerPayload) throws android.os.RemoteException
+ {
+ android.os.Parcel _data = android.os.Parcel.obtain();
+ android.os.Parcel _reply = android.os.Parcel.obtain();
+ android.os.Bundle _result;
+ try {
+ _data.writeInterfaceToken(DESCRIPTOR);
+ _data.writeInt(apiVersion);
+ _data.writeString(packageName);
+ _data.writeStringList(oldSkus);
+ _data.writeString(newSku);
+ _data.writeString(type);
+ _data.writeString(developerPayload);
+ mRemote.transact(Stub.TRANSACTION_getBuyIntentToReplaceSkus, _data, _reply, 0);
+ _reply.readException();
+ if ((0!=_reply.readInt())) {
+ _result = android.os.Bundle.CREATOR.createFromParcel(_reply);
+ }
+ else {
+ _result = null;
+ }
+ }
+ finally {
+ _reply.recycle();
+ _data.recycle();
+ }
+ return _result;
+ }
+ /**
+ * Returns a pending intent to launch the purchase flow for an in-app item. This method is
+ * a variant of the {@link #getBuyIntent} method and takes an additional {@code extraParams}
+ * parameter. This parameter is a Bundle of optional keys and values that affect the
+ * operation of the method.
+ * @param apiVersion billing API version that the app is using, must be 6 or later
+ * @param packageName package name of the calling app
+ * @param sku the SKU of the in-app item as published in the developer console
+ * @param type of the in-app item being purchased ("inapp" for one-time purchases
+ * and "subs" for subscriptions)
+ * @param developerPayload optional argument to be sent back with the purchase information
+ * @extraParams a Bundle with the following optional keys:
+ * "skusToReplace" - List - an optional list of SKUs that the user is
+ * upgrading or downgrading from.
+ * Pass this field if the purchase is upgrading or downgrading
+ * existing subscriptions.
+ * The specified SKUs are replaced with the SKUs that the user is
+ * purchasing. Google Play replaces the specified SKUs at the start of
+ * the next billing cycle.
+ * "replaceSkusProration" - Boolean - whether the user should be credited for any unused
+ * subscription time on the SKUs they are upgrading or downgrading.
+ * If you set this field to true, Google Play swaps out the old SKUs
+ * and credits the user with the unused value of their subscription
+ * time on a pro-rated basis.
+ * Google Play applies this credit to the new subscription, and does
+ * not begin billing the user for the new subscription until after
+ * the credit is used up.
+ * If you set this field to false, the user does not receive credit for
+ * any unused subscription time and the recurrence date does not
+ * change.
+ * Default value is true. Ignored if you do not pass skusToReplace.
+ * "accountId" - String - an optional obfuscated string that is uniquely
+ * associated with the user's account in your app.
+ * If you pass this value, Google Play can use it to detect irregular
+ * activity, such as many devices making purchases on the same
+ * account in a short period of time.
+ * Do not use the developer ID or the user's Google ID for this field.
+ * In addition, this field should not contain the user's ID in
+ * cleartext.
+ * We recommend that you use a one-way hash to generate a string from
+ * the user's ID, and store the hashed string in this field.
+ * "vr" - Boolean - an optional flag indicating whether the returned intent
+ * should start a VR purchase flow. The apiVersion must also be 7 or
+ * later to use this flag.
+ */
+ @Override public android.os.Bundle getBuyIntentExtraParams(int apiVersion, java.lang.String packageName, java.lang.String sku, java.lang.String type, java.lang.String developerPayload, android.os.Bundle extraParams) throws android.os.RemoteException
+ {
+ android.os.Parcel _data = android.os.Parcel.obtain();
+ android.os.Parcel _reply = android.os.Parcel.obtain();
+ android.os.Bundle _result;
+ try {
+ _data.writeInterfaceToken(DESCRIPTOR);
+ _data.writeInt(apiVersion);
+ _data.writeString(packageName);
+ _data.writeString(sku);
+ _data.writeString(type);
+ _data.writeString(developerPayload);
+ if ((extraParams!=null)) {
+ _data.writeInt(1);
+ extraParams.writeToParcel(_data, 0);
+ }
+ else {
+ _data.writeInt(0);
+ }
+ mRemote.transact(Stub.TRANSACTION_getBuyIntentExtraParams, _data, _reply, 0);
+ _reply.readException();
+ if ((0!=_reply.readInt())) {
+ _result = android.os.Bundle.CREATOR.createFromParcel(_reply);
+ }
+ else {
+ _result = null;
+ }
+ }
+ finally {
+ _reply.recycle();
+ _data.recycle();
+ }
+ return _result;
+ }
+ /**
+ * Returns the most recent purchase made by the user for each SKU, even if that purchase is
+ * expired, canceled, or consumed.
+ * @param apiVersion billing API version that the app is using, must be 6 or later
+ * @param packageName package name of the calling app
+ * @param type of the in-app items being requested ("inapp" for one-time purchases
+ * and "subs" for subscriptions)
+ * @param continuationToken to be set as null for the first call, if the number of owned
+ * skus is too large, a continuationToken is returned in the response bundle.
+ * This method can be called again with the continuation token to get the next set of
+ * owned skus.
+ * @param extraParams a Bundle with extra params that would be appended into http request
+ * query string. Not used at this moment. Reserved for future functionality.
+ * @return Bundle containing the following key-value pairs
+ * "RESPONSE_CODE" with int value: RESULT_OK(0) if success,
+ * {@link IabHelper#BILLING_RESPONSE_RESULT_*} response codes on failures.
+ *
+ * "INAPP_PURCHASE_ITEM_LIST" - ArrayList containing the list of SKUs
+ * "INAPP_PURCHASE_DATA_LIST" - ArrayList containing the purchase information
+ * "INAPP_DATA_SIGNATURE_LIST"- ArrayList containing the signatures
+ * of the purchase information
+ * "INAPP_CONTINUATION_TOKEN" - String containing a continuation token for the
+ * next set of in-app purchases. Only set if the
+ * user has more owned skus than the current list.
+ */
+ @Override public android.os.Bundle getPurchaseHistory(int apiVersion, java.lang.String packageName, java.lang.String type, java.lang.String continuationToken, android.os.Bundle extraParams) throws android.os.RemoteException
+ {
+ android.os.Parcel _data = android.os.Parcel.obtain();
+ android.os.Parcel _reply = android.os.Parcel.obtain();
+ android.os.Bundle _result;
+ try {
+ _data.writeInterfaceToken(DESCRIPTOR);
+ _data.writeInt(apiVersion);
+ _data.writeString(packageName);
+ _data.writeString(type);
+ _data.writeString(continuationToken);
+ if ((extraParams!=null)) {
+ _data.writeInt(1);
+ extraParams.writeToParcel(_data, 0);
+ }
+ else {
+ _data.writeInt(0);
+ }
+ mRemote.transact(Stub.TRANSACTION_getPurchaseHistory, _data, _reply, 0);
+ _reply.readException();
+ if ((0!=_reply.readInt())) {
+ _result = android.os.Bundle.CREATOR.createFromParcel(_reply);
+ }
+ else {
+ _result = null;
+ }
+ }
+ finally {
+ _reply.recycle();
+ _data.recycle();
+ }
+ return _result;
+ }
+ @Override public int isBillingSupportedExtraParams(int apiVersion, java.lang.String packageName, java.lang.String type, android.os.Bundle extraParams) throws android.os.RemoteException
+ {
+ android.os.Parcel _data = android.os.Parcel.obtain();
+ android.os.Parcel _reply = android.os.Parcel.obtain();
+ int _result;
+ try {
+ _data.writeInterfaceToken(DESCRIPTOR);
+ _data.writeInt(apiVersion);
+ _data.writeString(packageName);
+ _data.writeString(type);
+ if ((extraParams!=null)) {
+ _data.writeInt(1);
+ extraParams.writeToParcel(_data, 0);
+ }
+ else {
+ _data.writeInt(0);
+ }
+ mRemote.transact(Stub.TRANSACTION_isBillingSupportedExtraParams, _data, _reply, 0);
+ _reply.readException();
+ _result = _reply.readInt();
+ }
+ finally {
+ _reply.recycle();
+ _data.recycle();
+ }
+ return _result;
+ }
+ }
+ static final int TRANSACTION_isBillingSupported = (android.os.IBinder.FIRST_CALL_TRANSACTION + 0);
+ static final int TRANSACTION_getSkuDetails = (android.os.IBinder.FIRST_CALL_TRANSACTION + 1);
+ static final int TRANSACTION_getBuyIntent = (android.os.IBinder.FIRST_CALL_TRANSACTION + 2);
+ static final int TRANSACTION_getPurchases = (android.os.IBinder.FIRST_CALL_TRANSACTION + 3);
+ static final int TRANSACTION_consumePurchase = (android.os.IBinder.FIRST_CALL_TRANSACTION + 4);
+ static final int TRANSACTION_stub = (android.os.IBinder.FIRST_CALL_TRANSACTION + 5);
+ static final int TRANSACTION_getBuyIntentToReplaceSkus = (android.os.IBinder.FIRST_CALL_TRANSACTION + 6);
+ static final int TRANSACTION_getBuyIntentExtraParams = (android.os.IBinder.FIRST_CALL_TRANSACTION + 7);
+ static final int TRANSACTION_getPurchaseHistory = (android.os.IBinder.FIRST_CALL_TRANSACTION + 8);
+ static final int TRANSACTION_isBillingSupportedExtraParams = (android.os.IBinder.FIRST_CALL_TRANSACTION + 9);
+ }
+ public int isBillingSupported(int apiVersion, java.lang.String packageName, java.lang.String type) throws android.os.RemoteException;
+ /**
+ * Provides details of a list of SKUs
+ * Given a list of SKUs of a valid type in the skusBundle, this returns a bundle
+ * with a list JSON strings containing the productId, price, title and description.
+ * This API can be called with a maximum of 20 SKUs.
+ * @param apiVersion billing API version that the app is using
+ * @param packageName the package name of the calling app
+ * @param type of the in-app items ("inapp" for one-time purchases
+ * and "subs" for subscriptions)
+ * @param skusBundle bundle containing a StringArrayList of SKUs with key "ITEM_ID_LIST"
+ * @return Bundle containing the following key-value pairs
+ * "RESPONSE_CODE" with int value, RESULT_OK(0) if success, appropriate response codes
+ * on failures.
+ * "DETAILS_LIST" with a StringArrayList containing purchase information
+ * in JSON format similar to:
+ * '{ "productId" : "exampleSku",
+ * "type" : "inapp",
+ * "price" : "$5.00",
+ * "price_currency": "USD",
+ * "price_amount_micros": 5000000,
+ * "title : "Example Title",
+ * "description" : "This is an example description" }'
+ */
+ public android.os.Bundle getSkuDetails(int apiVersion, java.lang.String packageName, java.lang.String type, android.os.Bundle skusBundle) throws android.os.RemoteException;
+ /**
+ * Returns a pending intent to launch the purchase flow for an in-app item by providing a SKU,
+ * the type, a unique purchase token and an optional developer payload.
+ * @param apiVersion billing API version that the app is using
+ * @param packageName package name of the calling app
+ * @param sku the SKU of the in-app item as published in the developer console
+ * @param type of the in-app item being purchased ("inapp" for one-time purchases
+ * and "subs" for subscriptions)
+ * @param developerPayload optional argument to be sent back with the purchase information
+ * @return Bundle containing the following key-value pairs
+ * "RESPONSE_CODE" with int value, RESULT_OK(0) if success, appropriate response codes
+ * on failures.
+ * "BUY_INTENT" - PendingIntent to start the purchase flow
+ *
+ * The Pending intent should be launched with startIntentSenderForResult. When purchase flow
+ * has completed, the onActivityResult() will give a resultCode of OK or CANCELED.
+ * If the purchase is successful, the result data will contain the following key-value pairs
+ * "RESPONSE_CODE" with int value, RESULT_OK(0) if success, appropriate response
+ * codes on failures.
+ * "INAPP_PURCHASE_DATA" - String in JSON format similar to
+ * '{"orderId":"12999763169054705758.1371079406387615",
+ * "packageName":"com.example.app",
+ * "productId":"exampleSku",
+ * "purchaseTime":1345678900000,
+ * "purchaseToken" : "122333444455555",
+ * "developerPayload":"example developer payload" }'
+ * "INAPP_DATA_SIGNATURE" - String containing the signature of the purchase data that
+ * was signed with the private key of the developer
+ */
+ public android.os.Bundle getBuyIntent(int apiVersion, java.lang.String packageName, java.lang.String sku, java.lang.String type, java.lang.String developerPayload) throws android.os.RemoteException;
+ /**
+ * Returns the current SKUs owned by the user of the type and package name specified along with
+ * purchase information and a signature of the data to be validated.
+ * This will return all SKUs that have been purchased in V3 and managed items purchased using
+ * V1 and V2 that have not been consumed.
+ * @param apiVersion billing API version that the app is using
+ * @param packageName package name of the calling app
+ * @param type of the in-app items being requested ("inapp" for one-time purchases
+ * and "subs" for subscriptions)
+ * @param continuationToken to be set as null for the first call, if the number of owned
+ * skus are too many, a continuationToken is returned in the response bundle.
+ * This method can be called again with the continuation token to get the next set of
+ * owned skus.
+ * @return Bundle containing the following key-value pairs
+ * "RESPONSE_CODE" with int value, RESULT_OK(0) if success, appropriate response codes
+ on failures.
+ * "INAPP_PURCHASE_ITEM_LIST" - StringArrayList containing the list of SKUs
+ * "INAPP_PURCHASE_DATA_LIST" - StringArrayList containing the purchase information
+ * "INAPP_DATA_SIGNATURE_LIST"- StringArrayList containing the signatures
+ * of the purchase information
+ * "INAPP_CONTINUATION_TOKEN" - String containing a continuation token for the
+ * next set of in-app purchases. Only set if the
+ * user has more owned skus than the current list.
+ */
+ public android.os.Bundle getPurchases(int apiVersion, java.lang.String packageName, java.lang.String type, java.lang.String continuationToken) throws android.os.RemoteException;
+ public int consumePurchase(int apiVersion, java.lang.String packageName, java.lang.String purchaseToken) throws android.os.RemoteException;
+ public int stub(int apiVersion, java.lang.String packageName, java.lang.String type) throws android.os.RemoteException;
+ /**
+ * Returns a pending intent to launch the purchase flow for upgrading or downgrading a
+ * subscription. The existing owned SKU(s) should be provided along with the new SKU that
+ * the user is upgrading or downgrading to.
+ * @param apiVersion billing API version that the app is using, must be 5 or later
+ * @param packageName package name of the calling app
+ * @param oldSkus the SKU(s) that the user is upgrading or downgrading from,
+ * if null or empty this method will behave like {@link #getBuyIntent}
+ * @param newSku the SKU that the user is upgrading or downgrading to
+ * @param type of the item being purchased, currently must be "subs"
+ * @param developerPayload optional argument to be sent back with the purchase information
+ * @return Bundle containing the following key-value pairs
+ * "RESPONSE_CODE" with int value, RESULT_OK(0) if success, appropriate response codes
+ * on failures.
+ * "BUY_INTENT" - PendingIntent to start the purchase flow
+ *
+ * The Pending intent should be launched with startIntentSenderForResult. When purchase flow
+ * has completed, the onActivityResult() will give a resultCode of OK or CANCELED.
+ * If the purchase is successful, the result data will contain the following key-value pairs
+ * "RESPONSE_CODE" with int value, RESULT_OK(0) if success, appropriate response
+ * codes on failures.
+ * "INAPP_PURCHASE_DATA" - String in JSON format similar to
+ * '{"orderId":"12999763169054705758.1371079406387615",
+ * "packageName":"com.example.app",
+ * "productId":"exampleSku",
+ * "purchaseTime":1345678900000,
+ * "purchaseToken" : "122333444455555",
+ * "developerPayload":"example developer payload" }'
+ * "INAPP_DATA_SIGNATURE" - String containing the signature of the purchase data that
+ * was signed with the private key of the developer
+ */
+ public android.os.Bundle getBuyIntentToReplaceSkus(int apiVersion, java.lang.String packageName, java.util.List oldSkus, java.lang.String newSku, java.lang.String type, java.lang.String developerPayload) throws android.os.RemoteException;
+ /**
+ * Returns a pending intent to launch the purchase flow for an in-app item. This method is
+ * a variant of the {@link #getBuyIntent} method and takes an additional {@code extraParams}
+ * parameter. This parameter is a Bundle of optional keys and values that affect the
+ * operation of the method.
+ * @param apiVersion billing API version that the app is using, must be 6 or later
+ * @param packageName package name of the calling app
+ * @param sku the SKU of the in-app item as published in the developer console
+ * @param type of the in-app item being purchased ("inapp" for one-time purchases
+ * and "subs" for subscriptions)
+ * @param developerPayload optional argument to be sent back with the purchase information
+ * @extraParams a Bundle with the following optional keys:
+ * "skusToReplace" - List - an optional list of SKUs that the user is
+ * upgrading or downgrading from.
+ * Pass this field if the purchase is upgrading or downgrading
+ * existing subscriptions.
+ * The specified SKUs are replaced with the SKUs that the user is
+ * purchasing. Google Play replaces the specified SKUs at the start of
+ * the next billing cycle.
+ * "replaceSkusProration" - Boolean - whether the user should be credited for any unused
+ * subscription time on the SKUs they are upgrading or downgrading.
+ * If you set this field to true, Google Play swaps out the old SKUs
+ * and credits the user with the unused value of their subscription
+ * time on a pro-rated basis.
+ * Google Play applies this credit to the new subscription, and does
+ * not begin billing the user for the new subscription until after
+ * the credit is used up.
+ * If you set this field to false, the user does not receive credit for
+ * any unused subscription time and the recurrence date does not
+ * change.
+ * Default value is true. Ignored if you do not pass skusToReplace.
+ * "accountId" - String - an optional obfuscated string that is uniquely
+ * associated with the user's account in your app.
+ * If you pass this value, Google Play can use it to detect irregular
+ * activity, such as many devices making purchases on the same
+ * account in a short period of time.
+ * Do not use the developer ID or the user's Google ID for this field.
+ * In addition, this field should not contain the user's ID in
+ * cleartext.
+ * We recommend that you use a one-way hash to generate a string from
+ * the user's ID, and store the hashed string in this field.
+ * "vr" - Boolean - an optional flag indicating whether the returned intent
+ * should start a VR purchase flow. The apiVersion must also be 7 or
+ * later to use this flag.
+ */
+ public android.os.Bundle getBuyIntentExtraParams(int apiVersion, java.lang.String packageName, java.lang.String sku, java.lang.String type, java.lang.String developerPayload, android.os.Bundle extraParams) throws android.os.RemoteException;
+ /**
+ * Returns the most recent purchase made by the user for each SKU, even if that purchase is
+ * expired, canceled, or consumed.
+ * @param apiVersion billing API version that the app is using, must be 6 or later
+ * @param packageName package name of the calling app
+ * @param type of the in-app items being requested ("inapp" for one-time purchases
+ * and "subs" for subscriptions)
+ * @param continuationToken to be set as null for the first call, if the number of owned
+ * skus is too large, a continuationToken is returned in the response bundle.
+ * This method can be called again with the continuation token to get the next set of
+ * owned skus.
+ * @param extraParams a Bundle with extra params that would be appended into http request
+ * query string. Not used at this moment. Reserved for future functionality.
+ * @return Bundle containing the following key-value pairs
+ * "RESPONSE_CODE" with int value: RESULT_OK(0) if success,
+ * {@link IabHelper#BILLING_RESPONSE_RESULT_*} response codes on failures.
+ *
+ * "INAPP_PURCHASE_ITEM_LIST" - ArrayList containing the list of SKUs
+ * "INAPP_PURCHASE_DATA_LIST" - ArrayList containing the purchase information
+ * "INAPP_DATA_SIGNATURE_LIST"- ArrayList containing the signatures
+ * of the purchase information
+ * "INAPP_CONTINUATION_TOKEN" - String containing a continuation token for the
+ * next set of in-app purchases. Only set if the
+ * user has more owned skus than the current list.
+ */
+ public android.os.Bundle getPurchaseHistory(int apiVersion, java.lang.String packageName, java.lang.String type, java.lang.String continuationToken, android.os.Bundle extraParams) throws android.os.RemoteException;
+ public int isBillingSupportedExtraParams(int apiVersion, java.lang.String packageName, java.lang.String type, android.os.Bundle extraParams) throws android.os.RemoteException;
+ }
diff --git a/examples/AnalyticsCollection/Builds/Android/app/src/main/java/com/yourcompany/analyticscollection/AnalyticsCollection.java b/examples/AnalyticsCollection/Builds/Android/app/src/main/java/com/yourcompany/analyticscollection/AnalyticsCollection.java
new file mode 100644
index 0000000000..ad3029234b
--- /dev/null
+++ b/examples/AnalyticsCollection/Builds/Android/app/src/main/java/com/yourcompany/analyticscollection/AnalyticsCollection.java
@@ -0,0 +1,1584 @@
+/*
+ ==============================================================================
+
+ This file is part of the JUCE library.
+ Copyright (c) 2017 - ROLI Ltd.
+
+ JUCE is an open source library subject to commercial or open-source
+ licensing.
+
+ The code included in this file is provided under the terms of the ISC license
+ http://www.isc.org/downloads/software-support-policy/isc-license. Permission
+ To use, copy, modify, and/or distribute this software for any purpose with or
+ without fee is hereby granted provided that the above copyright notice and
+ this permission notice appear in all copies.
+
+ JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER
+ EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE
+ DISCLAIMED.
+
+ ==============================================================================
+*/
+
+package com.yourcompany.analyticscollection;
+
+import android.app.Activity;
+import android.app.AlertDialog;
+import android.content.DialogInterface;
+import android.content.Context;
+import android.content.Intent;
+import android.content.res.Configuration;
+import android.content.pm.PackageInfo;
+import android.content.pm.PackageManager;
+import android.net.Uri;
+import android.os.Bundle;
+import android.os.Looper;
+import android.os.Handler;
+import android.os.ParcelUuid;
+import android.os.Environment;
+import android.view.*;
+import android.view.inputmethod.BaseInputConnection;
+import android.view.inputmethod.EditorInfo;
+import android.view.inputmethod.InputConnection;
+import android.view.inputmethod.InputMethodManager;
+import android.graphics.*;
+import android.text.ClipboardManager;
+import android.text.InputType;
+import android.util.DisplayMetrics;
+import android.util.Log;
+import android.util.Pair;
+import java.lang.Runnable;
+import java.lang.ref.WeakReference;
+import java.lang.reflect.*;
+import java.util.*;
+import java.io.*;
+import java.net.URL;
+import java.net.HttpURLConnection;
+import android.media.AudioManager;
+import android.Manifest;
+import java.util.concurrent.CancellationException;
+import java.util.concurrent.Future;
+import java.util.concurrent.Executors;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.ExecutionException;
+import java.util.concurrent.TimeUnit;
+import java.util.concurrent.Callable;
+import java.util.concurrent.TimeoutException;
+import java.util.concurrent.locks.ReentrantLock;
+import java.util.concurrent.atomic.*;
+
+
+
+//==============================================================================
+public class AnalyticsCollection extends Activity
+{
+ //==============================================================================
+ static
+ {
+ System.loadLibrary ("juce_jni");
+ }
+
+ //==============================================================================
+ public boolean isPermissionDeclaredInManifest (int permissionID)
+ {
+ String permissionToCheck = getAndroidPermissionName(permissionID);
+
+ try
+ {
+ PackageInfo info = getPackageManager().getPackageInfo(getApplicationContext().getPackageName(), PackageManager.GET_PERMISSIONS);
+
+ if (info.requestedPermissions != null)
+ for (String permission : info.requestedPermissions)
+ if (permission.equals (permissionToCheck))
+ return true;
+ }
+ catch (PackageManager.NameNotFoundException e)
+ {
+ Log.d ("JUCE", "isPermissionDeclaredInManifest: PackageManager.NameNotFoundException = " + e.toString());
+ }
+
+ Log.d ("JUCE", "isPermissionDeclaredInManifest: could not find requested permission " + permissionToCheck);
+ return false;
+ }
+
+ //==============================================================================
+ // these have to match the values of enum PermissionID in C++ class RuntimePermissions:
+ private static final int JUCE_PERMISSIONS_RECORD_AUDIO = 1;
+ private static final int JUCE_PERMISSIONS_BLUETOOTH_MIDI = 2;
+ private static final int JUCE_PERMISSIONS_READ_EXTERNAL_STORAGE = 3;
+ private static final int JUCE_PERMISSIONS_WRITE_EXTERNAL_STORAGE = 4;
+
+ private static String getAndroidPermissionName (int permissionID)
+ {
+ switch (permissionID)
+ {
+ case JUCE_PERMISSIONS_RECORD_AUDIO: return Manifest.permission.RECORD_AUDIO;
+ case JUCE_PERMISSIONS_BLUETOOTH_MIDI: return Manifest.permission.ACCESS_COARSE_LOCATION;
+ // use string value as this is not defined in SDKs < 16
+ case JUCE_PERMISSIONS_READ_EXTERNAL_STORAGE: return "android.permission.READ_EXTERNAL_STORAGE";
+ case JUCE_PERMISSIONS_WRITE_EXTERNAL_STORAGE: return Manifest.permission.WRITE_EXTERNAL_STORAGE;
+ }
+
+ // unknown permission ID!
+ assert false;
+ return new String();
+ }
+
+ public boolean isPermissionGranted (int permissionID)
+ {
+ return getApplicationContext().checkCallingOrSelfPermission (getAndroidPermissionName (permissionID)) == PackageManager.PERMISSION_GRANTED;
+ }
+
+ private Map permissionCallbackPtrMap;
+
+ public void requestRuntimePermission (int permissionID, long ptrToCallback)
+ {
+ String permissionName = getAndroidPermissionName (permissionID);
+
+ if (getApplicationContext().checkCallingOrSelfPermission (permissionName) != PackageManager.PERMISSION_GRANTED)
+ {
+ // remember callbackPtr, request permissions, and let onRequestPermissionResult call callback asynchronously
+ permissionCallbackPtrMap.put (permissionID, ptrToCallback);
+ requestPermissionsCompat (new String[]{permissionName}, permissionID);
+ }
+ else
+ {
+ // permissions were already granted before, we can call callback directly
+ androidRuntimePermissionsCallback (true, ptrToCallback);
+ }
+ }
+
+ private native void androidRuntimePermissionsCallback (boolean permissionWasGranted, long ptrToCallback);
+
+
+ //==============================================================================
+ public interface JuceMidiPort
+ {
+ boolean isInputPort();
+
+ // start, stop does nothing on an output port
+ void start();
+ void stop();
+
+ void close();
+
+ // send will do nothing on an input port
+ void sendMidi (byte[] msg, int offset, int count);
+ }
+
+ //==============================================================================
+ //==============================================================================
+ public class BluetoothManager
+ {
+ BluetoothManager()
+ {
+ }
+
+ public String[] getMidiBluetoothAddresses()
+ {
+ String[] bluetoothAddresses = new String[0];
+ return bluetoothAddresses;
+ }
+
+ public String getHumanReadableStringForBluetoothAddress (String address)
+ {
+ return address;
+ }
+
+ public int getBluetoothDeviceStatus (String address)
+ {
+ return 0;
+ }
+
+ public void startStopScan (boolean shouldStart)
+ {
+ }
+
+ public boolean pairBluetoothMidiDevice(String address)
+ {
+ return false;
+ }
+
+ public void unpairBluetoothMidiDevice (String address)
+ {
+ }
+ }
+
+ //==============================================================================
+ public class MidiDeviceManager
+ {
+ public MidiDeviceManager()
+ {
+ }
+
+ public String[] getJuceAndroidMidiInputDevices()
+ {
+ return new String[0];
+ }
+
+ public String[] getJuceAndroidMidiOutputDevices()
+ {
+ return new String[0];
+ }
+
+ public JuceMidiPort openMidiInputPortWithJuceIndex (int index, long host)
+ {
+ return null;
+ }
+
+ public JuceMidiPort openMidiOutputPortWithJuceIndex (int index)
+ {
+ return null;
+ }
+
+ public String getInputPortNameForJuceIndex (int index)
+ {
+ return "";
+ }
+
+ public String getOutputPortNameForJuceIndex (int index)
+ {
+ return "";
+ }
+ }
+
+
+ public MidiDeviceManager getAndroidMidiDeviceManager()
+ {
+ return null;
+ }
+
+ public BluetoothManager getAndroidBluetoothManager()
+ {
+ return null;
+ }
+
+ //==============================================================================
+ @Override
+ public void onCreate (Bundle savedInstanceState)
+ {
+ super.onCreate (savedInstanceState);
+
+ isScreenSaverEnabled = true;
+ hideActionBar();
+ viewHolder = new ViewHolder (this);
+ setContentView (viewHolder);
+
+ setVolumeControlStream (AudioManager.STREAM_MUSIC);
+
+ permissionCallbackPtrMap = new HashMap();
+ }
+
+ @Override
+ protected void onDestroy()
+ {
+ quitApp();
+ super.onDestroy();
+
+ clearDataCache();
+ }
+
+ @Override
+ protected void onPause()
+ {
+ suspendApp();
+
+ try
+ {
+ Thread.sleep (1000); // This is a bit of a hack to avoid some hard-to-track-down
+ // openGL glitches when pausing/resuming apps..
+ } catch (InterruptedException e) {}
+
+ super.onPause();
+ }
+
+ @Override
+ protected void onResume()
+ {
+ super.onResume();
+ resumeApp();
+ }
+
+ @Override
+ public void onConfigurationChanged (Configuration cfg)
+ {
+ super.onConfigurationChanged (cfg);
+ setContentView (viewHolder);
+ }
+
+ private void callAppLauncher()
+ {
+ launchApp (getApplicationInfo().publicSourceDir,
+ getApplicationInfo().dataDir);
+ }
+
+ //==============================================================================
+ private void hideActionBar()
+ {
+ // get "getActionBar" method
+ java.lang.reflect.Method getActionBarMethod = null;
+ try
+ {
+ getActionBarMethod = this.getClass().getMethod ("getActionBar");
+ }
+ catch (SecurityException e) { return; }
+ catch (NoSuchMethodException e) { return; }
+ if (getActionBarMethod == null) return;
+
+ // invoke "getActionBar" method
+ Object actionBar = null;
+ try
+ {
+ actionBar = getActionBarMethod.invoke (this);
+ }
+ catch (java.lang.IllegalArgumentException e) { return; }
+ catch (java.lang.IllegalAccessException e) { return; }
+ catch (java.lang.reflect.InvocationTargetException e) { return; }
+ if (actionBar == null) return;
+
+ // get "hide" method
+ java.lang.reflect.Method actionBarHideMethod = null;
+ try
+ {
+ actionBarHideMethod = actionBar.getClass().getMethod ("hide");
+ }
+ catch (SecurityException e) { return; }
+ catch (NoSuchMethodException e) { return; }
+ if (actionBarHideMethod == null) return;
+
+ // invoke "hide" method
+ try
+ {
+ actionBarHideMethod.invoke (actionBar);
+ }
+ catch (java.lang.IllegalArgumentException e) {}
+ catch (java.lang.IllegalAccessException e) {}
+ catch (java.lang.reflect.InvocationTargetException e) {}
+ }
+
+ void requestPermissionsCompat (String[] permissions, int requestCode)
+ {
+ Method requestPermissionsMethod = null;
+ try
+ {
+ requestPermissionsMethod = this.getClass().getMethod ("requestPermissions",
+ String[].class, int.class);
+ }
+ catch (SecurityException e) { return; }
+ catch (NoSuchMethodException e) { return; }
+ if (requestPermissionsMethod == null) return;
+
+ try
+ {
+ requestPermissionsMethod.invoke (this, permissions, requestCode);
+ }
+ catch (java.lang.IllegalArgumentException e) {}
+ catch (java.lang.IllegalAccessException e) {}
+ catch (java.lang.reflect.InvocationTargetException e) {}
+ }
+
+ //==============================================================================
+ private native void launchApp (String appFile, String appDataDir);
+ private native void quitApp();
+ private native void suspendApp();
+ private native void resumeApp();
+ private native void setScreenSize (int screenWidth, int screenHeight, int dpi);
+ private native void appActivityResult (int requestCode, int resultCode, Intent data);
+ private native void appNewIntent (Intent intent);
+
+ //==============================================================================
+ private ViewHolder viewHolder;
+ private MidiDeviceManager midiDeviceManager = null;
+ private BluetoothManager bluetoothManager = null;
+ private boolean isScreenSaverEnabled;
+ private java.util.Timer keepAliveTimer;
+
+ public final ComponentPeerView createNewView (boolean opaque, long host)
+ {
+ ComponentPeerView v = new ComponentPeerView (this, opaque, host);
+ viewHolder.addView (v);
+ return v;
+ }
+
+ public final void deleteView (ComponentPeerView view)
+ {
+ view.host = 0;
+
+ ViewGroup group = (ViewGroup) (view.getParent());
+
+ if (group != null)
+ group.removeView (view);
+ }
+
+ public final void deleteNativeSurfaceView (NativeSurfaceView view)
+ {
+ ViewGroup group = (ViewGroup) (view.getParent());
+
+ if (group != null)
+ group.removeView (view);
+ }
+
+ final class ViewHolder extends ViewGroup
+ {
+ public ViewHolder (Context context)
+ {
+ super (context);
+ setDescendantFocusability (ViewGroup.FOCUS_AFTER_DESCENDANTS);
+ setFocusable (false);
+ }
+
+ protected final void onLayout (boolean changed, int left, int top, int right, int bottom)
+ {
+ setScreenSize (getWidth(), getHeight(), getDPI());
+
+ if (isFirstResize)
+ {
+ isFirstResize = false;
+ callAppLauncher();
+ }
+ }
+
+ private final int getDPI()
+ {
+ DisplayMetrics metrics = new DisplayMetrics();
+ getWindowManager().getDefaultDisplay().getMetrics (metrics);
+ return metrics.densityDpi;
+ }
+
+ private boolean isFirstResize = true;
+ }
+
+ public final void excludeClipRegion (android.graphics.Canvas canvas, float left, float top, float right, float bottom)
+ {
+ canvas.clipRect (left, top, right, bottom, android.graphics.Region.Op.DIFFERENCE);
+ }
+
+ //==============================================================================
+ public final void setScreenSaver (boolean enabled)
+ {
+ if (isScreenSaverEnabled != enabled)
+ {
+ isScreenSaverEnabled = enabled;
+
+ if (keepAliveTimer != null)
+ {
+ keepAliveTimer.cancel();
+ keepAliveTimer = null;
+ }
+
+ if (enabled)
+ {
+ getWindow().clearFlags (WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
+ }
+ else
+ {
+ getWindow().addFlags (WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
+
+ // If no user input is received after about 3 seconds, the OS will lower the
+ // task's priority, so this timer forces it to be kept active.
+ keepAliveTimer = new java.util.Timer();
+
+ keepAliveTimer.scheduleAtFixedRate (new TimerTask()
+ {
+ @Override
+ public void run()
+ {
+ android.app.Instrumentation instrumentation = new android.app.Instrumentation();
+
+ try
+ {
+ instrumentation.sendKeyDownUpSync (KeyEvent.KEYCODE_UNKNOWN);
+ }
+ catch (Exception e)
+ {
+ }
+ }
+ }, 2000, 2000);
+ }
+ }
+ }
+
+ public final boolean getScreenSaver()
+ {
+ return isScreenSaverEnabled;
+ }
+
+ //==============================================================================
+ public final String getClipboardContent()
+ {
+ ClipboardManager clipboard = (ClipboardManager) getSystemService (CLIPBOARD_SERVICE);
+ return clipboard.getText().toString();
+ }
+
+ public final void setClipboardContent (String newText)
+ {
+ ClipboardManager clipboard = (ClipboardManager) getSystemService (CLIPBOARD_SERVICE);
+ clipboard.setText (newText);
+ }
+
+ //==============================================================================
+ public final void showMessageBox (String title, String message, final long callback)
+ {
+ AlertDialog.Builder builder = new AlertDialog.Builder (this);
+ builder.setTitle (title)
+ .setMessage (message)
+ .setCancelable (true)
+ .setOnCancelListener (new DialogInterface.OnCancelListener()
+ {
+ public void onCancel (DialogInterface dialog)
+ {
+ AnalyticsCollection.this.alertDismissed (callback, 0);
+ }
+ })
+ .setPositiveButton ("OK", new DialogInterface.OnClickListener()
+ {
+ public void onClick (DialogInterface dialog, int id)
+ {
+ dialog.dismiss();
+ AnalyticsCollection.this.alertDismissed (callback, 0);
+ }
+ });
+
+ builder.create().show();
+ }
+
+ public final void showOkCancelBox (String title, String message, final long callback,
+ String okButtonText, String cancelButtonText)
+ {
+ AlertDialog.Builder builder = new AlertDialog.Builder (this);
+ builder.setTitle (title)
+ .setMessage (message)
+ .setCancelable (true)
+ .setOnCancelListener (new DialogInterface.OnCancelListener()
+ {
+ public void onCancel (DialogInterface dialog)
+ {
+ AnalyticsCollection.this.alertDismissed (callback, 0);
+ }
+ })
+ .setPositiveButton (okButtonText.isEmpty() ? "OK" : okButtonText, new DialogInterface.OnClickListener()
+ {
+ public void onClick (DialogInterface dialog, int id)
+ {
+ dialog.dismiss();
+ AnalyticsCollection.this.alertDismissed (callback, 1);
+ }
+ })
+ .setNegativeButton (cancelButtonText.isEmpty() ? "Cancel" : cancelButtonText, new DialogInterface.OnClickListener()
+ {
+ public void onClick (DialogInterface dialog, int id)
+ {
+ dialog.dismiss();
+ AnalyticsCollection.this.alertDismissed (callback, 0);
+ }
+ });
+
+ builder.create().show();
+ }
+
+ public final void showYesNoCancelBox (String title, String message, final long callback)
+ {
+ AlertDialog.Builder builder = new AlertDialog.Builder (this);
+ builder.setTitle (title)
+ .setMessage (message)
+ .setCancelable (true)
+ .setOnCancelListener (new DialogInterface.OnCancelListener()
+ {
+ public void onCancel (DialogInterface dialog)
+ {
+ AnalyticsCollection.this.alertDismissed (callback, 0);
+ }
+ })
+ .setPositiveButton ("Yes", new DialogInterface.OnClickListener()
+ {
+ public void onClick (DialogInterface dialog, int id)
+ {
+ dialog.dismiss();
+ AnalyticsCollection.this.alertDismissed (callback, 1);
+ }
+ })
+ .setNegativeButton ("No", new DialogInterface.OnClickListener()
+ {
+ public void onClick (DialogInterface dialog, int id)
+ {
+ dialog.dismiss();
+ AnalyticsCollection.this.alertDismissed (callback, 2);
+ }
+ })
+ .setNeutralButton ("Cancel", new DialogInterface.OnClickListener()
+ {
+ public void onClick (DialogInterface dialog, int id)
+ {
+ dialog.dismiss();
+ AnalyticsCollection.this.alertDismissed (callback, 0);
+ }
+ });
+
+ builder.create().show();
+ }
+
+ public native void alertDismissed (long callback, int id);
+
+ //==============================================================================
+ public final class ComponentPeerView extends ViewGroup
+ implements View.OnFocusChangeListener
+ {
+ public ComponentPeerView (Context context, boolean opaque_, long host)
+ {
+ super (context);
+ this.host = host;
+ setWillNotDraw (false);
+ opaque = opaque_;
+
+ setFocusable (true);
+ setFocusableInTouchMode (true);
+ setOnFocusChangeListener (this);
+
+ // swap red and blue colours to match internal opengl texture format
+ ColorMatrix colorMatrix = new ColorMatrix();
+
+ float[] colorTransform = { 0, 0, 1.0f, 0, 0,
+ 0, 1.0f, 0, 0, 0,
+ 1.0f, 0, 0, 0, 0,
+ 0, 0, 0, 1.0f, 0 };
+
+ colorMatrix.set (colorTransform);
+ paint.setColorFilter (new ColorMatrixColorFilter (colorMatrix));
+ }
+
+ //==============================================================================
+ private native void handlePaint (long host, Canvas canvas, Paint paint);
+
+ @Override
+ public void onDraw (Canvas canvas)
+ {
+ if (host == 0)
+ return;
+
+ handlePaint (host, canvas, paint);
+ }
+
+ @Override
+ public boolean isOpaque()
+ {
+ return opaque;
+ }
+
+ private boolean opaque;
+ private long host;
+ private Paint paint = new Paint();
+
+ //==============================================================================
+ private native void handleMouseDown (long host, int index, float x, float y, long time);
+ private native void handleMouseDrag (long host, int index, float x, float y, long time);
+ private native void handleMouseUp (long host, int index, float x, float y, long time);
+
+ @Override
+ public boolean onTouchEvent (MotionEvent event)
+ {
+ if (host == 0)
+ return false;
+
+ int action = event.getAction();
+ long time = event.getEventTime();
+
+ switch (action & MotionEvent.ACTION_MASK)
+ {
+ case MotionEvent.ACTION_DOWN:
+ handleMouseDown (host, event.getPointerId(0), event.getX(), event.getY(), time);
+ return true;
+
+ case MotionEvent.ACTION_CANCEL:
+ case MotionEvent.ACTION_UP:
+ handleMouseUp (host, event.getPointerId(0), event.getX(), event.getY(), time);
+ return true;
+
+ case MotionEvent.ACTION_MOVE:
+ {
+ int n = event.getPointerCount();
+ for (int i = 0; i < n; ++i)
+ handleMouseDrag (host, event.getPointerId(i), event.getX(i), event.getY(i), time);
+
+ return true;
+ }
+
+ case MotionEvent.ACTION_POINTER_UP:
+ {
+ int i = (action & MotionEvent.ACTION_POINTER_INDEX_MASK) >> MotionEvent.ACTION_POINTER_INDEX_SHIFT;
+ handleMouseUp (host, event.getPointerId(i), event.getX(i), event.getY(i), time);
+ return true;
+ }
+
+ case MotionEvent.ACTION_POINTER_DOWN:
+ {
+ int i = (action & MotionEvent.ACTION_POINTER_INDEX_MASK) >> MotionEvent.ACTION_POINTER_INDEX_SHIFT;
+ handleMouseDown (host, event.getPointerId(i), event.getX(i), event.getY(i), time);
+ return true;
+ }
+
+ default:
+ break;
+ }
+
+ return false;
+ }
+
+ //==============================================================================
+ private native void handleKeyDown (long host, int keycode, int textchar);
+ private native void handleKeyUp (long host, int keycode, int textchar);
+ private native void handleBackButton (long host);
+
+ public void showKeyboard (String type)
+ {
+ InputMethodManager imm = (InputMethodManager) getSystemService (Context.INPUT_METHOD_SERVICE);
+
+ if (imm != null)
+ {
+ if (type.length() > 0)
+ {
+ imm.showSoftInput (this, android.view.inputmethod.InputMethodManager.SHOW_IMPLICIT);
+ imm.setInputMethod (getWindowToken(), type);
+ }
+ else
+ {
+ imm.hideSoftInputFromWindow (getWindowToken(), 0);
+ }
+ }
+ }
+
+ @Override
+ public boolean onKeyDown (int keyCode, KeyEvent event)
+ {
+ if (host == 0)
+ return false;
+
+ switch (keyCode)
+ {
+ case KeyEvent.KEYCODE_VOLUME_UP:
+ case KeyEvent.KEYCODE_VOLUME_DOWN:
+ return super.onKeyDown (keyCode, event);
+ case KeyEvent.KEYCODE_BACK:
+ {
+ handleBackButton (host);
+ return true;
+ }
+
+ default:
+ break;
+ }
+
+ handleKeyDown (host, keyCode, event.getUnicodeChar());
+ return true;
+ }
+
+ @Override
+ public boolean onKeyUp (int keyCode, KeyEvent event)
+ {
+ if (host == 0)
+ return false;
+
+ handleKeyUp (host, keyCode, event.getUnicodeChar());
+ return true;
+ }
+
+ @Override
+ public boolean onKeyMultiple (int keyCode, int count, KeyEvent event)
+ {
+ if (host == 0)
+ return false;
+
+ if (keyCode != KeyEvent.KEYCODE_UNKNOWN || event.getAction() != KeyEvent.ACTION_MULTIPLE)
+ return super.onKeyMultiple (keyCode, count, event);
+
+ if (event.getCharacters() != null)
+ {
+ int utf8Char = event.getCharacters().codePointAt (0);
+ handleKeyDown (host, utf8Char, utf8Char);
+ return true;
+ }
+
+ return false;
+ }
+
+ // this is here to make keyboard entry work on a Galaxy Tab2 10.1
+ @Override
+ public InputConnection onCreateInputConnection (EditorInfo outAttrs)
+ {
+ outAttrs.actionLabel = "";
+ outAttrs.hintText = "";
+ outAttrs.initialCapsMode = 0;
+ outAttrs.initialSelEnd = outAttrs.initialSelStart = -1;
+ outAttrs.label = "";
+ outAttrs.imeOptions = EditorInfo.IME_ACTION_DONE | EditorInfo.IME_FLAG_NO_EXTRACT_UI;
+ outAttrs.inputType = InputType.TYPE_NULL;
+
+ return new BaseInputConnection (this, false);
+ }
+
+ //==============================================================================
+ @Override
+ protected void onSizeChanged (int w, int h, int oldw, int oldh)
+ {
+ if (host == 0)
+ return;
+
+ super.onSizeChanged (w, h, oldw, oldh);
+ viewSizeChanged (host);
+ }
+
+ @Override
+ protected void onLayout (boolean changed, int left, int top, int right, int bottom)
+ {
+ for (int i = getChildCount(); --i >= 0;)
+ requestTransparentRegion (getChildAt (i));
+ }
+
+ private native void viewSizeChanged (long host);
+
+ @Override
+ public void onFocusChange (View v, boolean hasFocus)
+ {
+ if (host == 0)
+ return;
+
+ if (v == this)
+ focusChanged (host, hasFocus);
+ }
+
+ private native void focusChanged (long host, boolean hasFocus);
+
+ public void setViewName (String newName) {}
+
+ public void setSystemUiVisibilityCompat (int visibility)
+ {
+ Method systemUIVisibilityMethod = null;
+ try
+ {
+ systemUIVisibilityMethod = this.getClass().getMethod ("setSystemUiVisibility", int.class);
+ }
+ catch (SecurityException e) { return; }
+ catch (NoSuchMethodException e) { return; }
+ if (systemUIVisibilityMethod == null) return;
+
+ try
+ {
+ systemUIVisibilityMethod.invoke (this, visibility);
+ }
+ catch (java.lang.IllegalArgumentException e) {}
+ catch (java.lang.IllegalAccessException e) {}
+ catch (java.lang.reflect.InvocationTargetException e) {}
+ }
+
+ public boolean isVisible() { return getVisibility() == VISIBLE; }
+ public void setVisible (boolean b) { setVisibility (b ? VISIBLE : INVISIBLE); }
+
+ public boolean containsPoint (int x, int y)
+ {
+ return true; //xxx needs to check overlapping views
+ }
+ }
+
+ //==============================================================================
+ public static class NativeSurfaceView extends SurfaceView
+ implements SurfaceHolder.Callback
+ {
+ private long nativeContext = 0;
+
+ NativeSurfaceView (Context context, long nativeContextPtr)
+ {
+ super (context);
+ nativeContext = nativeContextPtr;
+ }
+
+ public Surface getNativeSurface()
+ {
+ Surface retval = null;
+
+ SurfaceHolder holder = getHolder();
+ if (holder != null)
+ retval = holder.getSurface();
+
+ return retval;
+ }
+
+ //==============================================================================
+ @Override
+ public void surfaceChanged (SurfaceHolder holder, int format, int width, int height)
+ {
+ surfaceChangedNative (nativeContext, holder, format, width, height);
+ }
+
+ @Override
+ public void surfaceCreated (SurfaceHolder holder)
+ {
+ surfaceCreatedNative (nativeContext, holder);
+ }
+
+ @Override
+ public void surfaceDestroyed (SurfaceHolder holder)
+ {
+ surfaceDestroyedNative (nativeContext, holder);
+ }
+
+ @Override
+ protected void dispatchDraw (Canvas canvas)
+ {
+ super.dispatchDraw (canvas);
+ dispatchDrawNative (nativeContext, canvas);
+ }
+
+ //==============================================================================
+ @Override
+ protected void onAttachedToWindow ()
+ {
+ super.onAttachedToWindow();
+ getHolder().addCallback (this);
+ }
+
+ @Override
+ protected void onDetachedFromWindow ()
+ {
+ super.onDetachedFromWindow();
+ getHolder().removeCallback (this);
+ }
+
+ //==============================================================================
+ private native void dispatchDrawNative (long nativeContextPtr, Canvas canvas);
+ private native void surfaceCreatedNative (long nativeContextptr, SurfaceHolder holder);
+ private native void surfaceDestroyedNative (long nativeContextptr, SurfaceHolder holder);
+ private native void surfaceChangedNative (long nativeContextptr, SurfaceHolder holder,
+ int format, int width, int height);
+ }
+
+ public NativeSurfaceView createNativeSurfaceView (long nativeSurfacePtr)
+ {
+ return new NativeSurfaceView (this, nativeSurfacePtr);
+ }
+
+ //==============================================================================
+ public final int[] renderGlyph (char glyph1, char glyph2, Paint paint, android.graphics.Matrix matrix, Rect bounds)
+ {
+ Path p = new Path();
+
+ char[] str = { glyph1, glyph2 };
+ paint.getTextPath (str, 0, (glyph2 != 0 ? 2 : 1), 0.0f, 0.0f, p);
+
+ RectF boundsF = new RectF();
+ p.computeBounds (boundsF, true);
+ matrix.mapRect (boundsF);
+
+ boundsF.roundOut (bounds);
+ bounds.left--;
+ bounds.right++;
+
+ final int w = bounds.width();
+ final int h = Math.max (1, bounds.height());
+
+ Bitmap bm = Bitmap.createBitmap (w, h, Bitmap.Config.ARGB_8888);
+
+ Canvas c = new Canvas (bm);
+ matrix.postTranslate (-bounds.left, -bounds.top);
+ c.setMatrix (matrix);
+ c.drawPath (p, paint);
+
+ final int sizeNeeded = w * h;
+ if (cachedRenderArray.length < sizeNeeded)
+ cachedRenderArray = new int [sizeNeeded];
+
+ bm.getPixels (cachedRenderArray, 0, w, 0, 0, w, h);
+ bm.recycle();
+ return cachedRenderArray;
+ }
+
+ private int[] cachedRenderArray = new int [256];
+
+ //==============================================================================
+ public static class NativeInvocationHandler implements InvocationHandler
+ {
+ public NativeInvocationHandler (long nativeContextRef)
+ {
+ nativeContext = nativeContextRef;
+ }
+
+ @Override
+ public void finalize()
+ {
+ dispatchFinalize (nativeContext);
+ }
+
+ @Override
+ public Object invoke (Object proxy, Method method, Object[] args) throws Throwable
+ {
+ return dispatchInvoke (nativeContext, proxy, method, args);
+ }
+
+ //==============================================================================
+ private long nativeContext = 0;
+
+ private native void dispatchFinalize (long nativeContextRef);
+ private native Object dispatchInvoke (long nativeContextRef, Object proxy, Method method, Object[] args);
+ }
+
+ public static InvocationHandler createInvocationHandler (long nativeContextRef)
+ {
+ return new NativeInvocationHandler (nativeContextRef);
+ }
+
+ //==============================================================================
+ public static class HTTPStream
+ {
+ public HTTPStream (String address, boolean isPostToUse, byte[] postDataToUse,
+ String headersToUse, int timeOutMsToUse,
+ int[] statusCodeToUse, StringBuffer responseHeadersToUse,
+ int numRedirectsToFollowToUse, String httpRequestCmdToUse) throws IOException
+ {
+ isPost = isPostToUse;
+ postData = postDataToUse;
+ headers = headersToUse;
+ timeOutMs = timeOutMsToUse;
+ statusCode = statusCodeToUse;
+ responseHeaders = responseHeadersToUse;
+ totalLength = -1;
+ numRedirectsToFollow = numRedirectsToFollowToUse;
+ httpRequestCmd = httpRequestCmdToUse;
+
+ connection = createConnection (address, isPost, postData, headers, timeOutMs, httpRequestCmd);
+ }
+
+ private final HttpURLConnection createConnection (String address, boolean isPost, byte[] postData,
+ String headers, int timeOutMs, String httpRequestCmdToUse) throws IOException
+ {
+ HttpURLConnection newConnection = (HttpURLConnection) (new URL(address).openConnection());
+
+ try
+ {
+ newConnection.setInstanceFollowRedirects (false);
+ newConnection.setConnectTimeout (timeOutMs);
+ newConnection.setReadTimeout (timeOutMs);
+
+ // headers - if not empty, this string is appended onto the headers that are used for the request. It must therefore be a valid set of HTML header directives, separated by newlines.
+ // So convert headers string to an array, with an element for each line
+ String headerLines[] = headers.split("\\n");
+
+ // Set request headers
+ for (int i = 0; i < headerLines.length; ++i)
+ {
+ int pos = headerLines[i].indexOf (":");
+
+ if (pos > 0 && pos < headerLines[i].length())
+ {
+ String field = headerLines[i].substring (0, pos);
+ String value = headerLines[i].substring (pos + 1);
+
+ if (value.length() > 0)
+ newConnection.setRequestProperty (field, value);
+ }
+ }
+
+ newConnection.setRequestMethod (httpRequestCmd);
+
+ if (isPost)
+ {
+ newConnection.setDoOutput (true);
+
+ if (postData != null)
+ {
+ OutputStream out = newConnection.getOutputStream();
+ out.write(postData);
+ out.flush();
+ }
+ }
+
+ return newConnection;
+ }
+ catch (Throwable e)
+ {
+ newConnection.disconnect();
+ throw new IOException ("Connection error");
+ }
+ }
+
+ private final InputStream getCancellableStream (final boolean isInput) throws ExecutionException
+ {
+ synchronized (createFutureLock)
+ {
+ if (hasBeenCancelled.get())
+ return null;
+
+ streamFuture = executor.submit (new Callable()
+ {
+ @Override
+ public BufferedInputStream call() throws IOException
+ {
+ return new BufferedInputStream (isInput ? connection.getInputStream()
+ : connection.getErrorStream());
+ }
+ });
+ }
+
+ try
+ {
+ return streamFuture.get();
+ }
+ catch (InterruptedException e)
+ {
+ return null;
+ }
+ catch (CancellationException e)
+ {
+ return null;
+ }
+ }
+
+ public final boolean connect()
+ {
+ boolean result = false;
+ int numFollowedRedirects = 0;
+
+ while (true)
+ {
+ result = doConnect();
+
+ if (! result)
+ return false;
+
+ if (++numFollowedRedirects > numRedirectsToFollow)
+ break;
+
+ int status = statusCode[0];
+
+ if (status == 301 || status == 302 || status == 303 || status == 307)
+ {
+ // Assumes only one occurrence of "Location"
+ int pos1 = responseHeaders.indexOf ("Location:") + 10;
+ int pos2 = responseHeaders.indexOf ("\n", pos1);
+
+ if (pos2 > pos1)
+ {
+ String currentLocation = connection.getURL().toString();
+ String newLocation = responseHeaders.substring (pos1, pos2);
+
+ try
+ {
+ // Handle newLocation whether it's absolute or relative
+ URL baseUrl = new URL (currentLocation);
+ URL newUrl = new URL (baseUrl, newLocation);
+ String transformedNewLocation = newUrl.toString();
+
+ if (transformedNewLocation != currentLocation)
+ {
+ // Clear responseHeaders before next iteration
+ responseHeaders.delete (0, responseHeaders.length());
+
+ synchronized (createStreamLock)
+ {
+ if (hasBeenCancelled.get())
+ return false;
+
+ connection.disconnect();
+
+ try
+ {
+ connection = createConnection (transformedNewLocation, isPost,
+ postData, headers, timeOutMs,
+ httpRequestCmd);
+ }
+ catch (Throwable e)
+ {
+ return false;
+ }
+ }
+ }
+ else
+ {
+ break;
+ }
+ }
+ catch (Throwable e)
+ {
+ return false;
+ }
+ }
+ else
+ {
+ break;
+ }
+ }
+ else
+ {
+ break;
+ }
+ }
+
+ return result;
+ }
+
+ private final boolean doConnect()
+ {
+ synchronized (createStreamLock)
+ {
+ if (hasBeenCancelled.get())
+ return false;
+
+ try
+ {
+ try
+ {
+ inputStream = getCancellableStream (true);
+ }
+ catch (ExecutionException e)
+ {
+ if (connection.getResponseCode() < 400)
+ {
+ statusCode[0] = connection.getResponseCode();
+ connection.disconnect();
+ return false;
+ }
+ }
+ finally
+ {
+ statusCode[0] = connection.getResponseCode();
+ }
+
+ try
+ {
+ if (statusCode[0] >= 400)
+ inputStream = getCancellableStream (false);
+ else
+ inputStream = getCancellableStream (true);
+ }
+ catch (ExecutionException e)
+ {}
+
+ for (java.util.Map.Entry> entry : connection.getHeaderFields().entrySet())
+ {
+ if (entry.getKey() != null && entry.getValue() != null)
+ {
+ responseHeaders.append(entry.getKey() + ": "
+ + android.text.TextUtils.join(",", entry.getValue()) + "\n");
+
+ if (entry.getKey().compareTo ("Content-Length") == 0)
+ totalLength = Integer.decode (entry.getValue().get (0));
+ }
+ }
+
+ return true;
+ }
+ catch (IOException e)
+ {
+ return false;
+ }
+ }
+ }
+
+ static class DisconnectionRunnable implements Runnable
+ {
+ public DisconnectionRunnable (HttpURLConnection theConnection,
+ InputStream theInputStream,
+ ReentrantLock theCreateStreamLock,
+ Object theCreateFutureLock,
+ Future theStreamFuture)
+ {
+ connectionToDisconnect = theConnection;
+ inputStream = theInputStream;
+ createStreamLock = theCreateStreamLock;
+ createFutureLock = theCreateFutureLock;
+ streamFuture = theStreamFuture;
+ }
+
+ public void run()
+ {
+ try
+ {
+ if (! createStreamLock.tryLock())
+ {
+ synchronized (createFutureLock)
+ {
+ if (streamFuture != null)
+ streamFuture.cancel (true);
+ }
+
+ createStreamLock.lock();
+ }
+
+ if (connectionToDisconnect != null)
+ connectionToDisconnect.disconnect();
+
+ if (inputStream != null)
+ inputStream.close();
+ }
+ catch (IOException e)
+ {}
+ finally
+ {
+ createStreamLock.unlock();
+ }
+ }
+
+ private HttpURLConnection connectionToDisconnect;
+ private InputStream inputStream;
+ private ReentrantLock createStreamLock;
+ private Object createFutureLock;
+ Future streamFuture;
+ }
+
+ public final void release()
+ {
+ DisconnectionRunnable disconnectionRunnable = new DisconnectionRunnable (connection,
+ inputStream,
+ createStreamLock,
+ createFutureLock,
+ streamFuture);
+
+ synchronized (createStreamLock)
+ {
+ hasBeenCancelled.set (true);
+
+ connection = null;
+ }
+
+ Thread disconnectionThread = new Thread(disconnectionRunnable);
+ disconnectionThread.start();
+ }
+
+ public final int read (byte[] buffer, int numBytes)
+ {
+ int num = 0;
+
+ try
+ {
+ synchronized (createStreamLock)
+ {
+ if (inputStream != null)
+ num = inputStream.read (buffer, 0, numBytes);
+ }
+ }
+ catch (IOException e)
+ {}
+
+ if (num > 0)
+ position += num;
+
+ return num;
+ }
+
+ public final long getPosition() { return position; }
+ public final long getTotalLength() { return totalLength; }
+ public final boolean isExhausted() { return false; }
+ public final boolean setPosition (long newPos) { return false; }
+
+ private boolean isPost;
+ private byte[] postData;
+ private String headers;
+ private int timeOutMs;
+ String httpRequestCmd;
+ private HttpURLConnection connection;
+ private int[] statusCode;
+ private StringBuffer responseHeaders;
+ private int totalLength;
+ private int numRedirectsToFollow;
+ private InputStream inputStream;
+ private long position;
+ private final ReentrantLock createStreamLock = new ReentrantLock();
+ private final Object createFutureLock = new Object();
+ private AtomicBoolean hasBeenCancelled = new AtomicBoolean();
+
+ private final ExecutorService executor = Executors.newCachedThreadPool (Executors.defaultThreadFactory());
+ Future streamFuture;
+ }
+
+ public static final HTTPStream createHTTPStream (String address, boolean isPost, byte[] postData,
+ String headers, int timeOutMs, int[] statusCode,
+ StringBuffer responseHeaders, int numRedirectsToFollow,
+ String httpRequestCmd)
+ {
+ // timeout parameter of zero for HttpUrlConnection is a blocking connect (negative value for juce::URL)
+ if (timeOutMs < 0)
+ timeOutMs = 0;
+ else if (timeOutMs == 0)
+ timeOutMs = 30000;
+
+ for (;;)
+ {
+ try
+ {
+ HTTPStream httpStream = new HTTPStream (address, isPost, postData, headers,
+ timeOutMs, statusCode, responseHeaders,
+ numRedirectsToFollow, httpRequestCmd);
+
+ return httpStream;
+ }
+ catch (Throwable e) {}
+
+ return null;
+ }
+ }
+
+ public final void launchURL (String url)
+ {
+ startActivity (new Intent (Intent.ACTION_VIEW, Uri.parse (url)));
+ }
+
+ public static final String getLocaleValue (boolean isRegion)
+ {
+ java.util.Locale locale = java.util.Locale.getDefault();
+
+ return isRegion ? locale.getCountry()
+ : locale.getLanguage();
+ }
+
+ private static final String getFileLocation (String type)
+ {
+ return Environment.getExternalStoragePublicDirectory (type).getAbsolutePath();
+ }
+
+ public static final String getDocumentsFolder()
+ {
+ if (getAndroidSDKVersion() >= 19)
+ return getFileLocation ("Documents");
+
+ return Environment.getDataDirectory().getAbsolutePath();
+ }
+
+ public static final String getPicturesFolder() { return getFileLocation (Environment.DIRECTORY_PICTURES); }
+ public static final String getMusicFolder() { return getFileLocation (Environment.DIRECTORY_MUSIC); }
+ public static final String getMoviesFolder() { return getFileLocation (Environment.DIRECTORY_MOVIES); }
+ public static final String getDownloadsFolder() { return getFileLocation (Environment.DIRECTORY_DOWNLOADS); }
+
+ //==============================================================================
+ @Override
+ protected void onActivityResult (int requestCode, int resultCode, Intent data)
+ {
+ appActivityResult (requestCode, resultCode, data);
+ }
+
+ @Override
+ protected void onNewIntent (Intent intent)
+ {
+ super.onNewIntent(intent);
+ setIntent(intent);
+
+ appNewIntent (intent);
+ }
+
+ //==============================================================================
+ public final Typeface getTypeFaceFromAsset (String assetName)
+ {
+ try
+ {
+ return Typeface.createFromAsset (this.getResources().getAssets(), assetName);
+ }
+ catch (Throwable e) {}
+
+ return null;
+ }
+
+ final protected static char[] hexArray = "0123456789ABCDEF".toCharArray();
+
+ public static String bytesToHex (byte[] bytes)
+ {
+ char[] hexChars = new char[bytes.length * 2];
+
+ for (int j = 0; j < bytes.length; ++j)
+ {
+ int v = bytes[j] & 0xff;
+ hexChars[j * 2] = hexArray[v >>> 4];
+ hexChars[j * 2 + 1] = hexArray[v & 0x0f];
+ }
+
+ return new String (hexChars);
+ }
+
+ final private java.util.Map dataCache = new java.util.HashMap();
+
+ synchronized private final File getDataCacheFile (byte[] data)
+ {
+ try
+ {
+ java.security.MessageDigest digest = java.security.MessageDigest.getInstance ("MD5");
+ digest.update (data);
+
+ String key = bytesToHex (digest.digest());
+
+ if (dataCache.containsKey (key))
+ return (File) dataCache.get (key);
+
+ File f = new File (this.getCacheDir(), "bindata_" + key);
+ f.delete();
+ FileOutputStream os = new FileOutputStream (f);
+ os.write (data, 0, data.length);
+ dataCache.put (key, f);
+ return f;
+ }
+ catch (Throwable e) {}
+
+ return null;
+ }
+
+ private final void clearDataCache()
+ {
+ java.util.Iterator it = dataCache.values().iterator();
+
+ while (it.hasNext())
+ {
+ File f = (File) it.next();
+ f.delete();
+ }
+ }
+
+ public final Typeface getTypeFaceFromByteArray (byte[] data)
+ {
+ try
+ {
+ File f = getDataCacheFile (data);
+
+ if (f != null)
+ return Typeface.createFromFile (f);
+ }
+ catch (Exception e)
+ {
+ Log.e ("JUCE", e.toString());
+ }
+
+ return null;
+ }
+
+ public static final int getAndroidSDKVersion()
+ {
+ return android.os.Build.VERSION.SDK_INT;
+ }
+
+ public final String audioManagerGetProperty (String property)
+ {
+ Object obj = getSystemService (AUDIO_SERVICE);
+ if (obj == null)
+ return null;
+
+ java.lang.reflect.Method method;
+
+ try
+ {
+ method = obj.getClass().getMethod ("getProperty", String.class);
+ }
+ catch (SecurityException e) { return null; }
+ catch (NoSuchMethodException e) { return null; }
+
+ if (method == null)
+ return null;
+
+ try
+ {
+ return (String) method.invoke (obj, property);
+ }
+ catch (java.lang.IllegalArgumentException e) {}
+ catch (java.lang.IllegalAccessException e) {}
+ catch (java.lang.reflect.InvocationTargetException e) {}
+
+ return null;
+ }
+
+ public final boolean hasSystemFeature (String property)
+ {
+ return getPackageManager().hasSystemFeature (property);
+ }
+}
diff --git a/examples/AnalyticsCollection/Builds/Android/app/src/release/res/values/string.xml b/examples/AnalyticsCollection/Builds/Android/app/src/release/res/values/string.xml
new file mode 100644
index 0000000000..8b89f78e6e
--- /dev/null
+++ b/examples/AnalyticsCollection/Builds/Android/app/src/release/res/values/string.xml
@@ -0,0 +1,5 @@
+
+
+
+ AnalyticsCollection
+
diff --git a/examples/AnalyticsCollection/Builds/Android/build.gradle b/examples/AnalyticsCollection/Builds/Android/build.gradle
new file mode 100644
index 0000000000..0109eaa02a
--- /dev/null
+++ b/examples/AnalyticsCollection/Builds/Android/build.gradle
@@ -0,0 +1,14 @@
+buildscript {
+ repositories {
+ jcenter()
+ }
+ dependencies {
+ classpath 'com.android.tools.build:gradle:2.3.3'
+ }
+}
+
+allprojects {
+ repositories {
+ jcenter()
+ }
+}
diff --git a/examples/AnalyticsCollection/Builds/Android/gradle/wrapper/LICENSE-for-gradlewrapper.txt b/examples/AnalyticsCollection/Builds/Android/gradle/wrapper/LICENSE-for-gradlewrapper.txt
new file mode 100644
index 0000000000..e06d208186
--- /dev/null
+++ b/examples/AnalyticsCollection/Builds/Android/gradle/wrapper/LICENSE-for-gradlewrapper.txt
@@ -0,0 +1,202 @@
+Apache License
+ Version 2.0, January 2004
+ http://www.apache.org/licenses/
+
+ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+ 1. Definitions.
+
+ "License" shall mean the terms and conditions for use, reproduction,
+ and distribution as defined by Sections 1 through 9 of this document.
+
+ "Licensor" shall mean the copyright owner or entity authorized by
+ the copyright owner that is granting the License.
+
+ "Legal Entity" shall mean the union of the acting entity and all
+ other entities that control, are controlled by, or are under common
+ control with that entity. For the purposes of this definition,
+ "control" means (i) the power, direct or indirect, to cause the
+ direction or management of such entity, whether by contract or
+ otherwise, or (ii) ownership of fifty percent (50%) or more of the
+ outstanding shares, or (iii) beneficial ownership of such entity.
+
+ "You" (or "Your") shall mean an individual or Legal Entity
+ exercising permissions granted by this License.
+
+ "Source" form shall mean the preferred form for making modifications,
+ including but not limited to software source code, documentation
+ source, and configuration files.
+
+ "Object" form shall mean any form resulting from mechanical
+ transformation or translation of a Source form, including but
+ not limited to compiled object code, generated documentation,
+ and conversions to other media types.
+
+ "Work" shall mean the work of authorship, whether in Source or
+ Object form, made available under the License, as indicated by a
+ copyright notice that is included in or attached to the work
+ (an example is provided in the Appendix below).
+
+ "Derivative Works" shall mean any work, whether in Source or Object
+ form, that is based on (or derived from) the Work and for which the
+ editorial revisions, annotations, elaborations, or other modifications
+ represent, as a whole, an original work of authorship. For the purposes
+ of this License, Derivative Works shall not include works that remain
+ separable from, or merely link (or bind by name) to the interfaces of,
+ the Work and Derivative Works thereof.
+
+ "Contribution" shall mean any work of authorship, including
+ the original version of the Work and any modifications or additions
+ to that Work or Derivative Works thereof, that is intentionally
+ submitted to Licensor for inclusion in the Work by the copyright owner
+ or by an individual or Legal Entity authorized to submit on behalf of
+ the copyright owner. For the purposes of this definition, "submitted"
+ means any form of electronic, verbal, or written communication sent
+ to the Licensor or its representatives, including but not limited to
+ communication on electronic mailing lists, source code control systems,
+ and issue tracking systems that are managed by, or on behalf of, the
+ Licensor for the purpose of discussing and improving the Work, but
+ excluding communication that is conspicuously marked or otherwise
+ designated in writing by the copyright owner as "Not a Contribution."
+
+ "Contributor" shall mean Licensor and any individual or Legal Entity
+ on behalf of whom a Contribution has been received by Licensor and
+ subsequently incorporated within the Work.
+
+ 2. Grant of Copyright License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ copyright license to reproduce, prepare Derivative Works of,
+ publicly display, publicly perform, sublicense, and distribute the
+ Work and such Derivative Works in Source or Object form.
+
+ 3. Grant of Patent License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ (except as stated in this section) patent license to make, have made,
+ use, offer to sell, sell, import, and otherwise transfer the Work,
+ where such license applies only to those patent claims licensable
+ by such Contributor that are necessarily infringed by their
+ Contribution(s) alone or by combination of their Contribution(s)
+ with the Work to which such Contribution(s) was submitted. If You
+ institute patent litigation against any entity (including a
+ cross-claim or counterclaim in a lawsuit) alleging that the Work
+ or a Contribution incorporated within the Work constitutes direct
+ or contributory patent infringement, then any patent licenses
+ granted to You under this License for that Work shall terminate
+ as of the date such litigation is filed.
+
+ 4. Redistribution. You may reproduce and distribute copies of the
+ Work or Derivative Works thereof in any medium, with or without
+ modifications, and in Source or Object form, provided that You
+ meet the following conditions:
+
+ (a) You must give any other recipients of the Work or
+ Derivative Works a copy of this License; and
+
+ (b) You must cause any modified files to carry prominent notices
+ stating that You changed the files; and
+
+ (c) You must retain, in the Source form of any Derivative Works
+ that You distribute, all copyright, patent, trademark, and
+ attribution notices from the Source form of the Work,
+ excluding those notices that do not pertain to any part of
+ the Derivative Works; and
+
+ (d) If the Work includes a "NOTICE" text file as part of its
+ distribution, then any Derivative Works that You distribute must
+ include a readable copy of the attribution notices contained
+ within such NOTICE file, excluding those notices that do not
+ pertain to any part of the Derivative Works, in at least one
+ of the following places: within a NOTICE text file distributed
+ as part of the Derivative Works; within the Source form or
+ documentation, if provided along with the Derivative Works; or,
+ within a display generated by the Derivative Works, if and
+ wherever such third-party notices normally appear. The contents
+ of the NOTICE file are for informational purposes only and
+ do not modify the License. You may add Your own attribution
+ notices within Derivative Works that You distribute, alongside
+ or as an addendum to the NOTICE text from the Work, provided
+ that such additional attribution notices cannot be construed
+ as modifying the License.
+
+ You may add Your own copyright statement to Your modifications and
+ may provide additional or different license terms and conditions
+ for use, reproduction, or distribution of Your modifications, or
+ for any such Derivative Works as a whole, provided Your use,
+ reproduction, and distribution of the Work otherwise complies with
+ the conditions stated in this License.
+
+ 5. Submission of Contributions. Unless You explicitly state otherwise,
+ any Contribution intentionally submitted for inclusion in the Work
+ by You to the Licensor shall be under the terms and conditions of
+ this License, without any additional terms or conditions.
+ Notwithstanding the above, nothing herein shall supersede or modify
+ the terms of any separate license agreement you may have executed
+ with Licensor regarding such Contributions.
+
+ 6. Trademarks. This License does not grant permission to use the trade
+ names, trademarks, service marks, or product names of the Licensor,
+ except as required for reasonable and customary use in describing the
+ origin of the Work and reproducing the content of the NOTICE file.
+
+ 7. Disclaimer of Warranty. Unless required by applicable law or
+ agreed to in writing, Licensor provides the Work (and each
+ Contributor provides its Contributions) on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+ implied, including, without limitation, any warranties or conditions
+ of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+ PARTICULAR PURPOSE. You are solely responsible for determining the
+ appropriateness of using or redistributing the Work and assume any
+ risks associated with Your exercise of permissions under this License.
+
+ 8. Limitation of Liability. In no event and under no legal theory,
+ whether in tort (including negligence), contract, or otherwise,
+ unless required by applicable law (such as deliberate and grossly
+ negligent acts) or agreed to in writing, shall any Contributor be
+ liable to You for damages, including any direct, indirect, special,
+ incidental, or consequential damages of any character arising as a
+ result of this License or out of the use or inability to use the
+ Work (including but not limited to damages for loss of goodwill,
+ work stoppage, computer failure or malfunction, or any and all
+ other commercial damages or losses), even if such Contributor
+ has been advised of the possibility of such damages.
+
+ 9. Accepting Warranty or Additional Liability. While redistributing
+ the Work or Derivative Works thereof, You may choose to offer,
+ and charge a fee for, acceptance of support, warranty, indemnity,
+ or other liability obligations and/or rights consistent with this
+ License. However, in accepting such obligations, You may act only
+ on Your own behalf and on Your sole responsibility, not on behalf
+ of any other Contributor, and only if You agree to indemnify,
+ defend, and hold each Contributor harmless for any liability
+ incurred by, or claims asserted against, such Contributor by reason
+ of your accepting any such warranty or additional liability.
+
+ END OF TERMS AND CONDITIONS
+
+ APPENDIX: How to apply the Apache License to your work.
+
+ To apply the Apache License to your work, attach the following
+ boilerplate notice, with the fields enclosed by brackets "{}"
+ replaced with your own identifying information. (Don't include
+ the brackets!) The text should be enclosed in the appropriate
+ comment syntax for the file format. We also recommend that a
+ file or class name and description of purpose be included on the
+ same "printed page" as the copyright notice for easier
+ identification within third-party archives.
+
+ Copyright {yyyy} {name of copyright owner}
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+
diff --git a/examples/AnalyticsCollection/Builds/Android/gradle/wrapper/gradle-wrapper.jar b/examples/AnalyticsCollection/Builds/Android/gradle/wrapper/gradle-wrapper.jar
new file mode 100644
index 0000000000..13372aef5e
Binary files /dev/null and b/examples/AnalyticsCollection/Builds/Android/gradle/wrapper/gradle-wrapper.jar differ
diff --git a/examples/AnalyticsCollection/Builds/Android/gradle/wrapper/gradle-wrapper.properties b/examples/AnalyticsCollection/Builds/Android/gradle/wrapper/gradle-wrapper.properties
new file mode 100644
index 0000000000..69aae7dc33
--- /dev/null
+++ b/examples/AnalyticsCollection/Builds/Android/gradle/wrapper/gradle-wrapper.properties
@@ -0,0 +1 @@
+distributionUrl=https\://services.gradle.org/distributions/gradle-3.3-all.zip
\ No newline at end of file
diff --git a/examples/AnalyticsCollection/Builds/Android/gradlew b/examples/AnalyticsCollection/Builds/Android/gradlew
new file mode 100755
index 0000000000..9d82f78915
--- /dev/null
+++ b/examples/AnalyticsCollection/Builds/Android/gradlew
@@ -0,0 +1,160 @@
+#!/usr/bin/env bash
+
+##############################################################################
+##
+## Gradle start up script for UN*X
+##
+##############################################################################
+
+# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
+DEFAULT_JVM_OPTS=""
+
+APP_NAME="Gradle"
+APP_BASE_NAME=`basename "$0"`
+
+# Use the maximum available, or set MAX_FD != -1 to use that value.
+MAX_FD="maximum"
+
+warn ( ) {
+ echo "$*"
+}
+
+die ( ) {
+ echo
+ echo "$*"
+ echo
+ exit 1
+}
+
+# OS specific support (must be 'true' or 'false').
+cygwin=false
+msys=false
+darwin=false
+case "`uname`" in
+ CYGWIN* )
+ cygwin=true
+ ;;
+ Darwin* )
+ darwin=true
+ ;;
+ MINGW* )
+ msys=true
+ ;;
+esac
+
+# Attempt to set APP_HOME
+# Resolve links: $0 may be a link
+PRG="$0"
+# Need this for relative symlinks.
+while [ -h "$PRG" ] ; do
+ ls=`ls -ld "$PRG"`
+ link=`expr "$ls" : '.*-> \(.*\)$'`
+ if expr "$link" : '/.*' > /dev/null; then
+ PRG="$link"
+ else
+ PRG=`dirname "$PRG"`"/$link"
+ fi
+done
+SAVED="`pwd`"
+cd "`dirname \"$PRG\"`/" >/dev/null
+APP_HOME="`pwd -P`"
+cd "$SAVED" >/dev/null
+
+CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar
+
+# Determine the Java command to use to start the JVM.
+if [ -n "$JAVA_HOME" ] ; then
+ if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
+ # IBM's JDK on AIX uses strange locations for the executables
+ JAVACMD="$JAVA_HOME/jre/sh/java"
+ else
+ JAVACMD="$JAVA_HOME/bin/java"
+ fi
+ if [ ! -x "$JAVACMD" ] ; then
+ die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME
+
+Please set the JAVA_HOME variable in your environment to match the
+location of your Java installation."
+ fi
+else
+ JAVACMD="java"
+ which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
+
+Please set the JAVA_HOME variable in your environment to match the
+location of your Java installation."
+fi
+
+# Increase the maximum file descriptors if we can.
+if [ "$cygwin" = "false" -a "$darwin" = "false" ] ; then
+ MAX_FD_LIMIT=`ulimit -H -n`
+ if [ $? -eq 0 ] ; then
+ if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then
+ MAX_FD="$MAX_FD_LIMIT"
+ fi
+ ulimit -n $MAX_FD
+ if [ $? -ne 0 ] ; then
+ warn "Could not set maximum file descriptor limit: $MAX_FD"
+ fi
+ else
+ warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT"
+ fi
+fi
+
+# For Darwin, add options to specify how the application appears in the dock
+if $darwin; then
+ GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\""
+fi
+
+# For Cygwin, switch paths to Windows format before running java
+if $cygwin ; then
+ APP_HOME=`cygpath --path --mixed "$APP_HOME"`
+ CLASSPATH=`cygpath --path --mixed "$CLASSPATH"`
+ JAVACMD=`cygpath --unix "$JAVACMD"`
+
+ # We build the pattern for arguments to be converted via cygpath
+ ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null`
+ SEP=""
+ for dir in $ROOTDIRSRAW ; do
+ ROOTDIRS="$ROOTDIRS$SEP$dir"
+ SEP="|"
+ done
+ OURCYGPATTERN="(^($ROOTDIRS))"
+ # Add a user-defined pattern to the cygpath arguments
+ if [ "$GRADLE_CYGPATTERN" != "" ] ; then
+ OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)"
+ fi
+ # Now convert the arguments - kludge to limit ourselves to /bin/sh
+ i=0
+ for arg in "$@" ; do
+ CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -`
+ CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option
+
+ if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition
+ eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"`
+ else
+ eval `echo args$i`="\"$arg\""
+ fi
+ i=$((i+1))
+ done
+ case $i in
+ (0) set -- ;;
+ (1) set -- "$args0" ;;
+ (2) set -- "$args0" "$args1" ;;
+ (3) set -- "$args0" "$args1" "$args2" ;;
+ (4) set -- "$args0" "$args1" "$args2" "$args3" ;;
+ (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;;
+ (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;;
+ (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;;
+ (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;;
+ (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;;
+ esac
+fi
+
+# Split up the JVM_OPTS And GRADLE_OPTS values into an array, following the shell quoting and substitution rules
+function splitJvmOpts() {
+ JVM_OPTS=("$@")
+}
+eval splitJvmOpts $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS
+JVM_OPTS[${#JVM_OPTS[*]}]="-Dorg.gradle.appname=$APP_BASE_NAME"
+
+exec "$JAVACMD" "${JVM_OPTS[@]}" -classpath "$CLASSPATH" org.gradle.wrapper.GradleWrapperMain "$@"
diff --git a/examples/AnalyticsCollection/Builds/Android/gradlew.bat b/examples/AnalyticsCollection/Builds/Android/gradlew.bat
new file mode 100644
index 0000000000..aec99730b4
--- /dev/null
+++ b/examples/AnalyticsCollection/Builds/Android/gradlew.bat
@@ -0,0 +1,90 @@
+@if "%DEBUG%" == "" @echo off
+@rem ##########################################################################
+@rem
+@rem Gradle startup script for Windows
+@rem
+@rem ##########################################################################
+
+@rem Set local scope for the variables with windows NT shell
+if "%OS%"=="Windows_NT" setlocal
+
+@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
+set DEFAULT_JVM_OPTS=
+
+set DIRNAME=%~dp0
+if "%DIRNAME%" == "" set DIRNAME=.
+set APP_BASE_NAME=%~n0
+set APP_HOME=%DIRNAME%
+
+@rem Find java.exe
+if defined JAVA_HOME goto findJavaFromJavaHome
+
+set JAVA_EXE=java.exe
+%JAVA_EXE% -version >NUL 2>&1
+if "%ERRORLEVEL%" == "0" goto init
+
+echo.
+echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
+echo.
+echo Please set the JAVA_HOME variable in your environment to match the
+echo location of your Java installation.
+
+goto fail
+
+:findJavaFromJavaHome
+set JAVA_HOME=%JAVA_HOME:"=%
+set JAVA_EXE=%JAVA_HOME%/bin/java.exe
+
+if exist "%JAVA_EXE%" goto init
+
+echo.
+echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%
+echo.
+echo Please set the JAVA_HOME variable in your environment to match the
+echo location of your Java installation.
+
+goto fail
+
+:init
+@rem Get command-line arguments, handling Windowz variants
+
+if not "%OS%" == "Windows_NT" goto win9xME_args
+if "%@eval[2+2]" == "4" goto 4NT_args
+
+:win9xME_args
+@rem Slurp the command line arguments.
+set CMD_LINE_ARGS=
+set _SKIP=2
+
+:win9xME_args_slurp
+if "x%~1" == "x" goto execute
+
+set CMD_LINE_ARGS=%*
+goto execute
+
+:4NT_args
+@rem Get arguments from the 4NT Shell from JP Software
+set CMD_LINE_ARGS=%$
+
+:execute
+@rem Setup the command line
+
+set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar
+
+@rem Execute Gradle
+"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS%
+
+:end
+@rem End local scope for the variables with windows NT shell
+if "%ERRORLEVEL%"=="0" goto mainEnd
+
+:fail
+rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of
+rem the _cmd.exe /c_ return code!
+if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1
+exit /b 1
+
+:mainEnd
+if "%OS%"=="Windows_NT" endlocal
+
+:omega
diff --git a/examples/AnalyticsCollection/Builds/Android/settings.gradle b/examples/AnalyticsCollection/Builds/Android/settings.gradle
new file mode 100644
index 0000000000..9d495b34f8
--- /dev/null
+++ b/examples/AnalyticsCollection/Builds/Android/settings.gradle
@@ -0,0 +1 @@
+include ':app'
\ No newline at end of file
diff --git a/examples/AnalyticsCollection/Builds/LinuxMakefile/Makefile b/examples/AnalyticsCollection/Builds/LinuxMakefile/Makefile
new file mode 100644
index 0000000000..f17351ba3b
--- /dev/null
+++ b/examples/AnalyticsCollection/Builds/LinuxMakefile/Makefile
@@ -0,0 +1,135 @@
+# Automatically generated makefile, created by the Projucer
+# Don't edit this file! Your changes will be overwritten when you re-save the Projucer project!
+
+# build with "V=1" for verbose builds
+ifeq ($(V), 1)
+V_AT =
+else
+V_AT = @
+endif
+
+# (this disables dependency generation if multiple architectures are set)
+DEPFLAGS := $(if $(word 2, $(TARGET_ARCH)), , -MMD)
+
+ifndef STRIP
+ STRIP=strip
+endif
+
+ifndef AR
+ AR=ar
+endif
+
+ifndef CONFIG
+ CONFIG=Debug
+endif
+
+ifeq ($(CONFIG),Debug)
+ JUCE_BINDIR := build
+ JUCE_LIBDIR := build
+ JUCE_OBJDIR := build/intermediate/Debug
+ JUCE_OUTDIR := build
+
+ ifeq ($(TARGET_ARCH),)
+ TARGET_ARCH := -march=native
+ endif
+
+ JUCE_CPPFLAGS := $(DEPFLAGS) -DLINUX=1 -DDEBUG=1 -D_DEBUG=1 -DJUCE_USE_CURL=1 -DJUCER_LINUX_MAKE_6D53C8B4=1 -DJUCE_APP_VERSION=1.0.0 -DJUCE_APP_VERSION_HEX=0x10000 $(shell pkg-config --cflags freetype2 libcurl x11 xext xinerama) -pthread -I../../JuceLibraryCode -I../../../../modules $(CPPFLAGS)
+ JUCE_CPPFLAGS_APP := -DJucePlugin_Build_VST=0 -DJucePlugin_Build_VST3=0 -DJucePlugin_Build_AU=0 -DJucePlugin_Build_AUv3=0 -DJucePlugin_Build_RTAS=0 -DJucePlugin_Build_AAX=0 -DJucePlugin_Build_Standalone=0
+ JUCE_TARGET_APP := AnalyticsCollection
+
+ JUCE_CFLAGS += $(JUCE_CPPFLAGS) $(TARGET_ARCH) -g -ggdb -O0 $(CFLAGS)
+ JUCE_CXXFLAGS += $(JUCE_CFLAGS) -std=c++11 $(CXXFLAGS)
+ JUCE_LDFLAGS += $(TARGET_ARCH) -L$(JUCE_BINDIR) -L$(JUCE_LIBDIR) $(shell pkg-config --libs freetype2 libcurl x11 xext xinerama) -ldl -lpthread -lrt $(LDFLAGS)
+
+ CLEANCMD = rm -rf $(JUCE_OUTDIR)/$(TARGET) $(JUCE_OBJDIR)
+endif
+
+ifeq ($(CONFIG),Release)
+ JUCE_BINDIR := build
+ JUCE_LIBDIR := build
+ JUCE_OBJDIR := build/intermediate/Release
+ JUCE_OUTDIR := build
+
+ ifeq ($(TARGET_ARCH),)
+ TARGET_ARCH := -march=native
+ endif
+
+ JUCE_CPPFLAGS := $(DEPFLAGS) -DLINUX=1 -DNDEBUG=1 -DJUCE_USE_CURL=1 -DJUCER_LINUX_MAKE_6D53C8B4=1 -DJUCE_APP_VERSION=1.0.0 -DJUCE_APP_VERSION_HEX=0x10000 $(shell pkg-config --cflags freetype2 libcurl x11 xext xinerama) -pthread -I../../JuceLibraryCode -I../../../../modules $(CPPFLAGS)
+ JUCE_CPPFLAGS_APP := -DJucePlugin_Build_VST=0 -DJucePlugin_Build_VST3=0 -DJucePlugin_Build_AU=0 -DJucePlugin_Build_AUv3=0 -DJucePlugin_Build_RTAS=0 -DJucePlugin_Build_AAX=0 -DJucePlugin_Build_Standalone=0
+ JUCE_TARGET_APP := AnalyticsCollection
+
+ JUCE_CFLAGS += $(JUCE_CPPFLAGS) $(TARGET_ARCH) -O3 $(CFLAGS)
+ JUCE_CXXFLAGS += $(JUCE_CFLAGS) -std=c++11 $(CXXFLAGS)
+ JUCE_LDFLAGS += $(TARGET_ARCH) -L$(JUCE_BINDIR) -L$(JUCE_LIBDIR) $(shell pkg-config --libs freetype2 libcurl x11 xext xinerama) -fvisibility=hidden -ldl -lpthread -lrt $(LDFLAGS)
+
+ CLEANCMD = rm -rf $(JUCE_OUTDIR)/$(TARGET) $(JUCE_OBJDIR)
+endif
+
+OBJECTS_APP := \
+ $(JUCE_OBJDIR)/Main_90ebc5c2.o \
+ $(JUCE_OBJDIR)/include_juce_analytics_f8e9fa94.o \
+ $(JUCE_OBJDIR)/include_juce_core_f26d17db.o \
+ $(JUCE_OBJDIR)/include_juce_data_structures_7471b1e3.o \
+ $(JUCE_OBJDIR)/include_juce_events_fd7d695.o \
+ $(JUCE_OBJDIR)/include_juce_graphics_f817e147.o \
+ $(JUCE_OBJDIR)/include_juce_gui_basics_e3f79785.o \
+
+.PHONY: clean all
+
+all : $(JUCE_OUTDIR)/$(JUCE_TARGET_APP)
+
+$(JUCE_OUTDIR)/$(JUCE_TARGET_APP) : check-pkg-config $(OBJECTS_APP) $(RESOURCES)
+ @echo Linking "AnalyticsCollection - App"
+ -$(V_AT)mkdir -p $(JUCE_BINDIR)
+ -$(V_AT)mkdir -p $(JUCE_LIBDIR)
+ -$(V_AT)mkdir -p $(JUCE_OUTDIR)
+ $(V_AT)$(CXX) -o $(JUCE_OUTDIR)/$(JUCE_TARGET_APP) $(OBJECTS_APP) $(JUCE_LDFLAGS) $(RESOURCES) $(TARGET_ARCH)
+
+$(JUCE_OBJDIR)/Main_90ebc5c2.o: ../../Source/Main.cpp
+ -$(V_AT)mkdir -p $(JUCE_OBJDIR)
+ @echo "Compiling Main.cpp"
+ $(V_AT)$(CXX) $(JUCE_CXXFLAGS) $(JUCE_CPPFLAGS_APP) $(JUCE_CFLAGS_APP) -o "$@" -c "$<"
+
+$(JUCE_OBJDIR)/include_juce_analytics_f8e9fa94.o: ../../JuceLibraryCode/include_juce_analytics.cpp
+ -$(V_AT)mkdir -p $(JUCE_OBJDIR)
+ @echo "Compiling include_juce_analytics.cpp"
+ $(V_AT)$(CXX) $(JUCE_CXXFLAGS) $(JUCE_CPPFLAGS_APP) $(JUCE_CFLAGS_APP) -o "$@" -c "$<"
+
+$(JUCE_OBJDIR)/include_juce_core_f26d17db.o: ../../JuceLibraryCode/include_juce_core.cpp
+ -$(V_AT)mkdir -p $(JUCE_OBJDIR)
+ @echo "Compiling include_juce_core.cpp"
+ $(V_AT)$(CXX) $(JUCE_CXXFLAGS) $(JUCE_CPPFLAGS_APP) $(JUCE_CFLAGS_APP) -o "$@" -c "$<"
+
+$(JUCE_OBJDIR)/include_juce_data_structures_7471b1e3.o: ../../JuceLibraryCode/include_juce_data_structures.cpp
+ -$(V_AT)mkdir -p $(JUCE_OBJDIR)
+ @echo "Compiling include_juce_data_structures.cpp"
+ $(V_AT)$(CXX) $(JUCE_CXXFLAGS) $(JUCE_CPPFLAGS_APP) $(JUCE_CFLAGS_APP) -o "$@" -c "$<"
+
+$(JUCE_OBJDIR)/include_juce_events_fd7d695.o: ../../JuceLibraryCode/include_juce_events.cpp
+ -$(V_AT)mkdir -p $(JUCE_OBJDIR)
+ @echo "Compiling include_juce_events.cpp"
+ $(V_AT)$(CXX) $(JUCE_CXXFLAGS) $(JUCE_CPPFLAGS_APP) $(JUCE_CFLAGS_APP) -o "$@" -c "$<"
+
+$(JUCE_OBJDIR)/include_juce_graphics_f817e147.o: ../../JuceLibraryCode/include_juce_graphics.cpp
+ -$(V_AT)mkdir -p $(JUCE_OBJDIR)
+ @echo "Compiling include_juce_graphics.cpp"
+ $(V_AT)$(CXX) $(JUCE_CXXFLAGS) $(JUCE_CPPFLAGS_APP) $(JUCE_CFLAGS_APP) -o "$@" -c "$<"
+
+$(JUCE_OBJDIR)/include_juce_gui_basics_e3f79785.o: ../../JuceLibraryCode/include_juce_gui_basics.cpp
+ -$(V_AT)mkdir -p $(JUCE_OBJDIR)
+ @echo "Compiling include_juce_gui_basics.cpp"
+ $(V_AT)$(CXX) $(JUCE_CXXFLAGS) $(JUCE_CPPFLAGS_APP) $(JUCE_CFLAGS_APP) -o "$@" -c "$<"
+
+check-pkg-config:
+ @command -v pkg-config >/dev/null 2>&1 || { echo >&2 "pkg-config not installed. Please, install it."; exit 1; }
+ @pkg-config --print-errors freetype2 libcurl x11 xext xinerama
+
+clean:
+ @echo Cleaning AnalyticsCollection
+ $(V_AT)$(CLEANCMD)
+
+strip:
+ @echo Stripping AnalyticsCollection
+ -$(V_AT)$(STRIP) --strip-unneeded $(JUCE_OUTDIR)/$(TARGET)
+
+-include $(OBJECTS_APP:%.o=%.d)
diff --git a/examples/AnalyticsCollection/Builds/MacOSX/AnalyticsCollection.xcodeproj/project.pbxproj b/examples/AnalyticsCollection/Builds/MacOSX/AnalyticsCollection.xcodeproj/project.pbxproj
new file mode 100644
index 0000000000..5f95714fd1
--- /dev/null
+++ b/examples/AnalyticsCollection/Builds/MacOSX/AnalyticsCollection.xcodeproj/project.pbxproj
@@ -0,0 +1,251 @@
+// !$*UTF8*$!
+{
+ archiveVersion = 1;
+ classes = {
+ };
+ objectVersion = 46;
+ objects = {
+
+ 95AA57DF380DDDCD099D4000 = {isa = PBXBuildFile; fileRef = 707149C59A1AF9752E428B97; };
+ B45E888BC48139CA81112E4A = {isa = PBXBuildFile; fileRef = 570EA8E9B2BD490DAA35F86E; };
+ 375013DDDA026F2709E4FDAD = {isa = PBXBuildFile; fileRef = C858CF44E96D416E4B6B9266; };
+ 877F68400FB5A15B39719C61 = {isa = PBXBuildFile; fileRef = 08EEB00E1779867598046EB6; };
+ 38EE4929FFB8B83FB37B6E73 = {isa = PBXBuildFile; fileRef = FBCE051A0BA6C9FA3E64B47B; };
+ A0DA914E3E16F49D60A5A47F = {isa = PBXBuildFile; fileRef = 3D44D3C7CC1020729BBF62BB; };
+ D293FC19C031441D146F2410 = {isa = PBXBuildFile; fileRef = 6A86C9751E9DCFA62D4562DB; };
+ 962036B1BB2EDB0F9D53E125 = {isa = PBXBuildFile; fileRef = 33B9806EFA95DA05ACD9344E; };
+ 6297B7A712B1E5A74311F162 = {isa = PBXBuildFile; fileRef = 5DC0FF6BC4AE24FABC41F20E; };
+ 132F9FBC9EB36AF2E755325D = {isa = PBXBuildFile; fileRef = AD2CFF58DA5E1C6EDF9CC399; };
+ 805CDCC5840B0D713C286826 = {isa = PBXBuildFile; fileRef = A0DDFB3559C431E96EC59392; };
+ C09B5A3CD0643CF37C9CF851 = {isa = PBXBuildFile; fileRef = 61FADB63565026F559F43F3B; };
+ A1DF340E80EC501B1DBE75A0 = {isa = PBXBuildFile; fileRef = 65311EED96DCA9B62EBFEA04; };
+ 02589D465A73E0112B97BD3A = {isa = PBXFileReference; lastKnownFileType = file; name = "juce_core"; path = "../../../../modules/juce_core"; sourceTree = "SOURCE_ROOT"; };
+ 08EEB00E1779867598046EB6 = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = IOKit.framework; path = System/Library/Frameworks/IOKit.framework; sourceTree = SDKROOT; };
+ 1AA9DA887BE127DCED5228BB = {isa = PBXFileReference; lastKnownFileType = file; name = "juce_events"; path = "../../../../modules/juce_events"; sourceTree = "SOURCE_ROOT"; };
+ 33B9806EFA95DA05ACD9344E = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "include_juce_analytics.cpp"; path = "../../JuceLibraryCode/include_juce_analytics.cpp"; sourceTree = "SOURCE_ROOT"; };
+ 3D44D3C7CC1020729BBF62BB = {isa = PBXFileReference; lastKnownFileType = file.nib; name = RecentFilesMenuTemplate.nib; path = RecentFilesMenuTemplate.nib; sourceTree = "SOURCE_ROOT"; };
+ 5219A3D3BECB8C7135C90377 = {isa = PBXFileReference; lastKnownFileType = file; name = "juce_gui_basics"; path = "../../../../modules/juce_gui_basics"; sourceTree = "SOURCE_ROOT"; };
+ 570EA8E9B2BD490DAA35F86E = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Carbon.framework; path = System/Library/Frameworks/Carbon.framework; sourceTree = SDKROOT; };
+ 5DC0FF6BC4AE24FABC41F20E = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "include_juce_core.mm"; path = "../../JuceLibraryCode/include_juce_core.mm"; sourceTree = "SOURCE_ROOT"; };
+ 61FADB63565026F559F43F3B = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "include_juce_graphics.mm"; path = "../../JuceLibraryCode/include_juce_graphics.mm"; sourceTree = "SOURCE_ROOT"; };
+ 65311EED96DCA9B62EBFEA04 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "include_juce_gui_basics.mm"; path = "../../JuceLibraryCode/include_juce_gui_basics.mm"; sourceTree = "SOURCE_ROOT"; };
+ 6A86C9751E9DCFA62D4562DB = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = Main.cpp; path = ../../Source/Main.cpp; sourceTree = "SOURCE_ROOT"; };
+ 707149C59A1AF9752E428B97 = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = AnalyticsCollection.app; sourceTree = "BUILT_PRODUCTS_DIR"; };
+ 7A9FA859A2C2AE9FDDC99AD9 = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; name = "Info-App.plist"; path = "Info-App.plist"; sourceTree = "SOURCE_ROOT"; };
+ 886AEA380A40C905503764EB = {isa = PBXFileReference; lastKnownFileType = file; name = "juce_graphics"; path = "../../../../modules/juce_graphics"; sourceTree = "SOURCE_ROOT"; };
+ 8A74F3F7422C89A897D93397 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = AppConfig.h; path = ../../JuceLibraryCode/AppConfig.h; sourceTree = "SOURCE_ROOT"; };
+ 8B927F72BA8726A064560942 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = GoogleAnalyticsDestination.h; path = ../../Source/GoogleAnalyticsDestination.h; sourceTree = "SOURCE_ROOT"; };
+ 91208A06115D573563996967 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = JuceHeader.h; path = ../../JuceLibraryCode/JuceHeader.h; sourceTree = "SOURCE_ROOT"; };
+ 996BEF5ADCE2EC85EB9F637F = {isa = PBXFileReference; lastKnownFileType = file; name = "juce_data_structures"; path = "../../../../modules/juce_data_structures"; sourceTree = "SOURCE_ROOT"; };
+ A0DDFB3559C431E96EC59392 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "include_juce_events.mm"; path = "../../JuceLibraryCode/include_juce_events.mm"; sourceTree = "SOURCE_ROOT"; };
+ AD2CFF58DA5E1C6EDF9CC399 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "include_juce_data_structures.mm"; path = "../../JuceLibraryCode/include_juce_data_structures.mm"; sourceTree = "SOURCE_ROOT"; };
+ C858CF44E96D416E4B6B9266 = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Cocoa.framework; path = System/Library/Frameworks/Cocoa.framework; sourceTree = SDKROOT; };
+ D352CDB4CA7E8B21FAA83B8C = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = MainComponent.h; path = ../../Source/MainComponent.h; sourceTree = "SOURCE_ROOT"; };
+ F2CF007AA4C90AC7A5AD1604 = {isa = PBXFileReference; lastKnownFileType = file; name = "juce_analytics"; path = "../../../../modules/juce_analytics"; sourceTree = "SOURCE_ROOT"; };
+ FBCE051A0BA6C9FA3E64B47B = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = QuartzCore.framework; path = System/Library/Frameworks/QuartzCore.framework; sourceTree = SDKROOT; };
+ D269FA28B5D6012AEFE0BF20 = {isa = PBXGroup; children = (
+ 8B927F72BA8726A064560942,
+ D352CDB4CA7E8B21FAA83B8C,
+ 6A86C9751E9DCFA62D4562DB, ); name = Source; sourceTree = ""; };
+ 2B971235E85DF9D98B6FC8AF = {isa = PBXGroup; children = (
+ D269FA28B5D6012AEFE0BF20, ); name = AnalyticsCollection; sourceTree = ""; };
+ 0B35DCE65DF34DECBF1D8118 = {isa = PBXGroup; children = (
+ F2CF007AA4C90AC7A5AD1604,
+ 02589D465A73E0112B97BD3A,
+ 996BEF5ADCE2EC85EB9F637F,
+ 1AA9DA887BE127DCED5228BB,
+ 886AEA380A40C905503764EB,
+ 5219A3D3BECB8C7135C90377, ); name = "Juce Modules"; sourceTree = ""; };
+ B24D9AE60E0CE5D1A75693B5 = {isa = PBXGroup; children = (
+ 8A74F3F7422C89A897D93397,
+ 33B9806EFA95DA05ACD9344E,
+ 5DC0FF6BC4AE24FABC41F20E,
+ AD2CFF58DA5E1C6EDF9CC399,
+ A0DDFB3559C431E96EC59392,
+ 61FADB63565026F559F43F3B,
+ 65311EED96DCA9B62EBFEA04,
+ 91208A06115D573563996967, ); name = "Juce Library Code"; sourceTree = ""; };
+ 782C3BD0C802236A266FDEDD = {isa = PBXGroup; children = (
+ 7A9FA859A2C2AE9FDDC99AD9,
+ 3D44D3C7CC1020729BBF62BB, ); name = Resources; sourceTree = ""; };
+ F70B9CB615E26A697D2CBEB4 = {isa = PBXGroup; children = (
+ 570EA8E9B2BD490DAA35F86E,
+ C858CF44E96D416E4B6B9266,
+ 08EEB00E1779867598046EB6,
+ FBCE051A0BA6C9FA3E64B47B, ); name = Frameworks; sourceTree = ""; };
+ 40E8A594A7EAFA1EF5707952 = {isa = PBXGroup; children = (
+ 707149C59A1AF9752E428B97, ); name = Products; sourceTree = ""; };
+ 5CB45B3816ED17D0620DDEBF = {isa = PBXGroup; children = (
+ 2B971235E85DF9D98B6FC8AF,
+ 0B35DCE65DF34DECBF1D8118,
+ B24D9AE60E0CE5D1A75693B5,
+ 782C3BD0C802236A266FDEDD,
+ F70B9CB615E26A697D2CBEB4,
+ 40E8A594A7EAFA1EF5707952, ); name = Source; sourceTree = ""; };
+ 6FF8E864589AD3C2C06BF546 = {isa = XCBuildConfiguration; buildSettings = {
+ CLANG_CXX_LANGUAGE_STANDARD = "c++11";
+ CLANG_LINK_OBJC_RUNTIME = NO;
+ COMBINE_HIDPI_IMAGES = YES;
+ CONFIGURATION_BUILD_DIR = "$(PROJECT_DIR)/build/$(CONFIGURATION)";
+ COPY_PHASE_STRIP = NO;
+ GCC_DYNAMIC_NO_PIC = NO;
+ GCC_OPTIMIZATION_LEVEL = 0;
+ GCC_PREPROCESSOR_DEFINITIONS = (
+ "_DEBUG=1",
+ "DEBUG=1",
+ "JUCER_XCODE_MAC_F6D2F4CF=1",
+ "JUCE_APP_VERSION=1.0.0",
+ "JUCE_APP_VERSION_HEX=0x10000",
+ "JucePlugin_Build_VST=0",
+ "JucePlugin_Build_VST3=0",
+ "JucePlugin_Build_AU=0",
+ "JucePlugin_Build_AUv3=0",
+ "JucePlugin_Build_RTAS=0",
+ "JucePlugin_Build_AAX=0",
+ "JucePlugin_Build_Standalone=0", );
+ GCC_VERSION = com.apple.compilers.llvm.clang.1_0;
+ HEADER_SEARCH_PATHS = ("../../JuceLibraryCode", "../../../../modules", "$(inherited)");
+ INFOPLIST_FILE = Info-App.plist;
+ INFOPLIST_PREPROCESS = NO;
+ INSTALL_PATH = "$(HOME)/Applications";
+ MACOSX_DEPLOYMENT_TARGET = 10.11;
+ MACOSX_DEPLOYMENT_TARGET_ppc = 10.4;
+ PRODUCT_BUNDLE_IDENTIFIER = com.yourcompany.AnalyticsCollection;
+ SDKROOT_ppc = macosx10.5;
+ USE_HEADERMAP = NO; }; name = Debug; };
+ 8575FCD908F2B0E4E641C1A0 = {isa = XCBuildConfiguration; buildSettings = {
+ CLANG_CXX_LANGUAGE_STANDARD = "c++11";
+ CLANG_LINK_OBJC_RUNTIME = NO;
+ COMBINE_HIDPI_IMAGES = YES;
+ CONFIGURATION_BUILD_DIR = "$(PROJECT_DIR)/build/$(CONFIGURATION)";
+ DEAD_CODE_STRIPPING = YES;
+ GCC_GENERATE_DEBUGGING_SYMBOLS = NO;
+ GCC_OPTIMIZATION_LEVEL = 3;
+ GCC_PREPROCESSOR_DEFINITIONS = (
+ "_NDEBUG=1",
+ "NDEBUG=1",
+ "JUCER_XCODE_MAC_F6D2F4CF=1",
+ "JUCE_APP_VERSION=1.0.0",
+ "JUCE_APP_VERSION_HEX=0x10000",
+ "JucePlugin_Build_VST=0",
+ "JucePlugin_Build_VST3=0",
+ "JucePlugin_Build_AU=0",
+ "JucePlugin_Build_AUv3=0",
+ "JucePlugin_Build_RTAS=0",
+ "JucePlugin_Build_AAX=0",
+ "JucePlugin_Build_Standalone=0", );
+ GCC_SYMBOLS_PRIVATE_EXTERN = YES;
+ GCC_VERSION = com.apple.compilers.llvm.clang.1_0;
+ HEADER_SEARCH_PATHS = ("../../JuceLibraryCode", "../../../../modules", "$(inherited)");
+ INFOPLIST_FILE = Info-App.plist;
+ INFOPLIST_PREPROCESS = NO;
+ INSTALL_PATH = "$(HOME)/Applications";
+ MACOSX_DEPLOYMENT_TARGET = 10.11;
+ MACOSX_DEPLOYMENT_TARGET_ppc = 10.4;
+ PRODUCT_BUNDLE_IDENTIFIER = com.yourcompany.AnalyticsCollection;
+ SDKROOT_ppc = macosx10.5;
+ USE_HEADERMAP = NO; }; name = Release; };
+ 0399310F2F5034CFCB14437B = {isa = XCBuildConfiguration; buildSettings = {
+ ALWAYS_SEARCH_USER_PATHS = NO;
+ CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
+ CLANG_WARN_BOOL_CONVERSION = YES;
+ CLANG_WARN_COMMA = YES;
+ CLANG_WARN_CONSTANT_CONVERSION = YES;
+ CLANG_WARN_EMPTY_BODY = YES;
+ CLANG_WARN_ENUM_CONVERSION = YES;
+ CLANG_WARN_INFINITE_RECURSION = YES;
+ CLANG_WARN_INT_CONVERSION = YES;
+ CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
+ CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
+ CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
+ CLANG_WARN_STRICT_PROTOTYPES = YES;
+ CLANG_WARN_SUSPICIOUS_MOVE = YES;
+ CLANG_WARN_UNREACHABLE_CODE = YES;
+ CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
+ DEBUG_INFORMATION_FORMAT = "dwarf";
+ ENABLE_STRICT_OBJC_MSGSEND = YES;
+ ENABLE_TESTABILITY = YES;
+ GCC_C_LANGUAGE_STANDARD = c11;
+ GCC_INLINES_ARE_PRIVATE_EXTERN = YES;
+ GCC_MODEL_TUNING = G5;
+ GCC_NO_COMMON_BLOCKS = YES;
+ GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
+ GCC_WARN_ABOUT_RETURN_TYPE = YES;
+ GCC_WARN_CHECK_SWITCH_STATEMENTS = YES;
+ GCC_WARN_MISSING_PARENTHESES = YES;
+ GCC_WARN_NON_VIRTUAL_DESTRUCTOR = YES;
+ GCC_WARN_TYPECHECK_CALLS_TO_PRINTF = YES;
+ GCC_WARN_UNDECLARED_SELECTOR = YES;
+ GCC_WARN_UNINITIALIZED_AUTOS = YES;
+ GCC_WARN_UNUSED_FUNCTION = YES;
+ GCC_WARN_UNUSED_VARIABLE = YES;
+ ONLY_ACTIVE_ARCH = YES;
+ PRODUCT_NAME = "AnalyticsCollection";
+ WARNING_CFLAGS = -Wreorder;
+ ZERO_LINK = NO; }; name = Debug; };
+ D9987A1AC287063A4E090185 = {isa = XCBuildConfiguration; buildSettings = {
+ ALWAYS_SEARCH_USER_PATHS = NO;
+ CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
+ CLANG_WARN_BOOL_CONVERSION = YES;
+ CLANG_WARN_COMMA = YES;
+ CLANG_WARN_CONSTANT_CONVERSION = YES;
+ CLANG_WARN_EMPTY_BODY = YES;
+ CLANG_WARN_ENUM_CONVERSION = YES;
+ CLANG_WARN_INFINITE_RECURSION = YES;
+ CLANG_WARN_INT_CONVERSION = YES;
+ CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
+ CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
+ CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
+ CLANG_WARN_STRICT_PROTOTYPES = YES;
+ CLANG_WARN_SUSPICIOUS_MOVE = YES;
+ CLANG_WARN_UNREACHABLE_CODE = YES;
+ CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
+ DEBUG_INFORMATION_FORMAT = "dwarf";
+ ENABLE_STRICT_OBJC_MSGSEND = YES;
+ GCC_C_LANGUAGE_STANDARD = c11;
+ GCC_INLINES_ARE_PRIVATE_EXTERN = YES;
+ GCC_MODEL_TUNING = G5;
+ GCC_NO_COMMON_BLOCKS = YES;
+ GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
+ GCC_WARN_ABOUT_RETURN_TYPE = YES;
+ GCC_WARN_CHECK_SWITCH_STATEMENTS = YES;
+ GCC_WARN_MISSING_PARENTHESES = YES;
+ GCC_WARN_NON_VIRTUAL_DESTRUCTOR = YES;
+ GCC_WARN_TYPECHECK_CALLS_TO_PRINTF = YES;
+ GCC_WARN_UNDECLARED_SELECTOR = YES;
+ GCC_WARN_UNINITIALIZED_AUTOS = YES;
+ GCC_WARN_UNUSED_FUNCTION = YES;
+ GCC_WARN_UNUSED_VARIABLE = YES;
+ PRODUCT_NAME = "AnalyticsCollection";
+ WARNING_CFLAGS = -Wreorder;
+ ZERO_LINK = NO; }; name = Release; };
+ E1B8C9CDDA25A31AA3C9C1BC = {isa = PBXTargetDependency; target = 3195ADB3A101AAE977C998D2; };
+ 65535D1056F6B2C9C545923E = {isa = XCConfigurationList; buildConfigurations = (
+ 0399310F2F5034CFCB14437B,
+ D9987A1AC287063A4E090185, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Debug; };
+ 850BB95DDE68E87344778037 = {isa = XCConfigurationList; buildConfigurations = (
+ 6FF8E864589AD3C2C06BF546,
+ 8575FCD908F2B0E4E641C1A0, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Debug; };
+ 9DE971716CBA79E89467EFD0 = {isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = (
+ A0DA914E3E16F49D60A5A47F, ); runOnlyForDeploymentPostprocessing = 0; };
+ A01C1A7AFBB72E638096E0BA = {isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = (
+ D293FC19C031441D146F2410,
+ 962036B1BB2EDB0F9D53E125,
+ 6297B7A712B1E5A74311F162,
+ 132F9FBC9EB36AF2E755325D,
+ 805CDCC5840B0D713C286826,
+ C09B5A3CD0643CF37C9CF851,
+ A1DF340E80EC501B1DBE75A0, ); runOnlyForDeploymentPostprocessing = 0; };
+ 32F46511CABBD859FD1D427D = {isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = (
+ B45E888BC48139CA81112E4A,
+ 375013DDDA026F2709E4FDAD,
+ 877F68400FB5A15B39719C61,
+ 38EE4929FFB8B83FB37B6E73, ); runOnlyForDeploymentPostprocessing = 0; };
+ 3195ADB3A101AAE977C998D2 = {isa = PBXNativeTarget; buildConfigurationList = 850BB95DDE68E87344778037; buildPhases = (
+ 9DE971716CBA79E89467EFD0,
+ A01C1A7AFBB72E638096E0BA,
+ 32F46511CABBD859FD1D427D, ); buildRules = ( ); dependencies = ( ); name = "AnalyticsCollection - App"; productName = AnalyticsCollection; productReference = 707149C59A1AF9752E428B97; productType = "com.apple.product-type.application"; };
+ 8C6201B9CB81795542E3302D = {isa = PBXProject; buildConfigurationList = 65535D1056F6B2C9C545923E; attributes = { LastUpgradeCheck = 0830; TargetAttributes = { 3195ADB3A101AAE977C998D2 = { SystemCapabilities = {com.apple.ApplicationGroups.iOS = { enabled = 0; }; com.apple.InAppPurchase = { enabled = 0; }; com.apple.InterAppAudio = { enabled = 0; }; com.apple.Push = { enabled = 0; }; com.apple.Sandbox = { enabled = 0; }; }; }; }; }; compatibilityVersion = "Xcode 3.2"; hasScannedForEncodings = 0; mainGroup = 5CB45B3816ED17D0620DDEBF; projectDirPath = ""; projectRoot = ""; targets = (3195ADB3A101AAE977C998D2); };
+ };
+ rootObject = 8C6201B9CB81795542E3302D;
+}
diff --git a/examples/AnalyticsCollection/Builds/MacOSX/Info-App.plist b/examples/AnalyticsCollection/Builds/MacOSX/Info-App.plist
new file mode 100644
index 0000000000..1730457632
--- /dev/null
+++ b/examples/AnalyticsCollection/Builds/MacOSX/Info-App.plist
@@ -0,0 +1,29 @@
+
+
+
+
+
+ CFBundleExecutable
+ ${EXECUTABLE_NAME}
+ CFBundleIconFile
+
+ CFBundleIdentifier
+ com.yourcompany.AnalyticsCollection
+ CFBundleName
+ AnalyticsCollection
+ CFBundleDisplayName
+ AnalyticsCollection
+ CFBundlePackageType
+ APPL
+ CFBundleSignature
+ ????
+ CFBundleShortVersionString
+ 1.0.0
+ CFBundleVersion
+ 1.0.0
+ NSHumanReadableCopyright
+
+ NSHighResolutionCapable
+
+
+
diff --git a/examples/AnalyticsCollection/Builds/MacOSX/RecentFilesMenuTemplate.nib b/examples/AnalyticsCollection/Builds/MacOSX/RecentFilesMenuTemplate.nib
new file mode 100644
index 0000000000..cec7f7c72b
Binary files /dev/null and b/examples/AnalyticsCollection/Builds/MacOSX/RecentFilesMenuTemplate.nib differ
diff --git a/examples/AnalyticsCollection/Builds/VisualStudio2017/AnalyticsCollection.sln b/examples/AnalyticsCollection/Builds/VisualStudio2017/AnalyticsCollection.sln
new file mode 100644
index 0000000000..b3fa82d9b9
--- /dev/null
+++ b/examples/AnalyticsCollection/Builds/VisualStudio2017/AnalyticsCollection.sln
@@ -0,0 +1,20 @@
+Microsoft Visual Studio Solution File, Format Version 11.00
+# Visual Studio 2017
+
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "AnalyticsCollection - App", "AnalyticsCollection_App.vcxproj", "{C52D63D2-B7D8-F34E-1B84-186CB9D963EB}"
+EndProject
+Global
+ GlobalSection(SolutionConfigurationPlatforms) = preSolution
+ Debug|x64 = Debug|x64
+ Release|x64 = Release|x64
+ EndGlobalSection
+ GlobalSection(ProjectConfigurationPlatforms) = postSolution
+ {C52D63D2-B7D8-F34E-1B84-186CB9D963EB}.Debug|x64.ActiveCfg = Debug|x64
+ {C52D63D2-B7D8-F34E-1B84-186CB9D963EB}.Debug|x64.Build.0 = Debug|x64
+ {C52D63D2-B7D8-F34E-1B84-186CB9D963EB}.Release|x64.ActiveCfg = Release|x64
+ {C52D63D2-B7D8-F34E-1B84-186CB9D963EB}.Release|x64.Build.0 = Release|x64
+ EndGlobalSection
+ GlobalSection(SolutionProperties) = preSolution
+ HideSolutionNode = FALSE
+ EndGlobalSection
+EndGlobal
diff --git a/examples/AnalyticsCollection/Builds/VisualStudio2017/AnalyticsCollection_App.vcxproj b/examples/AnalyticsCollection/Builds/VisualStudio2017/AnalyticsCollection_App.vcxproj
new file mode 100644
index 0000000000..6f29e78cff
--- /dev/null
+++ b/examples/AnalyticsCollection/Builds/VisualStudio2017/AnalyticsCollection_App.vcxproj
@@ -0,0 +1,1590 @@
+
+
+
+
+
+ Debug
+ x64
+
+
+ Release
+ x64
+
+
+
+ {C52D63D2-B7D8-F34E-1B84-186CB9D963EB}
+ v141
+ 10.0.15063.0
+
+
+
+ Application
+ false
+ v141
+ v141
+ 10.0.15063.0
+
+
+ Application
+ false
+ true
+ v141
+ v141
+ 10.0.15063.0
+
+
+
+
+
+
+
+ v141
+ 10.0.15063.0
+
+
+ <_ProjectFileVersion>10.0.30319.1
+ .exe
+ $(SolutionDir)$(Platform)\$(Configuration)\App\
+ $(Platform)\$(Configuration)\App\
+ AnalyticsCollection
+ true
+ $(SolutionDir)$(Platform)\$(Configuration)\App\
+ $(Platform)\$(Configuration)\App\
+ AnalyticsCollection
+ true
+ v141
+ 10.0.15063.0
+
+
+
+ _DEBUG;%(PreprocessorDefinitions)
+ true
+ true
+ Win32
+
+
+
+ Disabled
+ ProgramDatabase
+ ..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories)
+ _CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;DEBUG;_DEBUG;JUCER_VS2017_78A5024=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_RTAS=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;%(PreprocessorDefinitions)
+ MultiThreadedDebug
+ true
+
+ $(IntDir)\
+ $(IntDir)\
+ $(IntDir)\
+ Level4
+ true
+ true
+ stdcpp14
+
+
+ _DEBUG;%(PreprocessorDefinitions)
+
+
+ $(OutDir)\AnalyticsCollection.exe
+ true
+ libcmt.lib; msvcrt.lib;;%(IgnoreSpecificDefaultLibraries)
+ true
+ $(IntDir)\AnalyticsCollection.pdb
+ Windows
+ true
+
+
+ true
+ $(IntDir)\AnalyticsCollection.bsc
+
+
+
+
+
+ NDEBUG;%(PreprocessorDefinitions)
+ true
+ true
+ Win32
+
+
+
+ Full
+ ..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories)
+ _CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;NDEBUG;JUCER_VS2017_78A5024=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_RTAS=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;%(PreprocessorDefinitions)
+ MultiThreaded
+ true
+
+ $(IntDir)\
+ $(IntDir)\
+ $(IntDir)\
+ Level4
+ true
+ true
+ stdcpp14
+
+
+ NDEBUG;%(PreprocessorDefinitions)
+
+
+ $(OutDir)\AnalyticsCollection.exe
+ true
+ %(IgnoreSpecificDefaultLibraries)
+ false
+ $(IntDir)\AnalyticsCollection.pdb
+ Windows
+ true
+ true
+ true
+
+
+ true
+ $(IntDir)\AnalyticsCollection.bsc
+
+
+
+
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/examples/AnalyticsCollection/Builds/VisualStudio2017/AnalyticsCollection_App.vcxproj.filters b/examples/AnalyticsCollection/Builds/VisualStudio2017/AnalyticsCollection_App.vcxproj.filters
new file mode 100644
index 0000000000..8bfcff0ad9
--- /dev/null
+++ b/examples/AnalyticsCollection/Builds/VisualStudio2017/AnalyticsCollection_App.vcxproj.filters
@@ -0,0 +1,2456 @@
+
+
+
+
+
+ {0ADBA858-7DA1-224B-3BCE-996A8CCB74BC}
+
+
+ {FF015E5F-88E5-A72B-879E-63506EFD89E5}
+
+
+ {B0E83D1C-737D-813B-5FF0-A01675F61A5F}
+
+
+ {9DAB8837-5D73-5B25-AEF9-11F592DD3FE4}
+
+
+ {19561ADD-E564-E896-A9C2-CC550102A713}
+
+
+ {0608ADE9-66EF-1A19-6D57-12D07F76EB53}
+
+
+ {C8F726FC-26BF-2E6B-4ED5-55A7FE316D7D}
+
+
+ {1B67A7C0-86E0-53F6-6AE3-7AD93B8DC95B}
+
+
+ {C294408A-2005-2E9E-7AC0-8D3ABE8AC175}
+
+
+ {476C69CE-0B67-6B85-E888-45D91E37A29E}
+
+
+ {7C5AD030-F8CC-6E85-0AF6-196B3ED40AC6}
+
+
+ {FA891A58-9FDA-9651-43C4-714A19B5D08D}
+
+
+ {C79A4D23-7866-8F3E-AC39-BD68C52A9259}
+
+
+ {DA0DC4AC-B511-A2D4-199A-C93454D6F114}
+
+
+ {91929C6F-7902-B87D-5260-2F6CBF8ACD93}
+
+
+ {4634FFAE-9586-A970-364C-4FDDA635F99F}
+
+
+ {244D11B0-2D68-3C08-A0B7-0D12469BC3AA}
+
+
+ {05F3DB8A-499C-6ACA-282F-5BF8455A0DE1}
+
+
+ {C9F6D785-BF78-5AA1-B479-111C65397864}
+
+
+ {4927C7A1-9235-4AA1-93CD-B4E67E6F1E5F}
+
+
+ {F2B2F310-F30F-7166-42A9-9BF9C230DA78}
+
+
+ {585D6A72-C5E7-BCF1-A168-63A40C6B6313}
+
+
+ {F03654BC-34D8-F975-BEA3-750CC2783D23}
+
+
+ {95CA1506-2B94-0DEE-0C8D-85EDEBBC4E88}
+
+
+ {358AEA11-3F96-36AE-7B32-71373B5C5396}
+
+
+ {3DF036EA-3B80-553B-2494-3AAC835CAE75}
+
+
+ {1988E68A-A964-64CA-0E0C-26FF9BC5176C}
+
+
+ {928D8FCC-5E00-174B-6538-93E8D75AB396}
+
+
+ {B098BC87-3298-7E6B-12DC-D26C09CDCAED}
+
+
+ {6322B88F-984A-C3CD-6263-38D7AA49B6EC}
+
+
+ {6172822C-01A5-E824-12DA-FA43FA934D35}
+
+
+ {73C1E759-AD90-59A3-942E-2D10FAA29107}
+
+
+ {41DC3BE3-D629-8A17-C32B-F5B4008B5FAD}
+
+
+ {F2A38F45-6E55-E147-2E52-64A89FDD9D59}
+
+
+ {4926B3FF-E797-F586-857A-69D9703FA2D1}
+
+
+ {EBC65085-3AD5-280C-1A29-2B1683643AA1}
+
+
+ {E37D25CD-4350-4614-055B-7ABC55E67895}
+
+
+ {26ECA2AF-7368-C6CC-58EF-017ECD1862D0}
+
+
+ {C1A1A236-AB01-173E-96C3-0706BFF93B1E}
+
+
+ {F27C42E6-CF39-9B72-8CD7-C29CA4ADD43B}
+
+
+ {12D20EC8-139C-C2B1-1A66-AC436C48C0A7}
+
+
+ {69E1179D-76EC-26DC-C3E6-6602ED26D783}
+
+
+ {413F481F-075C-2958-115C-D8268682FCB7}
+
+
+ {FFC6E1CC-C772-75E6-5087-FB5D4E016799}
+
+
+ {1182303F-ECA3-166D-AC0C-92C5E762CB93}
+
+
+ {EE1AE8C3-0908-8F53-A4E5-D930C7C97C26}
+
+
+ {61712B09-5783-ADFA-2001-5A0C3D7764EB}
+
+
+ {C3B2EB8A-1A2F-306F-AA78-3E9D1593788B}
+
+
+ {46535B56-3737-2BE8-E3A0-571BCBEB2DA4}
+
+
+ {2CB59E7C-D0E4-7D27-2ACF-C7ABADEE936D}
+
+
+ {5A0AA36E-3957-E413-14C6-31CBE15271DF}
+
+
+ {5FDBD6B1-9BBD-392F-4DA5-FEA40A9370C4}
+
+
+ {A92719C7-70BE-57C4-CE9E-A9BC9DFEB757}
+
+
+ {E980FADB-6E3F-B93C-DE02-CE4271C9BA93}
+
+
+ {F408DCA2-D5E2-0A3A-A064-A1D045889BC1}
+
+
+ {7BCEAB87-62FD-0327-EB5D-679E54EDB9B1}
+
+
+ {C2B9505B-27B4-F650-12BD-F477D4BBCBAA}
+
+
+ {796B7886-44A7-34CC-9B95-BF4FB2C7B6F4}
+
+
+ {8A80BA78-D3A8-C0F8-7FFD-61AA028CE852}
+
+
+ {7A53E6F1-1343-33B8-4CA8-1D7B714A0E76}
+
+
+ {D7E3D10F-3ED8-DFC5-6DB3-E4ACBF8678FB}
+
+
+ {75F1F352-251A-75E0-D941-8431588F5C1E}
+
+
+ {DB6E3D09-66DA-12DA-BAE8-A5BFFA7A14AC}
+
+
+ {8E43579F-C185-266D-DD67-F8B95BD80F2F}
+
+
+ {422C46B7-0467-2DB0-BF3C-16DFCAFD69AC}
+
+
+ {8B4D1BAA-6DB4-CAEC-A0FA-271F354D5C61}
+
+
+
+
+ AnalyticsCollection\Source
+
+
+ Juce Modules\juce_analytics\analytics
+
+
+ Juce Modules\juce_analytics\analytics
+
+
+ Juce Modules\juce_analytics\destinations
+
+
+ Juce Modules\juce_analytics
+
+
+ Juce Modules\juce_core\containers
+
+
+ Juce Modules\juce_core\containers
+
+
+ Juce Modules\juce_core\containers
+
+
+ Juce Modules\juce_core\containers
+
+
+ Juce Modules\juce_core\containers
+
+
+ Juce Modules\juce_core\containers
+
+
+ Juce Modules\juce_core\containers
+
+
+ Juce Modules\juce_core\files
+
+
+ Juce Modules\juce_core\files
+
+
+ Juce Modules\juce_core\files
+
+
+ Juce Modules\juce_core\files
+
+
+ Juce Modules\juce_core\files
+
+
+ Juce Modules\juce_core\files
+
+
+ Juce Modules\juce_core\files
+
+
+ Juce Modules\juce_core\files
+
+
+ Juce Modules\juce_core\javascript
+
+
+ Juce Modules\juce_core\javascript
+
+
+ Juce Modules\juce_core\logging
+
+
+ Juce Modules\juce_core\logging
+
+
+ Juce Modules\juce_core\maths
+
+
+ Juce Modules\juce_core\maths
+
+
+ Juce Modules\juce_core\maths
+
+
+ Juce Modules\juce_core\memory
+
+
+ Juce Modules\juce_core\misc
+
+
+ Juce Modules\juce_core\misc
+
+
+ Juce Modules\juce_core\misc
+
+
+ Juce Modules\juce_core\misc
+
+
+ Juce Modules\juce_core\native
+
+
+ Juce Modules\juce_core\native
+
+
+ Juce Modules\juce_core\native
+
+
+ Juce Modules\juce_core\native
+
+
+ Juce Modules\juce_core\native
+
+
+ Juce Modules\juce_core\native
+
+
+ Juce Modules\juce_core\native
+
+
+ Juce Modules\juce_core\native
+
+
+ Juce Modules\juce_core\native
+
+
+ Juce Modules\juce_core\native
+
+
+ Juce Modules\juce_core\native
+
+
+ Juce Modules\juce_core\native
+
+
+ Juce Modules\juce_core\native
+
+
+ Juce Modules\juce_core\native
+
+
+ Juce Modules\juce_core\native
+
+
+ Juce Modules\juce_core\native
+
+
+ Juce Modules\juce_core\native
+
+
+ Juce Modules\juce_core\native
+
+
+ Juce Modules\juce_core\native
+
+
+ Juce Modules\juce_core\native
+
+
+ Juce Modules\juce_core\native
+
+
+ Juce Modules\juce_core\native
+
+
+ Juce Modules\juce_core\native
+
+
+ Juce Modules\juce_core\network
+
+
+ Juce Modules\juce_core\network
+
+
+ Juce Modules\juce_core\network
+
+
+ Juce Modules\juce_core\network
+
+
+ Juce Modules\juce_core\network
+
+
+ Juce Modules\juce_core\network
+
+
+ Juce Modules\juce_core\streams
+
+
+ Juce Modules\juce_core\streams
+
+
+ Juce Modules\juce_core\streams
+
+
+ Juce Modules\juce_core\streams
+
+
+ Juce Modules\juce_core\streams
+
+
+ Juce Modules\juce_core\streams
+
+
+ Juce Modules\juce_core\streams
+
+
+ Juce Modules\juce_core\system
+
+
+ Juce Modules\juce_core\text
+
+
+ Juce Modules\juce_core\text
+
+
+ Juce Modules\juce_core\text
+
+
+ Juce Modules\juce_core\text
+
+
+ Juce Modules\juce_core\text
+
+
+ Juce Modules\juce_core\text
+
+
+ Juce Modules\juce_core\text
+
+
+ Juce Modules\juce_core\text
+
+
+ Juce Modules\juce_core\text
+
+
+ Juce Modules\juce_core\threads
+
+
+ Juce Modules\juce_core\threads
+
+
+ Juce Modules\juce_core\threads
+
+
+ Juce Modules\juce_core\threads
+
+
+ Juce Modules\juce_core\threads
+
+
+ Juce Modules\juce_core\threads
+
+
+ Juce Modules\juce_core\time
+
+
+ Juce Modules\juce_core\time
+
+
+ Juce Modules\juce_core\time
+
+
+ Juce Modules\juce_core\unit_tests
+
+
+ Juce Modules\juce_core\xml
+
+
+ Juce Modules\juce_core\xml
+
+
+ Juce Modules\juce_core\zip\zlib
+
+
+ Juce Modules\juce_core\zip\zlib
+
+
+ Juce Modules\juce_core\zip\zlib
+
+
+ Juce Modules\juce_core\zip\zlib
+
+
+ Juce Modules\juce_core\zip\zlib
+
+
+ Juce Modules\juce_core\zip\zlib
+
+
+ Juce Modules\juce_core\zip\zlib
+
+
+ Juce Modules\juce_core\zip\zlib
+
+
+ Juce Modules\juce_core\zip\zlib
+
+
+ Juce Modules\juce_core\zip\zlib
+
+
+ Juce Modules\juce_core\zip\zlib
+
+
+ Juce Modules\juce_core\zip
+
+
+ Juce Modules\juce_core\zip
+
+
+ Juce Modules\juce_core\zip
+
+
+ Juce Modules\juce_core
+
+
+ Juce Modules\juce_core
+
+
+ Juce Modules\juce_data_structures\app_properties
+
+
+ Juce Modules\juce_data_structures\app_properties
+
+
+ Juce Modules\juce_data_structures\undomanager
+
+
+ Juce Modules\juce_data_structures\values
+
+
+ Juce Modules\juce_data_structures\values
+
+
+ Juce Modules\juce_data_structures\values
+
+
+ Juce Modules\juce_data_structures\values
+
+
+ Juce Modules\juce_data_structures
+
+
+ Juce Modules\juce_data_structures
+
+
+ Juce Modules\juce_events\broadcasters
+
+
+ Juce Modules\juce_events\broadcasters
+
+
+ Juce Modules\juce_events\broadcasters
+
+
+ Juce Modules\juce_events\interprocess
+
+
+ Juce Modules\juce_events\interprocess
+
+
+ Juce Modules\juce_events\interprocess
+
+
+ Juce Modules\juce_events\messages
+
+
+ Juce Modules\juce_events\messages
+
+
+ Juce Modules\juce_events\messages
+
+
+ Juce Modules\juce_events\messages
+
+
+ Juce Modules\juce_events\native
+
+
+ Juce Modules\juce_events\native
+
+
+ Juce Modules\juce_events\native
+
+
+ Juce Modules\juce_events\native
+
+
+ Juce Modules\juce_events\native
+
+
+ Juce Modules\juce_events\native
+
+
+ Juce Modules\juce_events\timers
+
+
+ Juce Modules\juce_events\timers
+
+
+ Juce Modules\juce_events
+
+
+ Juce Modules\juce_events
+
+
+ Juce Modules\juce_graphics\colour
+
+
+ Juce Modules\juce_graphics\colour
+
+
+ Juce Modules\juce_graphics\colour
+
+
+ Juce Modules\juce_graphics\colour
+
+
+ Juce Modules\juce_graphics\contexts
+
+
+ Juce Modules\juce_graphics\contexts
+
+
+ Juce Modules\juce_graphics\contexts
+
+
+ Juce Modules\juce_graphics\effects
+
+
+ Juce Modules\juce_graphics\effects
+
+
+ Juce Modules\juce_graphics\fonts
+
+
+ Juce Modules\juce_graphics\fonts
+
+
+ Juce Modules\juce_graphics\fonts
+
+
+ Juce Modules\juce_graphics\fonts
+
+
+ Juce Modules\juce_graphics\fonts
+
+
+ Juce Modules\juce_graphics\fonts
+
+
+ Juce Modules\juce_graphics\geometry
+
+
+ Juce Modules\juce_graphics\geometry
+
+
+ Juce Modules\juce_graphics\geometry
+
+
+ Juce Modules\juce_graphics\geometry
+
+
+ Juce Modules\juce_graphics\geometry
+
+
+ Juce Modules\juce_graphics\image_formats\jpglib
+
+
+ Juce Modules\juce_graphics\image_formats\jpglib
+
+
+ Juce Modules\juce_graphics\image_formats\jpglib
+
+
+ Juce Modules\juce_graphics\image_formats\jpglib
+
+
+ Juce Modules\juce_graphics\image_formats\jpglib
+
+
+ Juce Modules\juce_graphics\image_formats\jpglib
+
+
+ Juce Modules\juce_graphics\image_formats\jpglib
+
+
+ Juce Modules\juce_graphics\image_formats\jpglib
+
+
+ Juce Modules\juce_graphics\image_formats\jpglib
+
+
+ Juce Modules\juce_graphics\image_formats\jpglib
+
+
+ Juce Modules\juce_graphics\image_formats\jpglib
+
+
+ Juce Modules\juce_graphics\image_formats\jpglib
+
+
+ Juce Modules\juce_graphics\image_formats\jpglib
+
+
+ Juce Modules\juce_graphics\image_formats\jpglib
+
+
+ Juce Modules\juce_graphics\image_formats\jpglib
+
+
+ Juce Modules\juce_graphics\image_formats\jpglib
+
+
+ Juce Modules\juce_graphics\image_formats\jpglib
+
+
+ Juce Modules\juce_graphics\image_formats\jpglib
+
+
+ Juce Modules\juce_graphics\image_formats\jpglib
+
+
+ Juce Modules\juce_graphics\image_formats\jpglib
+
+
+ Juce Modules\juce_graphics\image_formats\jpglib
+
+
+ Juce Modules\juce_graphics\image_formats\jpglib
+
+
+ Juce Modules\juce_graphics\image_formats\jpglib
+
+
+ Juce Modules\juce_graphics\image_formats\jpglib
+
+
+ Juce Modules\juce_graphics\image_formats\jpglib
+
+
+ Juce Modules\juce_graphics\image_formats\jpglib
+
+
+ Juce Modules\juce_graphics\image_formats\jpglib
+
+
+ Juce Modules\juce_graphics\image_formats\jpglib
+
+
+ Juce Modules\juce_graphics\image_formats\jpglib
+
+
+ Juce Modules\juce_graphics\image_formats\jpglib
+
+
+ Juce Modules\juce_graphics\image_formats\jpglib
+
+
+ Juce Modules\juce_graphics\image_formats\jpglib
+
+
+ Juce Modules\juce_graphics\image_formats\jpglib
+
+
+ Juce Modules\juce_graphics\image_formats\jpglib
+
+
+ Juce Modules\juce_graphics\image_formats\jpglib
+
+
+ Juce Modules\juce_graphics\image_formats\jpglib
+
+
+ Juce Modules\juce_graphics\image_formats\jpglib
+
+
+ Juce Modules\juce_graphics\image_formats\jpglib
+
+
+ Juce Modules\juce_graphics\image_formats\jpglib
+
+
+ Juce Modules\juce_graphics\image_formats\jpglib
+
+
+ Juce Modules\juce_graphics\image_formats\jpglib
+
+
+ Juce Modules\juce_graphics\image_formats\jpglib
+
+
+ Juce Modules\juce_graphics\image_formats\jpglib
+
+
+ Juce Modules\juce_graphics\image_formats\jpglib
+
+
+ Juce Modules\juce_graphics\image_formats\jpglib
+
+
+ Juce Modules\juce_graphics\image_formats\jpglib
+
+
+ Juce Modules\juce_graphics\image_formats\pnglib
+
+
+ Juce Modules\juce_graphics\image_formats\pnglib
+
+
+ Juce Modules\juce_graphics\image_formats\pnglib
+
+
+ Juce Modules\juce_graphics\image_formats\pnglib
+
+
+ Juce Modules\juce_graphics\image_formats\pnglib
+
+
+ Juce Modules\juce_graphics\image_formats\pnglib
+
+
+ Juce Modules\juce_graphics\image_formats\pnglib
+
+
+ Juce Modules\juce_graphics\image_formats\pnglib
+
+
+ Juce Modules\juce_graphics\image_formats\pnglib
+
+
+ Juce Modules\juce_graphics\image_formats\pnglib
+
+
+ Juce Modules\juce_graphics\image_formats\pnglib
+
+
+ Juce Modules\juce_graphics\image_formats\pnglib
+
+
+ Juce Modules\juce_graphics\image_formats\pnglib
+
+
+ Juce Modules\juce_graphics\image_formats\pnglib
+
+
+ Juce Modules\juce_graphics\image_formats\pnglib
+
+
+ Juce Modules\juce_graphics\image_formats
+
+
+ Juce Modules\juce_graphics\image_formats
+
+
+ Juce Modules\juce_graphics\image_formats
+
+
+ Juce Modules\juce_graphics\images
+
+
+ Juce Modules\juce_graphics\images
+
+
+ Juce Modules\juce_graphics\images
+
+
+ Juce Modules\juce_graphics\images
+
+
+ Juce Modules\juce_graphics\native
+
+
+ Juce Modules\juce_graphics\native
+
+
+ Juce Modules\juce_graphics\native
+
+
+ Juce Modules\juce_graphics\native
+
+
+ Juce Modules\juce_graphics\native
+
+
+ Juce Modules\juce_graphics\native
+
+
+ Juce Modules\juce_graphics\native
+
+
+ Juce Modules\juce_graphics\native
+
+
+ Juce Modules\juce_graphics\native
+
+
+ Juce Modules\juce_graphics\native
+
+
+ Juce Modules\juce_graphics\native
+
+
+ Juce Modules\juce_graphics\native
+
+
+ Juce Modules\juce_graphics\native
+
+
+ Juce Modules\juce_graphics\native
+
+
+ Juce Modules\juce_graphics\placement
+
+
+ Juce Modules\juce_graphics
+
+
+ Juce Modules\juce_graphics
+
+
+ Juce Modules\juce_gui_basics\application
+
+
+ Juce Modules\juce_gui_basics\buttons
+
+
+ Juce Modules\juce_gui_basics\buttons
+
+
+ Juce Modules\juce_gui_basics\buttons
+
+
+ Juce Modules\juce_gui_basics\buttons
+
+
+ Juce Modules\juce_gui_basics\buttons
+
+
+ Juce Modules\juce_gui_basics\buttons
+
+
+ Juce Modules\juce_gui_basics\buttons
+
+
+ Juce Modules\juce_gui_basics\buttons
+
+
+ Juce Modules\juce_gui_basics\buttons
+
+
+ Juce Modules\juce_gui_basics\commands
+
+
+ Juce Modules\juce_gui_basics\commands
+
+
+ Juce Modules\juce_gui_basics\commands
+
+
+ Juce Modules\juce_gui_basics\commands
+
+
+ Juce Modules\juce_gui_basics\components
+
+
+ Juce Modules\juce_gui_basics\components
+
+
+ Juce Modules\juce_gui_basics\components
+
+
+ Juce Modules\juce_gui_basics\components
+
+
+ Juce Modules\juce_gui_basics\drawables
+
+
+ Juce Modules\juce_gui_basics\drawables
+
+
+ Juce Modules\juce_gui_basics\drawables
+
+
+ Juce Modules\juce_gui_basics\drawables
+
+
+ Juce Modules\juce_gui_basics\drawables
+
+
+ Juce Modules\juce_gui_basics\drawables
+
+
+ Juce Modules\juce_gui_basics\drawables
+
+
+ Juce Modules\juce_gui_basics\drawables
+
+
+ Juce Modules\juce_gui_basics\filebrowser
+
+
+ Juce Modules\juce_gui_basics\filebrowser
+
+
+ Juce Modules\juce_gui_basics\filebrowser
+
+
+ Juce Modules\juce_gui_basics\filebrowser
+
+
+ Juce Modules\juce_gui_basics\filebrowser
+
+
+ Juce Modules\juce_gui_basics\filebrowser
+
+
+ Juce Modules\juce_gui_basics\filebrowser
+
+
+ Juce Modules\juce_gui_basics\filebrowser
+
+
+ Juce Modules\juce_gui_basics\filebrowser
+
+
+ Juce Modules\juce_gui_basics\filebrowser
+
+
+ Juce Modules\juce_gui_basics\keyboard
+
+
+ Juce Modules\juce_gui_basics\keyboard
+
+
+ Juce Modules\juce_gui_basics\keyboard
+
+
+ Juce Modules\juce_gui_basics\keyboard
+
+
+ Juce Modules\juce_gui_basics\keyboard
+
+
+ Juce Modules\juce_gui_basics\layout
+
+
+ Juce Modules\juce_gui_basics\layout
+
+
+ Juce Modules\juce_gui_basics\layout
+
+
+ Juce Modules\juce_gui_basics\layout
+
+
+ Juce Modules\juce_gui_basics\layout
+
+
+ Juce Modules\juce_gui_basics\layout
+
+
+ Juce Modules\juce_gui_basics\layout
+
+
+ Juce Modules\juce_gui_basics\layout
+
+
+ Juce Modules\juce_gui_basics\layout
+
+
+ Juce Modules\juce_gui_basics\layout
+
+
+ Juce Modules\juce_gui_basics\layout
+
+
+ Juce Modules\juce_gui_basics\layout
+
+
+ Juce Modules\juce_gui_basics\layout
+
+
+ Juce Modules\juce_gui_basics\layout
+
+
+ Juce Modules\juce_gui_basics\layout
+
+
+ Juce Modules\juce_gui_basics\layout
+
+
+ Juce Modules\juce_gui_basics\layout
+
+
+ Juce Modules\juce_gui_basics\layout
+
+
+ Juce Modules\juce_gui_basics\layout
+
+
+ Juce Modules\juce_gui_basics\layout
+
+
+ Juce Modules\juce_gui_basics\layout
+
+
+ Juce Modules\juce_gui_basics\lookandfeel
+
+
+ Juce Modules\juce_gui_basics\lookandfeel
+
+
+ Juce Modules\juce_gui_basics\lookandfeel
+
+
+ Juce Modules\juce_gui_basics\lookandfeel
+
+
+ Juce Modules\juce_gui_basics\lookandfeel
+
+
+ Juce Modules\juce_gui_basics\menus
+
+
+ Juce Modules\juce_gui_basics\menus
+
+
+ Juce Modules\juce_gui_basics\menus
+
+
+ Juce Modules\juce_gui_basics\misc
+
+
+ Juce Modules\juce_gui_basics\misc
+
+
+ Juce Modules\juce_gui_basics\misc
+
+
+ Juce Modules\juce_gui_basics\mouse
+
+
+ Juce Modules\juce_gui_basics\mouse
+
+
+ Juce Modules\juce_gui_basics\mouse
+
+
+ Juce Modules\juce_gui_basics\mouse
+
+
+ Juce Modules\juce_gui_basics\mouse
+
+
+ Juce Modules\juce_gui_basics\mouse
+
+
+ Juce Modules\juce_gui_basics\mouse
+
+
+ Juce Modules\juce_gui_basics\native
+
+
+ Juce Modules\juce_gui_basics\native
+
+
+ Juce Modules\juce_gui_basics\native
+
+
+ Juce Modules\juce_gui_basics\native
+
+
+ Juce Modules\juce_gui_basics\native
+
+
+ Juce Modules\juce_gui_basics\native
+
+
+ Juce Modules\juce_gui_basics\native
+
+
+ Juce Modules\juce_gui_basics\native
+
+
+ Juce Modules\juce_gui_basics\native
+
+
+ Juce Modules\juce_gui_basics\native
+
+
+ Juce Modules\juce_gui_basics\native
+
+
+ Juce Modules\juce_gui_basics\native
+
+
+ Juce Modules\juce_gui_basics\native
+
+
+ Juce Modules\juce_gui_basics\native
+
+
+ Juce Modules\juce_gui_basics\native
+
+
+ Juce Modules\juce_gui_basics\native
+
+
+ Juce Modules\juce_gui_basics\positioning
+
+
+ Juce Modules\juce_gui_basics\positioning
+
+
+ Juce Modules\juce_gui_basics\positioning
+
+
+ Juce Modules\juce_gui_basics\positioning
+
+
+ Juce Modules\juce_gui_basics\positioning
+
+
+ Juce Modules\juce_gui_basics\positioning
+
+
+ Juce Modules\juce_gui_basics\positioning
+
+
+ Juce Modules\juce_gui_basics\properties
+
+
+ Juce Modules\juce_gui_basics\properties
+
+
+ Juce Modules\juce_gui_basics\properties
+
+
+ Juce Modules\juce_gui_basics\properties
+
+
+ Juce Modules\juce_gui_basics\properties
+
+
+ Juce Modules\juce_gui_basics\properties
+
+
+ Juce Modules\juce_gui_basics\properties
+
+
+ Juce Modules\juce_gui_basics\widgets
+
+
+ Juce Modules\juce_gui_basics\widgets
+
+
+ Juce Modules\juce_gui_basics\widgets
+
+
+ Juce Modules\juce_gui_basics\widgets
+
+
+ Juce Modules\juce_gui_basics\widgets
+
+
+ Juce Modules\juce_gui_basics\widgets
+
+
+ Juce Modules\juce_gui_basics\widgets
+
+
+ Juce Modules\juce_gui_basics\widgets
+
+
+ Juce Modules\juce_gui_basics\widgets
+
+
+ Juce Modules\juce_gui_basics\widgets
+
+
+ Juce Modules\juce_gui_basics\widgets
+
+
+ Juce Modules\juce_gui_basics\widgets
+
+
+ Juce Modules\juce_gui_basics\widgets
+
+
+ Juce Modules\juce_gui_basics\windows
+
+
+ Juce Modules\juce_gui_basics\windows
+
+
+ Juce Modules\juce_gui_basics\windows
+
+
+ Juce Modules\juce_gui_basics\windows
+
+
+ Juce Modules\juce_gui_basics\windows
+
+
+ Juce Modules\juce_gui_basics\windows
+
+
+ Juce Modules\juce_gui_basics\windows
+
+
+ Juce Modules\juce_gui_basics\windows
+
+
+ Juce Modules\juce_gui_basics\windows
+
+
+ Juce Modules\juce_gui_basics
+
+
+ Juce Modules\juce_gui_basics
+
+
+ Juce Library Code
+
+
+ Juce Library Code
+
+
+ Juce Library Code
+
+
+ Juce Library Code
+
+
+ Juce Library Code
+
+
+ Juce Library Code
+
+
+
+
+ AnalyticsCollection\Source
+
+
+ AnalyticsCollection\Source
+
+
+ Juce Modules\juce_analytics\analytics
+
+
+ Juce Modules\juce_analytics\analytics
+
+
+ Juce Modules\juce_analytics\destinations
+
+
+ Juce Modules\juce_analytics\destinations
+
+
+ Juce Modules\juce_analytics
+
+
+ Juce Modules\juce_core\containers
+
+
+ Juce Modules\juce_core\containers
+
+
+ Juce Modules\juce_core\containers
+
+
+ Juce Modules\juce_core\containers
+
+
+ Juce Modules\juce_core\containers
+
+
+ Juce Modules\juce_core\containers
+
+
+ Juce Modules\juce_core\containers
+
+
+ Juce Modules\juce_core\containers
+
+
+ Juce Modules\juce_core\containers
+
+
+ Juce Modules\juce_core\containers
+
+
+ Juce Modules\juce_core\containers
+
+
+ Juce Modules\juce_core\containers
+
+
+ Juce Modules\juce_core\containers
+
+
+ Juce Modules\juce_core\containers
+
+
+ Juce Modules\juce_core\containers
+
+
+ Juce Modules\juce_core\containers
+
+
+ Juce Modules\juce_core\files
+
+
+ Juce Modules\juce_core\files
+
+
+ Juce Modules\juce_core\files
+
+
+ Juce Modules\juce_core\files
+
+
+ Juce Modules\juce_core\files
+
+
+ Juce Modules\juce_core\files
+
+
+ Juce Modules\juce_core\files
+
+
+ Juce Modules\juce_core\files
+
+
+ Juce Modules\juce_core\files
+
+
+ Juce Modules\juce_core\javascript
+
+
+ Juce Modules\juce_core\javascript
+
+
+ Juce Modules\juce_core\logging
+
+
+ Juce Modules\juce_core\logging
+
+
+ Juce Modules\juce_core\maths
+
+
+ Juce Modules\juce_core\maths
+
+
+ Juce Modules\juce_core\maths
+
+
+ Juce Modules\juce_core\maths
+
+
+ Juce Modules\juce_core\maths
+
+
+ Juce Modules\juce_core\maths
+
+
+ Juce Modules\juce_core\maths
+
+
+ Juce Modules\juce_core\memory
+
+
+ Juce Modules\juce_core\memory
+
+
+ Juce Modules\juce_core\memory
+
+
+ Juce Modules\juce_core\memory
+
+
+ Juce Modules\juce_core\memory
+
+
+ Juce Modules\juce_core\memory
+
+
+ Juce Modules\juce_core\memory
+
+
+ Juce Modules\juce_core\memory
+
+
+ Juce Modules\juce_core\memory
+
+
+ Juce Modules\juce_core\memory
+
+
+ Juce Modules\juce_core\memory
+
+
+ Juce Modules\juce_core\memory
+
+
+ Juce Modules\juce_core\memory
+
+
+ Juce Modules\juce_core\misc
+
+
+ Juce Modules\juce_core\misc
+
+
+ Juce Modules\juce_core\misc
+
+
+ Juce Modules\juce_core\misc
+
+
+ Juce Modules\juce_core\misc
+
+
+ Juce Modules\juce_core\native
+
+
+ Juce Modules\juce_core\native
+
+
+ Juce Modules\juce_core\native
+
+
+ Juce Modules\juce_core\native
+
+
+ Juce Modules\juce_core\native
+
+
+ Juce Modules\juce_core\native
+
+
+ Juce Modules\juce_core\network
+
+
+ Juce Modules\juce_core\network
+
+
+ Juce Modules\juce_core\network
+
+
+ Juce Modules\juce_core\network
+
+
+ Juce Modules\juce_core\network
+
+
+ Juce Modules\juce_core\network
+
+
+ Juce Modules\juce_core\streams
+
+
+ Juce Modules\juce_core\streams
+
+
+ Juce Modules\juce_core\streams
+
+
+ Juce Modules\juce_core\streams
+
+
+ Juce Modules\juce_core\streams
+
+
+ Juce Modules\juce_core\streams
+
+
+ Juce Modules\juce_core\streams
+
+
+ Juce Modules\juce_core\streams
+
+
+ Juce Modules\juce_core\system
+
+
+ Juce Modules\juce_core\system
+
+
+ Juce Modules\juce_core\system
+
+
+ Juce Modules\juce_core\system
+
+
+ Juce Modules\juce_core\system
+
+
+ Juce Modules\juce_core\text
+
+
+ Juce Modules\juce_core\text
+
+
+ Juce Modules\juce_core\text
+
+
+ Juce Modules\juce_core\text
+
+
+ Juce Modules\juce_core\text
+
+
+ Juce Modules\juce_core\text
+
+
+ Juce Modules\juce_core\text
+
+
+ Juce Modules\juce_core\text
+
+
+ Juce Modules\juce_core\text
+
+
+ Juce Modules\juce_core\text
+
+
+ Juce Modules\juce_core\text
+
+
+ Juce Modules\juce_core\text
+
+
+ Juce Modules\juce_core\text
+
+
+ Juce Modules\juce_core\text
+
+
+ Juce Modules\juce_core\text
+
+
+ Juce Modules\juce_core\threads
+
+
+ Juce Modules\juce_core\threads
+
+
+ Juce Modules\juce_core\threads
+
+
+ Juce Modules\juce_core\threads
+
+
+ Juce Modules\juce_core\threads
+
+
+ Juce Modules\juce_core\threads
+
+
+ Juce Modules\juce_core\threads
+
+
+ Juce Modules\juce_core\threads
+
+
+ Juce Modules\juce_core\threads
+
+
+ Juce Modules\juce_core\threads
+
+
+ Juce Modules\juce_core\threads
+
+
+ Juce Modules\juce_core\threads
+
+
+ Juce Modules\juce_core\threads
+
+
+ Juce Modules\juce_core\threads
+
+
+ Juce Modules\juce_core\threads
+
+
+ Juce Modules\juce_core\threads
+
+
+ Juce Modules\juce_core\time
+
+
+ Juce Modules\juce_core\time
+
+
+ Juce Modules\juce_core\time
+
+
+ Juce Modules\juce_core\unit_tests
+
+
+ Juce Modules\juce_core\xml
+
+
+ Juce Modules\juce_core\xml
+
+
+ Juce Modules\juce_core\zip\zlib
+
+
+ Juce Modules\juce_core\zip\zlib
+
+
+ Juce Modules\juce_core\zip\zlib
+
+
+ Juce Modules\juce_core\zip\zlib
+
+
+ Juce Modules\juce_core\zip\zlib
+
+
+ Juce Modules\juce_core\zip\zlib
+
+
+ Juce Modules\juce_core\zip\zlib
+
+
+ Juce Modules\juce_core\zip\zlib
+
+
+ Juce Modules\juce_core\zip\zlib
+
+
+ Juce Modules\juce_core\zip\zlib
+
+
+ Juce Modules\juce_core\zip\zlib
+
+
+ Juce Modules\juce_core\zip
+
+
+ Juce Modules\juce_core\zip
+
+
+ Juce Modules\juce_core\zip
+
+
+ Juce Modules\juce_core
+
+
+ Juce Modules\juce_data_structures\app_properties
+
+
+ Juce Modules\juce_data_structures\app_properties
+
+
+ Juce Modules\juce_data_structures\undomanager
+
+
+ Juce Modules\juce_data_structures\undomanager
+
+
+ Juce Modules\juce_data_structures\values
+
+
+ Juce Modules\juce_data_structures\values
+
+
+ Juce Modules\juce_data_structures\values
+
+
+ Juce Modules\juce_data_structures\values
+
+
+ Juce Modules\juce_data_structures
+
+
+ Juce Modules\juce_events\broadcasters
+
+
+ Juce Modules\juce_events\broadcasters
+
+
+ Juce Modules\juce_events\broadcasters
+
+
+ Juce Modules\juce_events\broadcasters
+
+
+ Juce Modules\juce_events\broadcasters
+
+
+ Juce Modules\juce_events\interprocess
+
+
+ Juce Modules\juce_events\interprocess
+
+
+ Juce Modules\juce_events\interprocess
+
+
+ Juce Modules\juce_events\messages
+
+
+ Juce Modules\juce_events\messages
+
+
+ Juce Modules\juce_events\messages
+
+
+ Juce Modules\juce_events\messages
+
+
+ Juce Modules\juce_events\messages
+
+
+ Juce Modules\juce_events\messages
+
+
+ Juce Modules\juce_events\messages
+
+
+ Juce Modules\juce_events\messages
+
+
+ Juce Modules\juce_events\messages
+
+
+ Juce Modules\juce_events\native
+
+
+ Juce Modules\juce_events\native
+
+
+ Juce Modules\juce_events\native
+
+
+ Juce Modules\juce_events\native
+
+
+ Juce Modules\juce_events\timers
+
+
+ Juce Modules\juce_events\timers
+
+
+ Juce Modules\juce_events
+
+
+ Juce Modules\juce_graphics\colour
+
+
+ Juce Modules\juce_graphics\colour
+
+
+ Juce Modules\juce_graphics\colour
+
+
+ Juce Modules\juce_graphics\colour
+
+
+ Juce Modules\juce_graphics\colour
+
+
+ Juce Modules\juce_graphics\contexts
+
+
+ Juce Modules\juce_graphics\contexts
+
+
+ Juce Modules\juce_graphics\contexts
+
+
+ Juce Modules\juce_graphics\contexts
+
+
+ Juce Modules\juce_graphics\effects
+
+
+ Juce Modules\juce_graphics\effects
+
+
+ Juce Modules\juce_graphics\effects
+
+
+ Juce Modules\juce_graphics\fonts
+
+
+ Juce Modules\juce_graphics\fonts
+
+
+ Juce Modules\juce_graphics\fonts
+
+
+ Juce Modules\juce_graphics\fonts
+
+
+ Juce Modules\juce_graphics\fonts
+
+
+ Juce Modules\juce_graphics\fonts
+
+
+ Juce Modules\juce_graphics\geometry
+
+
+ Juce Modules\juce_graphics\geometry
+
+
+ Juce Modules\juce_graphics\geometry
+
+
+ Juce Modules\juce_graphics\geometry
+
+
+ Juce Modules\juce_graphics\geometry
+
+
+ Juce Modules\juce_graphics\geometry
+
+
+ Juce Modules\juce_graphics\geometry
+
+
+ Juce Modules\juce_graphics\geometry
+
+
+ Juce Modules\juce_graphics\geometry
+
+
+ Juce Modules\juce_graphics\geometry
+
+
+ Juce Modules\juce_graphics\image_formats\jpglib
+
+
+ Juce Modules\juce_graphics\image_formats\jpglib
+
+
+ Juce Modules\juce_graphics\image_formats\jpglib
+
+
+ Juce Modules\juce_graphics\image_formats\jpglib
+
+
+ Juce Modules\juce_graphics\image_formats\jpglib
+
+
+ Juce Modules\juce_graphics\image_formats\jpglib
+
+
+ Juce Modules\juce_graphics\image_formats\jpglib
+
+
+ Juce Modules\juce_graphics\image_formats\jpglib
+
+
+ Juce Modules\juce_graphics\image_formats\jpglib
+
+
+ Juce Modules\juce_graphics\image_formats\jpglib
+
+
+ Juce Modules\juce_graphics\image_formats\jpglib
+
+
+ Juce Modules\juce_graphics\image_formats\jpglib
+
+
+ Juce Modules\juce_graphics\image_formats\jpglib
+
+
+ Juce Modules\juce_graphics\image_formats\pnglib
+
+
+ Juce Modules\juce_graphics\image_formats\pnglib
+
+
+ Juce Modules\juce_graphics\image_formats\pnglib
+
+
+ Juce Modules\juce_graphics\image_formats\pnglib
+
+
+ Juce Modules\juce_graphics\image_formats\pnglib
+
+
+ Juce Modules\juce_graphics\images
+
+
+ Juce Modules\juce_graphics\images
+
+
+ Juce Modules\juce_graphics\images
+
+
+ Juce Modules\juce_graphics\images
+
+
+ Juce Modules\juce_graphics\native
+
+
+ Juce Modules\juce_graphics\native
+
+
+ Juce Modules\juce_graphics\native
+
+
+ Juce Modules\juce_graphics\native
+
+
+ Juce Modules\juce_graphics\placement
+
+
+ Juce Modules\juce_graphics\placement
+
+
+ Juce Modules\juce_graphics
+
+
+ Juce Modules\juce_gui_basics\application
+
+
+ Juce Modules\juce_gui_basics\buttons
+
+
+ Juce Modules\juce_gui_basics\buttons
+
+
+ Juce Modules\juce_gui_basics\buttons
+
+
+ Juce Modules\juce_gui_basics\buttons
+
+
+ Juce Modules\juce_gui_basics\buttons
+
+
+ Juce Modules\juce_gui_basics\buttons
+
+
+ Juce Modules\juce_gui_basics\buttons
+
+
+ Juce Modules\juce_gui_basics\buttons
+
+
+ Juce Modules\juce_gui_basics\buttons
+
+
+ Juce Modules\juce_gui_basics\commands
+
+
+ Juce Modules\juce_gui_basics\commands
+
+
+ Juce Modules\juce_gui_basics\commands
+
+
+ Juce Modules\juce_gui_basics\commands
+
+
+ Juce Modules\juce_gui_basics\commands
+
+
+ Juce Modules\juce_gui_basics\components
+
+
+ Juce Modules\juce_gui_basics\components
+
+
+ Juce Modules\juce_gui_basics\components
+
+
+ Juce Modules\juce_gui_basics\components
+
+
+ Juce Modules\juce_gui_basics\components
+
+
+ Juce Modules\juce_gui_basics\drawables
+
+
+ Juce Modules\juce_gui_basics\drawables
+
+
+ Juce Modules\juce_gui_basics\drawables
+
+
+ Juce Modules\juce_gui_basics\drawables
+
+
+ Juce Modules\juce_gui_basics\drawables
+
+
+ Juce Modules\juce_gui_basics\drawables
+
+
+ Juce Modules\juce_gui_basics\drawables
+
+
+ Juce Modules\juce_gui_basics\filebrowser
+
+
+ Juce Modules\juce_gui_basics\filebrowser
+
+
+ Juce Modules\juce_gui_basics\filebrowser
+
+
+ Juce Modules\juce_gui_basics\filebrowser
+
+
+ Juce Modules\juce_gui_basics\filebrowser
+
+
+ Juce Modules\juce_gui_basics\filebrowser
+
+
+ Juce Modules\juce_gui_basics\filebrowser
+
+
+ Juce Modules\juce_gui_basics\filebrowser
+
+
+ Juce Modules\juce_gui_basics\filebrowser
+
+
+ Juce Modules\juce_gui_basics\filebrowser
+
+
+ Juce Modules\juce_gui_basics\filebrowser
+
+
+ Juce Modules\juce_gui_basics\filebrowser
+
+
+ Juce Modules\juce_gui_basics\keyboard
+
+
+ Juce Modules\juce_gui_basics\keyboard
+
+
+ Juce Modules\juce_gui_basics\keyboard
+
+
+ Juce Modules\juce_gui_basics\keyboard
+
+
+ Juce Modules\juce_gui_basics\keyboard
+
+
+ Juce Modules\juce_gui_basics\keyboard
+
+
+ Juce Modules\juce_gui_basics\keyboard
+
+
+ Juce Modules\juce_gui_basics\keyboard
+
+
+ Juce Modules\juce_gui_basics\layout
+
+
+ Juce Modules\juce_gui_basics\layout
+
+
+ Juce Modules\juce_gui_basics\layout
+
+
+ Juce Modules\juce_gui_basics\layout
+
+
+ Juce Modules\juce_gui_basics\layout
+
+
+ Juce Modules\juce_gui_basics\layout
+
+
+ Juce Modules\juce_gui_basics\layout
+
+
+ Juce Modules\juce_gui_basics\layout
+
+
+ Juce Modules\juce_gui_basics\layout
+
+
+ Juce Modules\juce_gui_basics\layout
+
+
+ Juce Modules\juce_gui_basics\layout
+
+
+ Juce Modules\juce_gui_basics\layout
+
+
+ Juce Modules\juce_gui_basics\layout
+
+
+ Juce Modules\juce_gui_basics\layout
+
+
+ Juce Modules\juce_gui_basics\layout
+
+
+ Juce Modules\juce_gui_basics\layout
+
+
+ Juce Modules\juce_gui_basics\layout
+
+
+ Juce Modules\juce_gui_basics\layout
+
+
+ Juce Modules\juce_gui_basics\layout
+
+
+ Juce Modules\juce_gui_basics\layout
+
+
+ Juce Modules\juce_gui_basics\layout
+
+
+ Juce Modules\juce_gui_basics\layout
+
+
+ Juce Modules\juce_gui_basics\layout
+
+
+ Juce Modules\juce_gui_basics\lookandfeel
+
+
+ Juce Modules\juce_gui_basics\lookandfeel
+
+
+ Juce Modules\juce_gui_basics\lookandfeel
+
+
+ Juce Modules\juce_gui_basics\lookandfeel
+
+
+ Juce Modules\juce_gui_basics\lookandfeel
+
+
+ Juce Modules\juce_gui_basics\menus
+
+
+ Juce Modules\juce_gui_basics\menus
+
+
+ Juce Modules\juce_gui_basics\menus
+
+
+ Juce Modules\juce_gui_basics\misc
+
+
+ Juce Modules\juce_gui_basics\misc
+
+
+ Juce Modules\juce_gui_basics\misc
+
+
+ Juce Modules\juce_gui_basics\mouse
+
+
+ Juce Modules\juce_gui_basics\mouse
+
+
+ Juce Modules\juce_gui_basics\mouse
+
+
+ Juce Modules\juce_gui_basics\mouse
+
+
+ Juce Modules\juce_gui_basics\mouse
+
+
+ Juce Modules\juce_gui_basics\mouse
+
+
+ Juce Modules\juce_gui_basics\mouse
+
+
+ Juce Modules\juce_gui_basics\mouse
+
+
+ Juce Modules\juce_gui_basics\mouse
+
+
+ Juce Modules\juce_gui_basics\mouse
+
+
+ Juce Modules\juce_gui_basics\mouse
+
+
+ Juce Modules\juce_gui_basics\mouse
+
+
+ Juce Modules\juce_gui_basics\mouse
+
+
+ Juce Modules\juce_gui_basics\native
+
+
+ Juce Modules\juce_gui_basics\native
+
+
+ Juce Modules\juce_gui_basics\positioning
+
+
+ Juce Modules\juce_gui_basics\positioning
+
+
+ Juce Modules\juce_gui_basics\positioning
+
+
+ Juce Modules\juce_gui_basics\positioning
+
+
+ Juce Modules\juce_gui_basics\positioning
+
+
+ Juce Modules\juce_gui_basics\positioning
+
+
+ Juce Modules\juce_gui_basics\positioning
+
+
+ Juce Modules\juce_gui_basics\properties
+
+
+ Juce Modules\juce_gui_basics\properties
+
+
+ Juce Modules\juce_gui_basics\properties
+
+
+ Juce Modules\juce_gui_basics\properties
+
+
+ Juce Modules\juce_gui_basics\properties
+
+
+ Juce Modules\juce_gui_basics\properties
+
+
+ Juce Modules\juce_gui_basics\properties
+
+
+ Juce Modules\juce_gui_basics\widgets
+
+
+ Juce Modules\juce_gui_basics\widgets
+
+
+ Juce Modules\juce_gui_basics\widgets
+
+
+ Juce Modules\juce_gui_basics\widgets
+
+
+ Juce Modules\juce_gui_basics\widgets
+
+
+ Juce Modules\juce_gui_basics\widgets
+
+
+ Juce Modules\juce_gui_basics\widgets
+
+
+ Juce Modules\juce_gui_basics\widgets
+
+
+ Juce Modules\juce_gui_basics\widgets
+
+
+ Juce Modules\juce_gui_basics\widgets
+
+
+ Juce Modules\juce_gui_basics\widgets
+
+
+ Juce Modules\juce_gui_basics\widgets
+
+
+ Juce Modules\juce_gui_basics\widgets
+
+
+ Juce Modules\juce_gui_basics\widgets
+
+
+ Juce Modules\juce_gui_basics\windows
+
+
+ Juce Modules\juce_gui_basics\windows
+
+
+ Juce Modules\juce_gui_basics\windows
+
+
+ Juce Modules\juce_gui_basics\windows
+
+
+ Juce Modules\juce_gui_basics\windows
+
+
+ Juce Modules\juce_gui_basics\windows
+
+
+ Juce Modules\juce_gui_basics\windows
+
+
+ Juce Modules\juce_gui_basics\windows
+
+
+ Juce Modules\juce_gui_basics\windows
+
+
+ Juce Modules\juce_gui_basics\windows
+
+
+ Juce Modules\juce_gui_basics
+
+
+ Juce Library Code
+
+
+ Juce Library Code
+
+
+
+
+ Juce Modules\juce_graphics\image_formats\jpglib
+
+
+ Juce Modules\juce_graphics\image_formats\pnglib
+
+
+
+
+ Juce Library Code
+
+
+
diff --git a/examples/AnalyticsCollection/Builds/VisualStudio2017/resources.rc b/examples/AnalyticsCollection/Builds/VisualStudio2017/resources.rc
new file mode 100644
index 0000000000..e80676c075
--- /dev/null
+++ b/examples/AnalyticsCollection/Builds/VisualStudio2017/resources.rc
@@ -0,0 +1,29 @@
+#ifdef JUCE_USER_DEFINED_RC_FILE
+ #include JUCE_USER_DEFINED_RC_FILE
+#else
+
+#undef WIN32_LEAN_AND_MEAN
+#define WIN32_LEAN_AND_MEAN
+#include
+
+VS_VERSION_INFO VERSIONINFO
+FILEVERSION 1,0,0,0
+BEGIN
+ BLOCK "StringFileInfo"
+ BEGIN
+ BLOCK "040904E4"
+ BEGIN
+ VALUE "FileDescription", "AnalyticsCollection\0"
+ VALUE "FileVersion", "1.0.0\0"
+ VALUE "ProductName", "AnalyticsCollection\0"
+ VALUE "ProductVersion", "1.0.0\0"
+ END
+ END
+
+ BLOCK "VarFileInfo"
+ BEGIN
+ VALUE "Translation", 0x409, 1252
+ END
+END
+
+#endif
diff --git a/examples/AnalyticsCollection/Builds/iOS/AnalyticsCollection.xcodeproj/project.pbxproj b/examples/AnalyticsCollection/Builds/iOS/AnalyticsCollection.xcodeproj/project.pbxproj
new file mode 100644
index 0000000000..a723b6989a
--- /dev/null
+++ b/examples/AnalyticsCollection/Builds/iOS/AnalyticsCollection.xcodeproj/project.pbxproj
@@ -0,0 +1,265 @@
+// !$*UTF8*$!
+{
+ archiveVersion = 1;
+ classes = {
+ };
+ objectVersion = 46;
+ objects = {
+
+ 95AA57DF380DDDCD099D4000 = {isa = PBXBuildFile; fileRef = 707149C59A1AF9752E428B97; };
+ F7E415084D290C237F9E638A = {isa = PBXBuildFile; fileRef = A93F5541F6B3C067538499EF; };
+ A808E8D738B9BD079492797F = {isa = PBXBuildFile; fileRef = D87EBFBF8CF2D8160F22405B; };
+ 921F2D865DD5EBF5AA00DF38 = {isa = PBXBuildFile; fileRef = 644905C665C9F08A8700FE0D; };
+ 107547912F5D18FB3DD33009 = {isa = PBXBuildFile; fileRef = 192797C933B56812538409D4; };
+ 38EE4929FFB8B83FB37B6E73 = {isa = PBXBuildFile; fileRef = FBCE051A0BA6C9FA3E64B47B; };
+ F6BB4E84E37BD38B6CA3025E = {isa = PBXBuildFile; fileRef = E206CE5D6771CAAA3C56F465; };
+ 02E32ED5F96146B51FE4669C = {isa = PBXBuildFile; fileRef = BC02966C48A4F51E9A187E4A; };
+ D293FC19C031441D146F2410 = {isa = PBXBuildFile; fileRef = 6A86C9751E9DCFA62D4562DB; };
+ 962036B1BB2EDB0F9D53E125 = {isa = PBXBuildFile; fileRef = 33B9806EFA95DA05ACD9344E; };
+ 6297B7A712B1E5A74311F162 = {isa = PBXBuildFile; fileRef = 5DC0FF6BC4AE24FABC41F20E; };
+ 132F9FBC9EB36AF2E755325D = {isa = PBXBuildFile; fileRef = AD2CFF58DA5E1C6EDF9CC399; };
+ 805CDCC5840B0D713C286826 = {isa = PBXBuildFile; fileRef = A0DDFB3559C431E96EC59392; };
+ C09B5A3CD0643CF37C9CF851 = {isa = PBXBuildFile; fileRef = 61FADB63565026F559F43F3B; };
+ A1DF340E80EC501B1DBE75A0 = {isa = PBXBuildFile; fileRef = 65311EED96DCA9B62EBFEA04; };
+ 02589D465A73E0112B97BD3A = {isa = PBXFileReference; lastKnownFileType = file; name = "juce_core"; path = "../../../../modules/juce_core"; sourceTree = "SOURCE_ROOT"; };
+ 192797C933B56812538409D4 = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = System/Library/Frameworks/Foundation.framework; sourceTree = SDKROOT; };
+ 1AA9DA887BE127DCED5228BB = {isa = PBXFileReference; lastKnownFileType = file; name = "juce_events"; path = "../../../../modules/juce_events"; sourceTree = "SOURCE_ROOT"; };
+ 33B9806EFA95DA05ACD9344E = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "include_juce_analytics.cpp"; path = "../../JuceLibraryCode/include_juce_analytics.cpp"; sourceTree = "SOURCE_ROOT"; };
+ 5219A3D3BECB8C7135C90377 = {isa = PBXFileReference; lastKnownFileType = file; name = "juce_gui_basics"; path = "../../../../modules/juce_gui_basics"; sourceTree = "SOURCE_ROOT"; };
+ 5DC0FF6BC4AE24FABC41F20E = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "include_juce_core.mm"; path = "../../JuceLibraryCode/include_juce_core.mm"; sourceTree = "SOURCE_ROOT"; };
+ 61FADB63565026F559F43F3B = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "include_juce_graphics.mm"; path = "../../JuceLibraryCode/include_juce_graphics.mm"; sourceTree = "SOURCE_ROOT"; };
+ 644905C665C9F08A8700FE0D = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreText.framework; path = System/Library/Frameworks/CoreText.framework; sourceTree = SDKROOT; };
+ 65311EED96DCA9B62EBFEA04 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "include_juce_gui_basics.mm"; path = "../../JuceLibraryCode/include_juce_gui_basics.mm"; sourceTree = "SOURCE_ROOT"; };
+ 6A86C9751E9DCFA62D4562DB = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = Main.cpp; path = ../../Source/Main.cpp; sourceTree = "SOURCE_ROOT"; };
+ 707149C59A1AF9752E428B97 = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = AnalyticsCollection.app; sourceTree = "BUILT_PRODUCTS_DIR"; };
+ 7A9FA859A2C2AE9FDDC99AD9 = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; name = "Info-App.plist"; path = "Info-App.plist"; sourceTree = "SOURCE_ROOT"; };
+ 886AEA380A40C905503764EB = {isa = PBXFileReference; lastKnownFileType = file; name = "juce_graphics"; path = "../../../../modules/juce_graphics"; sourceTree = "SOURCE_ROOT"; };
+ 8A74F3F7422C89A897D93397 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = AppConfig.h; path = ../../JuceLibraryCode/AppConfig.h; sourceTree = "SOURCE_ROOT"; };
+ 8B927F72BA8726A064560942 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = GoogleAnalyticsDestination.h; path = ../../Source/GoogleAnalyticsDestination.h; sourceTree = "SOURCE_ROOT"; };
+ 91208A06115D573563996967 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = JuceHeader.h; path = ../../JuceLibraryCode/JuceHeader.h; sourceTree = "SOURCE_ROOT"; };
+ 996BEF5ADCE2EC85EB9F637F = {isa = PBXFileReference; lastKnownFileType = file; name = "juce_data_structures"; path = "../../../../modules/juce_data_structures"; sourceTree = "SOURCE_ROOT"; };
+ A0DDFB3559C431E96EC59392 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "include_juce_events.mm"; path = "../../JuceLibraryCode/include_juce_events.mm"; sourceTree = "SOURCE_ROOT"; };
+ A93F5541F6B3C067538499EF = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreGraphics.framework; path = System/Library/Frameworks/CoreGraphics.framework; sourceTree = SDKROOT; };
+ AD2CFF58DA5E1C6EDF9CC399 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "include_juce_data_structures.mm"; path = "../../JuceLibraryCode/include_juce_data_structures.mm"; sourceTree = "SOURCE_ROOT"; };
+ BC02966C48A4F51E9A187E4A = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; name = Images.xcassets; path = AnalyticsCollection/Images.xcassets; sourceTree = "SOURCE_ROOT"; };
+ D352CDB4CA7E8B21FAA83B8C = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = MainComponent.h; path = ../../Source/MainComponent.h; sourceTree = "SOURCE_ROOT"; };
+ D87EBFBF8CF2D8160F22405B = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreImage.framework; path = System/Library/Frameworks/CoreImage.framework; sourceTree = SDKROOT; };
+ E206CE5D6771CAAA3C56F465 = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = UIKit.framework; path = System/Library/Frameworks/UIKit.framework; sourceTree = SDKROOT; };
+ F2CF007AA4C90AC7A5AD1604 = {isa = PBXFileReference; lastKnownFileType = file; name = "juce_analytics"; path = "../../../../modules/juce_analytics"; sourceTree = "SOURCE_ROOT"; };
+ FBCE051A0BA6C9FA3E64B47B = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = QuartzCore.framework; path = System/Library/Frameworks/QuartzCore.framework; sourceTree = SDKROOT; };
+ D269FA28B5D6012AEFE0BF20 = {isa = PBXGroup; children = (
+ 8B927F72BA8726A064560942,
+ D352CDB4CA7E8B21FAA83B8C,
+ 6A86C9751E9DCFA62D4562DB, ); name = Source; sourceTree = ""; };
+ 2B971235E85DF9D98B6FC8AF = {isa = PBXGroup; children = (
+ D269FA28B5D6012AEFE0BF20, ); name = AnalyticsCollection; sourceTree = ""; };
+ 0B35DCE65DF34DECBF1D8118 = {isa = PBXGroup; children = (
+ F2CF007AA4C90AC7A5AD1604,
+ 02589D465A73E0112B97BD3A,
+ 996BEF5ADCE2EC85EB9F637F,
+ 1AA9DA887BE127DCED5228BB,
+ 886AEA380A40C905503764EB,
+ 5219A3D3BECB8C7135C90377, ); name = "Juce Modules"; sourceTree = ""; };
+ B24D9AE60E0CE5D1A75693B5 = {isa = PBXGroup; children = (
+ 8A74F3F7422C89A897D93397,
+ 33B9806EFA95DA05ACD9344E,
+ 5DC0FF6BC4AE24FABC41F20E,
+ AD2CFF58DA5E1C6EDF9CC399,
+ A0DDFB3559C431E96EC59392,
+ 61FADB63565026F559F43F3B,
+ 65311EED96DCA9B62EBFEA04,
+ 91208A06115D573563996967, ); name = "Juce Library Code"; sourceTree = ""; };
+ 782C3BD0C802236A266FDEDD = {isa = PBXGroup; children = (
+ 7A9FA859A2C2AE9FDDC99AD9,
+ BC02966C48A4F51E9A187E4A, ); name = Resources; sourceTree = ""; };
+ F70B9CB615E26A697D2CBEB4 = {isa = PBXGroup; children = (
+ A93F5541F6B3C067538499EF,
+ D87EBFBF8CF2D8160F22405B,
+ 644905C665C9F08A8700FE0D,
+ 192797C933B56812538409D4,
+ FBCE051A0BA6C9FA3E64B47B,
+ E206CE5D6771CAAA3C56F465, ); name = Frameworks; sourceTree = ""; };
+ 40E8A594A7EAFA1EF5707952 = {isa = PBXGroup; children = (
+ 707149C59A1AF9752E428B97, ); name = Products; sourceTree = ""; };
+ 5CB45B3816ED17D0620DDEBF = {isa = PBXGroup; children = (
+ 2B971235E85DF9D98B6FC8AF,
+ 0B35DCE65DF34DECBF1D8118,
+ B24D9AE60E0CE5D1A75693B5,
+ 782C3BD0C802236A266FDEDD,
+ F70B9CB615E26A697D2CBEB4,
+ 40E8A594A7EAFA1EF5707952, ); name = Source; sourceTree = ""; };
+ 6FF8E864589AD3C2C06BF546 = {isa = XCBuildConfiguration; buildSettings = {
+ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
+ ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME = LaunchImage;
+ CLANG_CXX_LANGUAGE_STANDARD = "c++11";
+ CLANG_LINK_OBJC_RUNTIME = NO;
+ COMBINE_HIDPI_IMAGES = YES;
+ CONFIGURATION_BUILD_DIR = "$(PROJECT_DIR)/build/$(CONFIGURATION)";
+ COPY_PHASE_STRIP = NO;
+ GCC_DYNAMIC_NO_PIC = NO;
+ GCC_OPTIMIZATION_LEVEL = 0;
+ GCC_PREPROCESSOR_DEFINITIONS = (
+ "_DEBUG=1",
+ "DEBUG=1",
+ "JUCER_XCODE_IPHONE_5BC26AE3=1",
+ "JUCE_APP_VERSION=1.0.0",
+ "JUCE_APP_VERSION_HEX=0x10000",
+ "JucePlugin_Build_VST=0",
+ "JucePlugin_Build_VST3=0",
+ "JucePlugin_Build_AU=0",
+ "JucePlugin_Build_AUv3=0",
+ "JucePlugin_Build_RTAS=0",
+ "JucePlugin_Build_AAX=0",
+ "JucePlugin_Build_Standalone=0", );
+ GCC_VERSION = com.apple.compilers.llvm.clang.1_0;
+ HEADER_SEARCH_PATHS = ("../../JuceLibraryCode", "../../../../modules", "$(inherited)");
+ INFOPLIST_FILE = Info-App.plist;
+ INFOPLIST_PREPROCESS = NO;
+ INSTALL_PATH = "$(HOME)/Applications";
+ PRODUCT_BUNDLE_IDENTIFIER = com.yourcompany.AnalyticsCollection;
+ USE_HEADERMAP = NO; }; name = Debug; };
+ 8575FCD908F2B0E4E641C1A0 = {isa = XCBuildConfiguration; buildSettings = {
+ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
+ ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME = LaunchImage;
+ CLANG_CXX_LANGUAGE_STANDARD = "c++11";
+ CLANG_LINK_OBJC_RUNTIME = NO;
+ COMBINE_HIDPI_IMAGES = YES;
+ CONFIGURATION_BUILD_DIR = "$(PROJECT_DIR)/build/$(CONFIGURATION)";
+ DEAD_CODE_STRIPPING = YES;
+ GCC_GENERATE_DEBUGGING_SYMBOLS = NO;
+ GCC_OPTIMIZATION_LEVEL = 3;
+ GCC_PREPROCESSOR_DEFINITIONS = (
+ "_NDEBUG=1",
+ "NDEBUG=1",
+ "JUCER_XCODE_IPHONE_5BC26AE3=1",
+ "JUCE_APP_VERSION=1.0.0",
+ "JUCE_APP_VERSION_HEX=0x10000",
+ "JucePlugin_Build_VST=0",
+ "JucePlugin_Build_VST3=0",
+ "JucePlugin_Build_AU=0",
+ "JucePlugin_Build_AUv3=0",
+ "JucePlugin_Build_RTAS=0",
+ "JucePlugin_Build_AAX=0",
+ "JucePlugin_Build_Standalone=0", );
+ GCC_SYMBOLS_PRIVATE_EXTERN = YES;
+ GCC_VERSION = com.apple.compilers.llvm.clang.1_0;
+ HEADER_SEARCH_PATHS = ("../../JuceLibraryCode", "../../../../modules", "$(inherited)");
+ INFOPLIST_FILE = Info-App.plist;
+ INFOPLIST_PREPROCESS = NO;
+ INSTALL_PATH = "$(HOME)/Applications";
+ PRODUCT_BUNDLE_IDENTIFIER = com.yourcompany.AnalyticsCollection;
+ USE_HEADERMAP = NO; }; name = Release; };
+ 0399310F2F5034CFCB14437B = {isa = XCBuildConfiguration; buildSettings = {
+ "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
+ ALWAYS_SEARCH_USER_PATHS = NO;
+ CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
+ CLANG_WARN_BOOL_CONVERSION = YES;
+ CLANG_WARN_COMMA = YES;
+ CLANG_WARN_CONSTANT_CONVERSION = YES;
+ CLANG_WARN_EMPTY_BODY = YES;
+ CLANG_WARN_ENUM_CONVERSION = YES;
+ CLANG_WARN_INFINITE_RECURSION = YES;
+ CLANG_WARN_INT_CONVERSION = YES;
+ CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
+ CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
+ CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
+ CLANG_WARN_STRICT_PROTOTYPES = YES;
+ CLANG_WARN_SUSPICIOUS_MOVE = YES;
+ CLANG_WARN_UNREACHABLE_CODE = YES;
+ CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
+ DEBUG_INFORMATION_FORMAT = "dwarf";
+ ENABLE_STRICT_OBJC_MSGSEND = YES;
+ ENABLE_TESTABILITY = YES;
+ GCC_C_LANGUAGE_STANDARD = c11;
+ GCC_INLINES_ARE_PRIVATE_EXTERN = YES;
+ GCC_MODEL_TUNING = G5;
+ GCC_NO_COMMON_BLOCKS = YES;
+ GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
+ GCC_WARN_ABOUT_RETURN_TYPE = YES;
+ GCC_WARN_CHECK_SWITCH_STATEMENTS = YES;
+ GCC_WARN_MISSING_PARENTHESES = YES;
+ GCC_WARN_NON_VIRTUAL_DESTRUCTOR = YES;
+ GCC_WARN_TYPECHECK_CALLS_TO_PRINTF = YES;
+ GCC_WARN_UNDECLARED_SELECTOR = YES;
+ GCC_WARN_UNINITIALIZED_AUTOS = YES;
+ GCC_WARN_UNUSED_FUNCTION = YES;
+ GCC_WARN_UNUSED_VARIABLE = YES;
+ IPHONEOS_DEPLOYMENT_TARGET = 9.3;
+ ONLY_ACTIVE_ARCH = YES;
+ PRODUCT_NAME = "AnalyticsCollection";
+ SDKROOT = iphoneos;
+ TARGETED_DEVICE_FAMILY = "1,2";
+ WARNING_CFLAGS = -Wreorder;
+ ZERO_LINK = NO; }; name = Debug; };
+ D9987A1AC287063A4E090185 = {isa = XCBuildConfiguration; buildSettings = {
+ "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
+ ALWAYS_SEARCH_USER_PATHS = NO;
+ CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
+ CLANG_WARN_BOOL_CONVERSION = YES;
+ CLANG_WARN_COMMA = YES;
+ CLANG_WARN_CONSTANT_CONVERSION = YES;
+ CLANG_WARN_EMPTY_BODY = YES;
+ CLANG_WARN_ENUM_CONVERSION = YES;
+ CLANG_WARN_INFINITE_RECURSION = YES;
+ CLANG_WARN_INT_CONVERSION = YES;
+ CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
+ CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
+ CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
+ CLANG_WARN_STRICT_PROTOTYPES = YES;
+ CLANG_WARN_SUSPICIOUS_MOVE = YES;
+ CLANG_WARN_UNREACHABLE_CODE = YES;
+ CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
+ DEBUG_INFORMATION_FORMAT = "dwarf";
+ ENABLE_STRICT_OBJC_MSGSEND = YES;
+ GCC_C_LANGUAGE_STANDARD = c11;
+ GCC_INLINES_ARE_PRIVATE_EXTERN = YES;
+ GCC_MODEL_TUNING = G5;
+ GCC_NO_COMMON_BLOCKS = YES;
+ GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
+ GCC_WARN_ABOUT_RETURN_TYPE = YES;
+ GCC_WARN_CHECK_SWITCH_STATEMENTS = YES;
+ GCC_WARN_MISSING_PARENTHESES = YES;
+ GCC_WARN_NON_VIRTUAL_DESTRUCTOR = YES;
+ GCC_WARN_TYPECHECK_CALLS_TO_PRINTF = YES;
+ GCC_WARN_UNDECLARED_SELECTOR = YES;
+ GCC_WARN_UNINITIALIZED_AUTOS = YES;
+ GCC_WARN_UNUSED_FUNCTION = YES;
+ GCC_WARN_UNUSED_VARIABLE = YES;
+ IPHONEOS_DEPLOYMENT_TARGET = 9.3;
+ PRODUCT_NAME = "AnalyticsCollection";
+ SDKROOT = iphoneos;
+ TARGETED_DEVICE_FAMILY = "1,2";
+ WARNING_CFLAGS = -Wreorder;
+ ZERO_LINK = NO; }; name = Release; };
+ E1B8C9CDDA25A31AA3C9C1BC = {isa = PBXTargetDependency; target = 3195ADB3A101AAE977C998D2; };
+ 65535D1056F6B2C9C545923E = {isa = XCConfigurationList; buildConfigurations = (
+ 0399310F2F5034CFCB14437B,
+ D9987A1AC287063A4E090185, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Debug; };
+ 850BB95DDE68E87344778037 = {isa = XCConfigurationList; buildConfigurations = (
+ 6FF8E864589AD3C2C06BF546,
+ 8575FCD908F2B0E4E641C1A0, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Debug; };
+ 9DE971716CBA79E89467EFD0 = {isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = (
+ 02E32ED5F96146B51FE4669C, ); runOnlyForDeploymentPostprocessing = 0; };
+ A01C1A7AFBB72E638096E0BA = {isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = (
+ D293FC19C031441D146F2410,
+ 962036B1BB2EDB0F9D53E125,
+ 6297B7A712B1E5A74311F162,
+ 132F9FBC9EB36AF2E755325D,
+ 805CDCC5840B0D713C286826,
+ C09B5A3CD0643CF37C9CF851,
+ A1DF340E80EC501B1DBE75A0, ); runOnlyForDeploymentPostprocessing = 0; };
+ 32F46511CABBD859FD1D427D = {isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = (
+ F7E415084D290C237F9E638A,
+ A808E8D738B9BD079492797F,
+ 921F2D865DD5EBF5AA00DF38,
+ 107547912F5D18FB3DD33009,
+ 38EE4929FFB8B83FB37B6E73,
+ F6BB4E84E37BD38B6CA3025E, ); runOnlyForDeploymentPostprocessing = 0; };
+ 3195ADB3A101AAE977C998D2 = {isa = PBXNativeTarget; buildConfigurationList = 850BB95DDE68E87344778037; buildPhases = (
+ 9DE971716CBA79E89467EFD0,
+ A01C1A7AFBB72E638096E0BA,
+ 32F46511CABBD859FD1D427D, ); buildRules = ( ); dependencies = ( ); name = "AnalyticsCollection - App"; productName = AnalyticsCollection; productReference = 707149C59A1AF9752E428B97; productType = "com.apple.product-type.application"; };
+ 8C6201B9CB81795542E3302D = {isa = PBXProject; buildConfigurationList = 65535D1056F6B2C9C545923E; attributes = { LastUpgradeCheck = 0830; TargetAttributes = { 3195ADB3A101AAE977C998D2 = { SystemCapabilities = {com.apple.ApplicationGroups.iOS = { enabled = 0; }; com.apple.InAppPurchase = { enabled = 0; }; com.apple.InterAppAudio = { enabled = 0; }; com.apple.Push = { enabled = 0; }; com.apple.Sandbox = { enabled = 0; }; }; }; }; }; compatibilityVersion = "Xcode 3.2"; hasScannedForEncodings = 0; mainGroup = 5CB45B3816ED17D0620DDEBF; projectDirPath = ""; projectRoot = ""; targets = (3195ADB3A101AAE977C998D2); };
+ };
+ rootObject = 8C6201B9CB81795542E3302D;
+}
diff --git a/examples/AnalyticsCollection/Builds/iOS/AnalyticsCollection/Images.xcassets/AppIcon.appiconset/Contents.json b/examples/AnalyticsCollection/Builds/iOS/AnalyticsCollection/Images.xcassets/AppIcon.appiconset/Contents.json
new file mode 100644
index 0000000000..e216154693
--- /dev/null
+++ b/examples/AnalyticsCollection/Builds/iOS/AnalyticsCollection/Images.xcassets/AppIcon.appiconset/Contents.json
@@ -0,0 +1,158 @@
+{
+ "images": [
+ {
+ "idiom": "iphone",
+ "size": "20x20",
+ "filename": "Icon-Notification-20@2x.png",
+ "scale": "2x"
+ },
+ {
+ "idiom": "iphone",
+ "size": "20x20",
+ "filename": "Icon-Notification-20@3x.png",
+ "scale": "3x"
+ },
+ {
+ "idiom": "iphone",
+ "size": "29x29",
+ "filename": "Icon-29.png",
+ "scale": "1x"
+ },
+ {
+ "idiom": "iphone",
+ "size": "29x29",
+ "filename": "Icon-29@2x.png",
+ "scale": "2x"
+ },
+ {
+ "idiom": "iphone",
+ "size": "29x29",
+ "filename": "Icon-29@3x.png",
+ "scale": "3x"
+ },
+ {
+ "idiom": "iphone",
+ "size": "40x40",
+ "filename": "Icon-Spotlight-40@2x.png",
+ "scale": "2x"
+ },
+ {
+ "idiom": "iphone",
+ "size": "40x40",
+ "filename": "Icon-Spotlight-40@3x.png",
+ "scale": "3x"
+ },
+ {
+ "idiom": "iphone",
+ "size": "57x57",
+ "filename": "Icon.png",
+ "scale": "1x"
+ },
+ {
+ "idiom": "iphone",
+ "size": "57x57",
+ "filename": "Icon@2x.png",
+ "scale": "2x"
+ },
+ {
+ "idiom": "iphone",
+ "size": "60x60",
+ "filename": "Icon-60@2x.png",
+ "scale": "2x"
+ },
+ {
+ "idiom": "iphone",
+ "size": "60x60",
+ "filename": "Icon-@3x.png",
+ "scale": "3x"
+ },
+ {
+ "idiom": "ipad",
+ "size": "20x20",
+ "filename": "Icon-Notifications-20.png",
+ "scale": "1x"
+ },
+ {
+ "idiom": "ipad",
+ "size": "20x20",
+ "filename": "Icon-Notifications-20@2x.png",
+ "scale": "2x"
+ },
+ {
+ "idiom": "ipad",
+ "size": "29x29",
+ "filename": "Icon-Small-1.png",
+ "scale": "1x"
+ },
+ {
+ "idiom": "ipad",
+ "size": "29x29",
+ "filename": "Icon-Small@2x-1.png",
+ "scale": "2x"
+ },
+ {
+ "idiom": "ipad",
+ "size": "40x40",
+ "filename": "Icon-Spotlight-40.png",
+ "scale": "1x"
+ },
+ {
+ "idiom": "ipad",
+ "size": "40x40",
+ "filename": "Icon-Spotlight-40@2x-1.png",
+ "scale": "2x"
+ },
+ {
+ "idiom": "ipad",
+ "size": "50x50",
+ "filename": "Icon-Small-50.png",
+ "scale": "1x"
+ },
+ {
+ "idiom": "ipad",
+ "size": "50x50",
+ "filename": "Icon-Small-50@2x.png",
+ "scale": "2x"
+ },
+ {
+ "idiom": "ipad",
+ "size": "72x72",
+ "filename": "Icon-72.png",
+ "scale": "1x"
+ },
+ {
+ "idiom": "ipad",
+ "size": "72x72",
+ "filename": "Icon-72@2x.png",
+ "scale": "2x"
+ },
+ {
+ "idiom": "ipad",
+ "size": "76x76",
+ "filename": "Icon-76.png",
+ "scale": "1x"
+ },
+ {
+ "idiom": "ipad",
+ "size": "76x76",
+ "filename": "Icon-76@2x.png",
+ "scale": "2x"
+ },
+ {
+ "idiom": "ipad",
+ "size": "83.5x83.5",
+ "filename": "Icon-83.5@2x.png",
+ "scale": "2x"
+ },
+ {
+ "idiom": "ios-marketing",
+ "size": "1024x1024",
+ "filename": "Icon-AppStore-1024.png",
+ "scale": "1x"
+ }
+ ],
+ "info": {
+ "version": 1,
+ "author": "xcode"
+ }
+}
\ No newline at end of file
diff --git a/examples/AnalyticsCollection/Builds/iOS/AnalyticsCollection/Images.xcassets/LaunchImage.launchimage/Contents.json b/examples/AnalyticsCollection/Builds/iOS/AnalyticsCollection/Images.xcassets/LaunchImage.launchimage/Contents.json
new file mode 100644
index 0000000000..235448f31e
--- /dev/null
+++ b/examples/AnalyticsCollection/Builds/iOS/AnalyticsCollection/Images.xcassets/LaunchImage.launchimage/Contents.json
@@ -0,0 +1,57 @@
+{
+ "images": [
+ {
+ "orientation": "portrait",
+ "idiom": "iphone",
+ "extent": "full-screen",
+ "minimum-system-version": "7.0",
+ "scale": "2x",
+ "filename": "LaunchImage-iphone-2x.png"
+ },
+ {
+ "orientation": "portrait",
+ "idiom": "iphone",
+ "extent": "full-screen",
+ "minimum-system-version": "7.0",
+ "scale": "2x",
+ "filename": "LaunchImage-iphone-retina4.png",
+ "subtype": "retina4"
+ },
+ {
+ "orientation": "portrait",
+ "idiom": "ipad",
+ "extent": "full-screen",
+ "minimum-system-version": "7.0",
+ "scale": "1x",
+ "filename": "LaunchImage-ipad-portrait-1x.png"
+ },
+ {
+ "orientation": "landscape",
+ "idiom": "ipad",
+ "extent": "full-screen",
+ "minimum-system-version": "7.0",
+ "scale": "1x",
+ "filename": "LaunchImage-ipad-landscape-1x.png"
+ },
+ {
+ "orientation": "portrait",
+ "idiom": "ipad",
+ "extent": "full-screen",
+ "minimum-system-version": "7.0",
+ "scale": "2x",
+ "filename": "LaunchImage-ipad-portrait-2x.png"
+ },
+ {
+ "orientation": "landscape",
+ "idiom": "ipad",
+ "extent": "full-screen",
+ "minimum-system-version": "7.0",
+ "scale": "2x",
+ "filename": "LaunchImage-ipad-landscape-2x.png"
+ }
+ ],
+ "info": {
+ "version": 1,
+ "author": "xcode"
+ }
+}
\ No newline at end of file
diff --git a/examples/AnalyticsCollection/Builds/iOS/AnalyticsCollection/Images.xcassets/LaunchImage.launchimage/LaunchImage-ipad-landscape-1x.png b/examples/AnalyticsCollection/Builds/iOS/AnalyticsCollection/Images.xcassets/LaunchImage.launchimage/LaunchImage-ipad-landscape-1x.png
new file mode 100644
index 0000000000..b8a0025f63
Binary files /dev/null and b/examples/AnalyticsCollection/Builds/iOS/AnalyticsCollection/Images.xcassets/LaunchImage.launchimage/LaunchImage-ipad-landscape-1x.png differ
diff --git a/examples/AnalyticsCollection/Builds/iOS/AnalyticsCollection/Images.xcassets/LaunchImage.launchimage/LaunchImage-ipad-landscape-2x.png b/examples/AnalyticsCollection/Builds/iOS/AnalyticsCollection/Images.xcassets/LaunchImage.launchimage/LaunchImage-ipad-landscape-2x.png
new file mode 100644
index 0000000000..817cdf8057
Binary files /dev/null and b/examples/AnalyticsCollection/Builds/iOS/AnalyticsCollection/Images.xcassets/LaunchImage.launchimage/LaunchImage-ipad-landscape-2x.png differ
diff --git a/examples/AnalyticsCollection/Builds/iOS/AnalyticsCollection/Images.xcassets/LaunchImage.launchimage/LaunchImage-ipad-portrait-1x.png b/examples/AnalyticsCollection/Builds/iOS/AnalyticsCollection/Images.xcassets/LaunchImage.launchimage/LaunchImage-ipad-portrait-1x.png
new file mode 100644
index 0000000000..f3685597a1
Binary files /dev/null and b/examples/AnalyticsCollection/Builds/iOS/AnalyticsCollection/Images.xcassets/LaunchImage.launchimage/LaunchImage-ipad-portrait-1x.png differ
diff --git a/examples/AnalyticsCollection/Builds/iOS/AnalyticsCollection/Images.xcassets/LaunchImage.launchimage/LaunchImage-ipad-portrait-2x.png b/examples/AnalyticsCollection/Builds/iOS/AnalyticsCollection/Images.xcassets/LaunchImage.launchimage/LaunchImage-ipad-portrait-2x.png
new file mode 100644
index 0000000000..5447ddfc5b
Binary files /dev/null and b/examples/AnalyticsCollection/Builds/iOS/AnalyticsCollection/Images.xcassets/LaunchImage.launchimage/LaunchImage-ipad-portrait-2x.png differ
diff --git a/examples/AnalyticsCollection/Builds/iOS/AnalyticsCollection/Images.xcassets/LaunchImage.launchimage/LaunchImage-iphone-2x.png b/examples/AnalyticsCollection/Builds/iOS/AnalyticsCollection/Images.xcassets/LaunchImage.launchimage/LaunchImage-iphone-2x.png
new file mode 100644
index 0000000000..efe9e82a32
Binary files /dev/null and b/examples/AnalyticsCollection/Builds/iOS/AnalyticsCollection/Images.xcassets/LaunchImage.launchimage/LaunchImage-iphone-2x.png differ
diff --git a/examples/AnalyticsCollection/Builds/iOS/AnalyticsCollection/Images.xcassets/LaunchImage.launchimage/LaunchImage-iphone-retina4.png b/examples/AnalyticsCollection/Builds/iOS/AnalyticsCollection/Images.xcassets/LaunchImage.launchimage/LaunchImage-iphone-retina4.png
new file mode 100644
index 0000000000..d0e3261440
Binary files /dev/null and b/examples/AnalyticsCollection/Builds/iOS/AnalyticsCollection/Images.xcassets/LaunchImage.launchimage/LaunchImage-iphone-retina4.png differ
diff --git a/examples/AnalyticsCollection/Builds/iOS/Info-App.plist b/examples/AnalyticsCollection/Builds/iOS/Info-App.plist
new file mode 100644
index 0000000000..2dd93ddc1a
--- /dev/null
+++ b/examples/AnalyticsCollection/Builds/iOS/Info-App.plist
@@ -0,0 +1,43 @@
+
+
+
+
+
+ LSRequiresIPhoneOS
+
+ UIViewControllerBasedStatusBarAppearance
+
+ CFBundleExecutable
+ ${EXECUTABLE_NAME}
+ CFBundleIdentifier
+ com.yourcompany.AnalyticsCollection
+ CFBundleName
+ AnalyticsCollection
+ CFBundleDisplayName
+ AnalyticsCollection
+ CFBundlePackageType
+ APPL
+ CFBundleSignature
+ ????
+ CFBundleShortVersionString
+ 1.0.0
+ CFBundleVersion
+ 1.0.0
+ NSHumanReadableCopyright
+
+ NSHighResolutionCapable
+
+ UIRequiresFullScreen
+
+ UIStatusBarHidden
+
+ UISupportedInterfaceOrientations
+
+ UIInterfaceOrientationPortrait
+ UIInterfaceOrientationLandscapeLeft
+ UIInterfaceOrientationLandscapeRight
+
+ UIBackgroundModes
+
+
+
diff --git a/examples/AnalyticsCollection/JuceLibraryCode/AppConfig.h b/examples/AnalyticsCollection/JuceLibraryCode/AppConfig.h
new file mode 100644
index 0000000000..6e45e1edbf
--- /dev/null
+++ b/examples/AnalyticsCollection/JuceLibraryCode/AppConfig.h
@@ -0,0 +1,138 @@
+/*
+
+ IMPORTANT! This file is auto-generated each time you save your
+ project - if you alter its contents, your changes may be overwritten!
+
+ There's a section below where you can add your own custom code safely, and the
+ Projucer will preserve the contents of that block, but the best way to change
+ any of these definitions is by using the Projucer's project settings.
+
+ Any commented-out settings will assume their default values.
+
+*/
+
+#pragma once
+
+//==============================================================================
+// [BEGIN_USER_CODE_SECTION]
+
+// (You can add your own code in this section, and the Projucer will not overwrite it)
+
+// [END_USER_CODE_SECTION]
+
+/*
+ ==============================================================================
+
+ In accordance with the terms of the JUCE 5 End-Use License Agreement, the
+ JUCE Code in SECTION A cannot be removed, changed or otherwise rendered
+ ineffective unless you have a JUCE Indie or Pro license, or are using JUCE
+ under the GPL v3 license.
+
+ End User License Agreement: www.juce.com/juce-5-licence
+ ==============================================================================
+*/
+
+// BEGIN SECTION A
+
+#ifndef JUCE_DISPLAY_SPLASH_SCREEN
+ #define JUCE_DISPLAY_SPLASH_SCREEN 0
+#endif
+
+#ifndef JUCE_REPORT_APP_USAGE
+ #define JUCE_REPORT_APP_USAGE 0
+#endif
+
+
+// END SECTION A
+
+#define JUCE_USE_DARK_SPLASH_SCREEN 1
+
+//==============================================================================
+#define JUCE_MODULE_AVAILABLE_juce_analytics 1
+#define JUCE_MODULE_AVAILABLE_juce_core 1
+#define JUCE_MODULE_AVAILABLE_juce_data_structures 1
+#define JUCE_MODULE_AVAILABLE_juce_events 1
+#define JUCE_MODULE_AVAILABLE_juce_graphics 1
+#define JUCE_MODULE_AVAILABLE_juce_gui_basics 1
+
+#define JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED 1
+
+//==============================================================================
+// juce_core flags:
+
+#ifndef JUCE_FORCE_DEBUG
+ //#define JUCE_FORCE_DEBUG 1
+#endif
+
+#ifndef JUCE_LOG_ASSERTIONS
+ //#define JUCE_LOG_ASSERTIONS 1
+#endif
+
+#ifndef JUCE_CHECK_MEMORY_LEAKS
+ //#define JUCE_CHECK_MEMORY_LEAKS 1
+#endif
+
+#ifndef JUCE_DONT_AUTOLINK_TO_WIN32_LIBRARIES
+ //#define JUCE_DONT_AUTOLINK_TO_WIN32_LIBRARIES 1
+#endif
+
+#ifndef JUCE_INCLUDE_ZLIB_CODE
+ //#define JUCE_INCLUDE_ZLIB_CODE 1
+#endif
+
+#ifndef JUCE_USE_CURL
+ //#define JUCE_USE_CURL 1
+#endif
+
+#ifndef JUCE_CATCH_UNHANDLED_EXCEPTIONS
+ //#define JUCE_CATCH_UNHANDLED_EXCEPTIONS 1
+#endif
+
+#ifndef JUCE_ALLOW_STATIC_NULL_VARIABLES
+ //#define JUCE_ALLOW_STATIC_NULL_VARIABLES 1
+#endif
+
+//==============================================================================
+// juce_events flags:
+
+#ifndef JUCE_EXECUTE_APP_SUSPEND_ON_IOS_BACKGROUND_TASK
+ //#define JUCE_EXECUTE_APP_SUSPEND_ON_IOS_BACKGROUND_TASK 1
+#endif
+
+//==============================================================================
+// juce_graphics flags:
+
+#ifndef JUCE_USE_COREIMAGE_LOADER
+ //#define JUCE_USE_COREIMAGE_LOADER 1
+#endif
+
+#ifndef JUCE_USE_DIRECTWRITE
+ //#define JUCE_USE_DIRECTWRITE 1
+#endif
+
+//==============================================================================
+// juce_gui_basics flags:
+
+#ifndef JUCE_ENABLE_REPAINT_DEBUGGING
+ //#define JUCE_ENABLE_REPAINT_DEBUGGING 1
+#endif
+
+#ifndef JUCE_USE_XSHM
+ //#define JUCE_USE_XSHM 1
+#endif
+
+#ifndef JUCE_USE_XRENDER
+ //#define JUCE_USE_XRENDER 1
+#endif
+
+#ifndef JUCE_USE_XCURSOR
+ //#define JUCE_USE_XCURSOR 1
+#endif
+//==============================================================================
+#ifndef JUCE_STANDALONE_APPLICATION
+ #if defined(JucePlugin_Name) && defined(JucePlugin_Build_Standalone)
+ #define JUCE_STANDALONE_APPLICATION JucePlugin_Build_Standalone
+ #else
+ #define JUCE_STANDALONE_APPLICATION 1
+ #endif
+#endif
diff --git a/examples/AnalyticsCollection/JuceLibraryCode/JuceHeader.h b/examples/AnalyticsCollection/JuceLibraryCode/JuceHeader.h
new file mode 100644
index 0000000000..7fb6bc563b
--- /dev/null
+++ b/examples/AnalyticsCollection/JuceLibraryCode/JuceHeader.h
@@ -0,0 +1,38 @@
+/*
+
+ IMPORTANT! This file is auto-generated each time you save your
+ project - if you alter its contents, your changes may be overwritten!
+
+ This is the header file that your files should include in order to get all the
+ JUCE library headers. You should avoid including the JUCE headers directly in
+ your own source files, because that wouldn't pick up the correct configuration
+ options for your app.
+
+*/
+
+#pragma once
+
+#include "AppConfig.h"
+
+#include
+#include
+#include
+#include
+#include
+#include
+
+
+#if ! DONT_SET_USING_JUCE_NAMESPACE
+ // If your code uses a lot of JUCE classes, then this will obviously save you
+ // a lot of typing, but can be disabled by setting DONT_SET_USING_JUCE_NAMESPACE.
+ using namespace juce;
+#endif
+
+#if ! JUCE_DONT_DECLARE_PROJECTINFO
+namespace ProjectInfo
+{
+ const char* const projectName = "AnalyticsCollection";
+ const char* const versionString = "1.0.0";
+ const int versionNumber = 0x10000;
+}
+#endif
diff --git a/examples/AnalyticsCollection/JuceLibraryCode/ReadMe.txt b/examples/AnalyticsCollection/JuceLibraryCode/ReadMe.txt
new file mode 100644
index 0000000000..091a5aa6eb
--- /dev/null
+++ b/examples/AnalyticsCollection/JuceLibraryCode/ReadMe.txt
@@ -0,0 +1,12 @@
+
+ Important Note!!
+ ================
+
+The purpose of this folder is to contain files that are auto-generated by the Projucer,
+and ALL files in this folder will be mercilessly DELETED and completely re-written whenever
+the Projucer saves your project.
+
+Therefore, it's a bad idea to make any manual changes to the files in here, or to
+put any of your own files in here if you don't want to lose them. (Of course you may choose
+to add the folder's contents to your version-control system so that you can re-merge your own
+modifications after the Projucer has saved its changes).
diff --git a/examples/AnalyticsCollection/JuceLibraryCode/include_juce_analytics.cpp b/examples/AnalyticsCollection/JuceLibraryCode/include_juce_analytics.cpp
new file mode 100644
index 0000000000..3dfd4d2179
--- /dev/null
+++ b/examples/AnalyticsCollection/JuceLibraryCode/include_juce_analytics.cpp
@@ -0,0 +1,9 @@
+/*
+
+ IMPORTANT! This file is auto-generated each time you save your
+ project - if you alter its contents, your changes may be overwritten!
+
+*/
+
+#include "AppConfig.h"
+#include
diff --git a/examples/AnalyticsCollection/JuceLibraryCode/include_juce_core.cpp b/examples/AnalyticsCollection/JuceLibraryCode/include_juce_core.cpp
new file mode 100644
index 0000000000..d0ce1636f0
--- /dev/null
+++ b/examples/AnalyticsCollection/JuceLibraryCode/include_juce_core.cpp
@@ -0,0 +1,9 @@
+/*
+
+ IMPORTANT! This file is auto-generated each time you save your
+ project - if you alter its contents, your changes may be overwritten!
+
+*/
+
+#include "AppConfig.h"
+#include
diff --git a/examples/AnalyticsCollection/JuceLibraryCode/include_juce_core.mm b/examples/AnalyticsCollection/JuceLibraryCode/include_juce_core.mm
new file mode 100644
index 0000000000..72b10bf817
--- /dev/null
+++ b/examples/AnalyticsCollection/JuceLibraryCode/include_juce_core.mm
@@ -0,0 +1,9 @@
+/*
+
+ IMPORTANT! This file is auto-generated each time you save your
+ project - if you alter its contents, your changes may be overwritten!
+
+*/
+
+#include "AppConfig.h"
+#include
diff --git a/examples/AnalyticsCollection/JuceLibraryCode/include_juce_data_structures.cpp b/examples/AnalyticsCollection/JuceLibraryCode/include_juce_data_structures.cpp
new file mode 100644
index 0000000000..9315aa1686
--- /dev/null
+++ b/examples/AnalyticsCollection/JuceLibraryCode/include_juce_data_structures.cpp
@@ -0,0 +1,9 @@
+/*
+
+ IMPORTANT! This file is auto-generated each time you save your
+ project - if you alter its contents, your changes may be overwritten!
+
+*/
+
+#include "AppConfig.h"
+#include
diff --git a/examples/AnalyticsCollection/JuceLibraryCode/include_juce_data_structures.mm b/examples/AnalyticsCollection/JuceLibraryCode/include_juce_data_structures.mm
new file mode 100644
index 0000000000..695ec43925
--- /dev/null
+++ b/examples/AnalyticsCollection/JuceLibraryCode/include_juce_data_structures.mm
@@ -0,0 +1,9 @@
+/*
+
+ IMPORTANT! This file is auto-generated each time you save your
+ project - if you alter its contents, your changes may be overwritten!
+
+*/
+
+#include "AppConfig.h"
+#include
diff --git a/examples/AnalyticsCollection/JuceLibraryCode/include_juce_events.cpp b/examples/AnalyticsCollection/JuceLibraryCode/include_juce_events.cpp
new file mode 100644
index 0000000000..1bba110a97
--- /dev/null
+++ b/examples/AnalyticsCollection/JuceLibraryCode/include_juce_events.cpp
@@ -0,0 +1,9 @@
+/*
+
+ IMPORTANT! This file is auto-generated each time you save your
+ project - if you alter its contents, your changes may be overwritten!
+
+*/
+
+#include "AppConfig.h"
+#include
diff --git a/examples/AnalyticsCollection/JuceLibraryCode/include_juce_events.mm b/examples/AnalyticsCollection/JuceLibraryCode/include_juce_events.mm
new file mode 100644
index 0000000000..4cc34fc401
--- /dev/null
+++ b/examples/AnalyticsCollection/JuceLibraryCode/include_juce_events.mm
@@ -0,0 +1,9 @@
+/*
+
+ IMPORTANT! This file is auto-generated each time you save your
+ project - if you alter its contents, your changes may be overwritten!
+
+*/
+
+#include "AppConfig.h"
+#include
diff --git a/examples/AnalyticsCollection/JuceLibraryCode/include_juce_graphics.cpp b/examples/AnalyticsCollection/JuceLibraryCode/include_juce_graphics.cpp
new file mode 100644
index 0000000000..319c76de0e
--- /dev/null
+++ b/examples/AnalyticsCollection/JuceLibraryCode/include_juce_graphics.cpp
@@ -0,0 +1,9 @@
+/*
+
+ IMPORTANT! This file is auto-generated each time you save your
+ project - if you alter its contents, your changes may be overwritten!
+
+*/
+
+#include "AppConfig.h"
+#include
diff --git a/examples/AnalyticsCollection/JuceLibraryCode/include_juce_graphics.mm b/examples/AnalyticsCollection/JuceLibraryCode/include_juce_graphics.mm
new file mode 100644
index 0000000000..b28e6dd056
--- /dev/null
+++ b/examples/AnalyticsCollection/JuceLibraryCode/include_juce_graphics.mm
@@ -0,0 +1,9 @@
+/*
+
+ IMPORTANT! This file is auto-generated each time you save your
+ project - if you alter its contents, your changes may be overwritten!
+
+*/
+
+#include "AppConfig.h"
+#include
diff --git a/examples/AnalyticsCollection/JuceLibraryCode/include_juce_gui_basics.cpp b/examples/AnalyticsCollection/JuceLibraryCode/include_juce_gui_basics.cpp
new file mode 100644
index 0000000000..216c76bb05
--- /dev/null
+++ b/examples/AnalyticsCollection/JuceLibraryCode/include_juce_gui_basics.cpp
@@ -0,0 +1,9 @@
+/*
+
+ IMPORTANT! This file is auto-generated each time you save your
+ project - if you alter its contents, your changes may be overwritten!
+
+*/
+
+#include "AppConfig.h"
+#include
diff --git a/examples/AnalyticsCollection/JuceLibraryCode/include_juce_gui_basics.mm b/examples/AnalyticsCollection/JuceLibraryCode/include_juce_gui_basics.mm
new file mode 100644
index 0000000000..6a9726fa5f
--- /dev/null
+++ b/examples/AnalyticsCollection/JuceLibraryCode/include_juce_gui_basics.mm
@@ -0,0 +1,9 @@
+/*
+
+ IMPORTANT! This file is auto-generated each time you save your
+ project - if you alter its contents, your changes may be overwritten!
+
+*/
+
+#include "AppConfig.h"
+#include
diff --git a/examples/AnalyticsCollection/Source/GoogleAnalyticsDestination.h b/examples/AnalyticsCollection/Source/GoogleAnalyticsDestination.h
new file mode 100644
index 0000000000..5b26f92447
--- /dev/null
+++ b/examples/AnalyticsCollection/Source/GoogleAnalyticsDestination.h
@@ -0,0 +1,217 @@
+#include "../JuceLibraryCode/JuceHeader.h"
+
+class GoogleAnalyticsDestination : public ThreadedAnalyticsDestination
+{
+public:
+ GoogleAnalyticsDestination()
+ : ThreadedAnalyticsDestination ("GoogleAnalyticsThread")
+ {
+ {
+ // Choose where to save any unsent events.
+
+ auto appDataDir = File::getSpecialLocation (File::userApplicationDataDirectory)
+ .getChildFile (JUCEApplication::getInstance()->getApplicationName());
+
+ if (! appDataDir.exists())
+ appDataDir.createDirectory();
+
+ savedEventsFile = appDataDir.getChildFile ("analytics_events.xml");
+ }
+
+ {
+ // It's often a good idea to construct any analytics service API keys
+ // at runtime, so they're not searchable in the binary distribution of
+ // your application (but we've not done this here). You should replace
+ // the following key with your own to get this example application
+ // fully working.
+
+ apiKey = "UA-XXXXXXXXX-1";
+ }
+
+ startAnalyticsThread (initialPeriodMs);
+ }
+
+ ~GoogleAnalyticsDestination()
+ {
+ // Here we sleep so that our background thread has a chance to send the
+ // last lot of batched events. Be careful - if your app takes too long to
+ // shut down then some operating systems will kill it forcibly!
+ Thread::sleep (initialPeriodMs);
+
+ stopAnalyticsThread (1000);
+ }
+
+ int getMaximumBatchSize() override { return 20; }
+
+ bool logBatchedEvents (const Array& events) override
+ {
+ // Send events to Google Analytics.
+
+ String appData ("v=1&tid=" + apiKey + "&t=event&");
+
+ StringArray postData;
+
+ for (auto& event : events)
+ {
+ StringPairArray data;
+
+ if (event.name == "startup")
+ {
+ data.set ("ec", "info");
+ data.set ("ea", "appStarted");
+ }
+ else if (event.name == "shutdown")
+ {
+ data.set ("ec", "info");
+ data.set ("ea", "appStopped");
+ }
+ else if (event.name == "button_press")
+ {
+ data.set ("ec", "button_press");
+ data.set ("ea", event.parameters["id"]);
+ }
+ else
+ {
+ continue;
+ }
+
+ data.set ("cid", event.userID);
+
+ StringArray eventData;
+
+ for (auto& key : data.getAllKeys())
+ eventData.add (key + "=" + URL::addEscapeChars (data[key], true));
+
+ postData.add (appData + eventData.joinIntoString ("&"));
+ }
+
+ auto url = URL ("https://www.google-analytics.com/batch")
+ .withPOSTData (postData.joinIntoString ("\n"));
+
+ {
+ const ScopedLock lock (webStreamCreation);
+
+ if (shouldExit)
+ return false;
+
+ webStream = new WebInputStream (url, true);
+ }
+
+ const auto success = webStream->connect (nullptr);
+
+ // Do an exponential backoff if we failed to connect.
+ if (success)
+ periodMs = initialPeriodMs;
+ else
+ periodMs *= 2;
+
+ setBatchPeriod (periodMs);
+
+ return success;
+ }
+
+ void stopLoggingEvents() override
+ {
+ const ScopedLock lock (webStreamCreation);
+
+ shouldExit = true;
+
+ if (webStream != nullptr)
+ webStream->cancel();
+ }
+
+private:
+ void saveUnloggedEvents (const std::deque& eventsToSave) override
+ {
+ // Save unsent events to disk. Here we use XML as a serialisation format, but
+ // you can use anything else as long as the restoreUnloggedEvents method can
+ // restore events from disk. If you're saving very large numbers of events then
+ // a binary format may be more suitable if it is faster - remember that this
+ // method is called on app shutdown so it needs to complete quickly!
+
+ XmlDocument previouslySavedEvents (savedEventsFile);
+ ScopedPointer xml = previouslySavedEvents.getDocumentElement();
+
+ if (xml == nullptr || xml->getTagName() != "events")
+ xml = new XmlElement ("events");
+
+ for (auto& event : eventsToSave)
+ {
+ auto* xmlEvent = new XmlElement ("google_analytics_event");
+ xmlEvent->setAttribute ("name", event.name);
+ xmlEvent->setAttribute ("timestamp", (int) event.timestamp);
+ xmlEvent->setAttribute ("user_id", event.userID);
+
+ auto* parameters = new XmlElement ("parameters");
+
+ for (auto& key : event.parameters.getAllKeys())
+ parameters->setAttribute (key, event.parameters[key]);
+
+ xmlEvent->addChildElement (parameters);
+
+ auto* userProperties = new XmlElement ("user_properties");
+
+ for (auto& key : event.userProperties.getAllKeys())
+ userProperties->setAttribute (key, event.userProperties[key]);
+
+ xmlEvent->addChildElement (userProperties);
+
+ xml->addChildElement (xmlEvent);
+ }
+
+ xml->writeToFile (savedEventsFile, {});
+ }
+
+ void restoreUnloggedEvents (std::deque& restoredEventQueue) override
+ {
+ XmlDocument savedEvents (savedEventsFile);
+ ScopedPointer xml = savedEvents.getDocumentElement();
+
+ if (xml == nullptr || xml->getTagName() != "events")
+ return;
+
+ const auto numEvents = xml->getNumChildElements();
+
+ for (auto iEvent = 0; iEvent < numEvents; ++iEvent)
+ {
+ const auto* xmlEvent = xml->getChildElement (iEvent);
+
+ StringPairArray parameters;
+ const auto* xmlParameters = xmlEvent->getChildByName ("parameters");
+ const auto numParameters = xmlParameters->getNumAttributes();
+
+ for (auto iParam = 0; iParam < numParameters; ++iParam)
+ parameters.set (xmlParameters->getAttributeName (iParam),
+ xmlParameters->getAttributeValue (iParam));
+
+ StringPairArray userProperties;
+ const auto* xmlUserProperties = xmlEvent->getChildByName ("user_properties");
+ const auto numUserProperties = xmlUserProperties->getNumAttributes();
+
+ for (auto iProp = 0; iProp < numUserProperties; ++iProp)
+ userProperties.set (xmlUserProperties->getAttributeName (iProp),
+ xmlUserProperties->getAttributeValue (iProp));
+
+ restoredEventQueue.push_back ({
+ xmlEvent->getStringAttribute ("name"),
+ (uint32) xmlEvent->getIntAttribute ("timestamp"),
+ parameters,
+ xmlEvent->getStringAttribute ("user_id"),
+ userProperties
+ });
+ }
+
+ savedEventsFile.deleteFile();
+ }
+
+ const int initialPeriodMs = 1000;
+ int periodMs = initialPeriodMs;
+
+ CriticalSection webStreamCreation;
+ bool shouldExit = false;
+ ScopedPointer webStream;
+
+ String apiKey;
+
+ File savedEventsFile;
+};
diff --git a/examples/AnalyticsCollection/Source/Main.cpp b/examples/AnalyticsCollection/Source/Main.cpp
new file mode 100644
index 0000000000..c768854ef7
--- /dev/null
+++ b/examples/AnalyticsCollection/Source/Main.cpp
@@ -0,0 +1,106 @@
+#include "../JuceLibraryCode/JuceHeader.h"
+
+#include "GoogleAnalyticsDestination.h"
+#include "MainComponent.h"
+
+//==============================================================================
+class AnalyticsCollectionApplication : public JUCEApplication
+{
+public:
+ //==============================================================================
+ AnalyticsCollectionApplication() {}
+
+ const String getApplicationName() override { return ProjectInfo::projectName; }
+ const String getApplicationVersion() override { return ProjectInfo::versionString; }
+ bool moreThanOneInstanceAllowed() override { return true; }
+
+ //==============================================================================
+ void initialise (const String&) override
+ {
+ // Add an analytics identifier for the user. Make sure you don't collect
+ // identifiable information accidentally if you haven't asked for permission!
+ Analytics::getInstance()->setUserId ("AnonUser1234");
+
+ // Add any other constant user information.
+ StringPairArray userData;
+ userData.set ("group", "beta");
+ Analytics::getInstance()->setUserProperties (userData);
+
+ // Add any analytics destinations we want to use to the Analytics singleton.
+ Analytics::getInstance()->addDestination (new GoogleAnalyticsDestination());
+
+ Analytics::getInstance()->logEvent ("startup", {});
+
+ mainWindow = new MainWindow (getApplicationName());
+ }
+
+ void shutdown() override
+ {
+ Analytics::getInstance()->logEvent ("shutdown", {});
+
+ // Add your application's shutdown code here..
+
+ mainWindow = nullptr; // (deletes our window)
+ }
+
+ //==============================================================================
+ void systemRequestedQuit() override
+ {
+ // This is called when the app is being asked to quit: you can ignore this
+ // request and let the app carry on running, or call quit() to allow the app to close.
+ quit();
+ }
+
+ void anotherInstanceStarted (const String&) override
+ {
+ // When another instance of the app is launched while this one is running,
+ // this method is invoked, and the commandLine parameter tells you what
+ // the other instance's command-line arguments were.
+ }
+
+ //==============================================================================
+ /*
+ This class implements the desktop window that contains an instance of
+ our MainContentComponent class.
+ */
+ class MainWindow : public DocumentWindow
+ {
+ public:
+ MainWindow (String name) : DocumentWindow (name,
+ Desktop::getInstance().getDefaultLookAndFeel()
+ .findColour (ResizableWindow::backgroundColourId),
+ DocumentWindow::allButtons)
+ {
+ setUsingNativeTitleBar (true);
+ setContentOwned (new MainContentComponent(), true);
+
+ centreWithSize (getWidth(), getHeight());
+ setVisible (true);
+ }
+
+ void closeButtonPressed() override
+ {
+ // This is called when the user tries to close this window. Here, we'll just
+ // ask the app to quit when this happens, but you can change this to do
+ // whatever you need.
+ JUCEApplication::getInstance()->systemRequestedQuit();
+ }
+
+ /* Note: Be careful if you override any DocumentWindow methods - the base
+ class uses a lot of them, so by overriding you might break its functionality.
+ It's best to do all your work in your content component instead, but if
+ you really have to override any DocumentWindow methods, make sure your
+ subclass also calls the superclass's method.
+ */
+
+ private:
+ JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (MainWindow)
+ };
+
+private:
+ ScopedPointer mainWindow;
+};
+
+//==============================================================================
+// This macro generates the main() routine that launches the app.
+START_JUCE_APPLICATION (AnalyticsCollectionApplication)
diff --git a/examples/AnalyticsCollection/Source/MainComponent.h b/examples/AnalyticsCollection/Source/MainComponent.h
new file mode 100644
index 0000000000..6934b359e1
--- /dev/null
+++ b/examples/AnalyticsCollection/Source/MainComponent.h
@@ -0,0 +1,38 @@
+#pragma once
+
+#include "../JuceLibraryCode/JuceHeader.h"
+
+class MainContentComponent : public Component
+{
+public:
+ //==============================================================================
+ MainContentComponent()
+ {
+ addAndMakeVisible (eventButton);
+
+ setSize (300, 200);
+
+ StringPairArray logButtonPressParameters;
+ logButtonPressParameters.set ("id", "a");
+ logEventButtonPress = new ButtonTracker (eventButton, "button_press", logButtonPressParameters);
+ }
+
+ ~MainContentComponent() {}
+
+ void paint (Graphics& g) override
+ {
+ g.fillAll (getLookAndFeel().findColour (ResizableWindow::backgroundColourId));
+ }
+
+ void resized() override
+ {
+ eventButton.centreWithSize (100, 50);
+ }
+
+private:
+ //==============================================================================
+ TextButton eventButton { "Press me!" };
+ ScopedPointer logEventButtonPress;
+
+ JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (MainContentComponent)
+};
diff --git a/extras/UnitTestRunner/UnitTestRunner.jucer b/extras/UnitTestRunner/UnitTestRunner.jucer
index 7a68ee2ddd..088af39253 100644
--- a/extras/UnitTestRunner/UnitTestRunner.jucer
+++ b/extras/UnitTestRunner/UnitTestRunner.jucer
@@ -39,6 +39,7 @@
+
@@ -67,6 +68,7 @@
+
@@ -97,10 +99,12 @@
+
+
diff --git a/modules/juce_analytics/analytics/juce_Analytics.cpp b/modules/juce_analytics/analytics/juce_Analytics.cpp
new file mode 100644
index 0000000000..44f9768f68
--- /dev/null
+++ b/modules/juce_analytics/analytics/juce_Analytics.cpp
@@ -0,0 +1,67 @@
+/*
+ ==============================================================================
+
+ This file is part of the JUCE library.
+ Copyright (c) 2017 - ROLI Ltd.
+
+ JUCE is an open source library subject to commercial or open-source
+ licensing.
+
+ The code included in this file is provided under the terms of the ISC license
+ http://www.isc.org/downloads/software-support-policy/isc-license. Permission
+ To use, copy, modify, and/or distribute this software for any purpose with or
+ without fee is hereby granted provided that the above copyright notice and
+ this permission notice appear in all copies.
+
+ JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER
+ EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE
+ DISCLAIMED.
+
+ ==============================================================================
+*/
+
+namespace juce
+{
+
+void Analytics::addDestination (AnalyticsDestination* destination)
+{
+ destinations.add (destination);
+}
+
+void Analytics::setUserId (const String& newUserId)
+{
+ userId = newUserId;
+}
+
+void Analytics::setUserProperties (const StringPairArray& properties)
+{
+ userProperties = properties;
+}
+
+void Analytics::logEvent (const String& eventName,
+ const StringPairArray& parameters)
+{
+ if (! isSuspended)
+ {
+ AnalyticsDestination::AnalyticsEvent event
+ {
+ eventName,
+ Time::getMillisecondCounter(),
+ parameters,
+ userId,
+ userProperties
+ };
+
+ for (auto* destination : destinations)
+ destination->logEvent (event);
+ }
+}
+
+void Analytics::setSuspended (bool shouldBeSuspended)
+{
+ isSuspended = shouldBeSuspended;
+}
+
+juce_ImplementSingleton (Analytics)
+
+}
diff --git a/modules/juce_analytics/analytics/juce_Analytics.h b/modules/juce_analytics/analytics/juce_Analytics.h
new file mode 100644
index 0000000000..43009c1e88
--- /dev/null
+++ b/modules/juce_analytics/analytics/juce_Analytics.h
@@ -0,0 +1,99 @@
+/*
+ ==============================================================================
+
+ This file is part of the JUCE library.
+ Copyright (c) 2017 - ROLI Ltd.
+
+ JUCE is an open source library subject to commercial or open-source
+ licensing.
+
+ The code included in this file is provided under the terms of the ISC license
+ http://www.isc.org/downloads/software-support-policy/isc-license. Permission
+ To use, copy, modify, and/or distribute this software for any purpose with or
+ without fee is hereby granted provided that the above copyright notice and
+ this permission notice appear in all copies.
+
+ JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER
+ EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE
+ DISCLAIMED.
+
+ ==============================================================================
+*/
+
+namespace juce
+{
+
+//==============================================================================
+/**
+ A singleton class to manage analytics data.
+
+ Use an Analytics object to manage sending analytics data to one or more
+ AnalyticsDestinations.
+
+ @see AnalyticsDestination, ThreadedAnalyticsDestination,
+ AnalyticsDestination::AnalyticsEvent
+*/
+class JUCE_API Analytics : public DeletedAtShutdown
+{
+public:
+ //==============================================================================
+ /** Adds an AnalyticsDestination to the list of AnalyticsDestinations
+ managed by this Analytics object.
+
+ The Analytics class will take ownership of the AnalyticsDestination
+ passed to this function.
+
+ @param destination the AnalyticsDestination to manage
+ */
+ void addDestination (AnalyticsDestination* destination);
+
+ /** Sets a user ID that will be added to all AnalyticsEvents sent to
+ AnalyticsDestinations.
+
+ @param newUserId the userId to add to AnalyticsEvents
+ */
+ void setUserId (const String& newUserId);
+
+ /** Sets some user properties that will be added to all AnalyticsEvents sent
+ to AnalyticsDestinations.
+
+ @param properties the userProperties to add to AnalyticsEvents
+ */
+ void setUserProperties (const StringPairArray& properties);
+
+ /** Sends an AnalyticsEvent to all AnalyticsDestinations.
+
+ The AnalyticsEvent will be timestamped, and will have the userId and
+ userProperties populated by values previously set by calls to
+ setUserId and setUserProperties. The name and parameters will be
+ populated by the arguments supplied to this function.
+
+ @param eventName the event name
+ @param parameters the event parameters
+ */
+ void logEvent (const String& eventName, const StringPairArray& parameters);
+
+ /** Suspends analytics submission to AnalyticsDestinations.
+
+ @param shouldBeSuspended if event submission should be suspended
+ */
+ void setSuspended (bool shouldBeSuspended);
+
+
+ juce_DeclareSingleton (Analytics, true)
+
+private:
+ //==============================================================================
+ Analytics() = default;
+
+ String userId;
+ StringPairArray userProperties;
+
+ bool isSuspended = false;
+
+ OwnedArray destinations;
+
+ JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (Analytics)
+};
+
+} // namespace juce
diff --git a/modules/juce_analytics/analytics/juce_ButtonTracker.cpp b/modules/juce_analytics/analytics/juce_ButtonTracker.cpp
new file mode 100644
index 0000000000..3fc613df99
--- /dev/null
+++ b/modules/juce_analytics/analytics/juce_ButtonTracker.cpp
@@ -0,0 +1,55 @@
+/*
+ ==============================================================================
+
+ This file is part of the JUCE library.
+ Copyright (c) 2017 - ROLI Ltd.
+
+ JUCE is an open source library subject to commercial or open-source
+ licensing.
+
+ The code included in this file is provided under the terms of the ISC license
+ http://www.isc.org/downloads/software-support-policy/isc-license. Permission
+ To use, copy, modify, and/or distribute this software for any purpose with or
+ without fee is hereby granted provided that the above copyright notice and
+ this permission notice appear in all copies.
+
+ JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER
+ EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE
+ DISCLAIMED.
+
+ ==============================================================================
+*/
+
+namespace juce
+{
+
+ButtonTracker::ButtonTracker (Button& buttonToTrack,
+ const String& triggeredEventName,
+ const StringPairArray& triggeredEventParameters)
+ : button (buttonToTrack),
+ eventName (triggeredEventName),
+ eventParameters (triggeredEventParameters)
+{
+ button.addListener (this);
+}
+
+ButtonTracker::~ButtonTracker()
+{
+ button.removeListener (this);
+}
+
+void ButtonTracker::buttonClicked (Button* b)
+{
+ if (b == &button)
+ {
+ auto params = eventParameters;
+
+ if (button.getClickingTogglesState())
+ params.set ("ButtonState", button.getToggleState() ? "On" : "Off");
+
+ Analytics::getInstance()->logEvent (eventName, params);
+ }
+}
+
+
+} // namespace juce
diff --git a/modules/juce_analytics/analytics/juce_ButtonTracker.h b/modules/juce_analytics/analytics/juce_ButtonTracker.h
new file mode 100644
index 0000000000..3a85b63684
--- /dev/null
+++ b/modules/juce_analytics/analytics/juce_ButtonTracker.h
@@ -0,0 +1,70 @@
+/*
+ ==============================================================================
+
+ This file is part of the JUCE library.
+ Copyright (c) 2017 - ROLI Ltd.
+
+ JUCE is an open source library subject to commercial or open-source
+ licensing.
+
+ The code included in this file is provided under the terms of the ISC license
+ http://www.isc.org/downloads/software-support-policy/isc-license. Permission
+ To use, copy, modify, and/or distribute this software for any purpose with or
+ without fee is hereby granted provided that the above copyright notice and
+ this permission notice appear in all copies.
+
+ JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER
+ EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE
+ DISCLAIMED.
+
+ ==============================================================================
+*/
+
+namespace juce
+{
+
+//==============================================================================
+/**
+ A class that automatically sends analytics events to the Analytics singleton
+ when a button is clicked.
+
+ @see Analytics, AnalyticsDestination::AnalyticsEvent
+*/
+class JUCE_API ButtonTracker : private Button::Listener
+{
+public:
+ //==============================================================================
+ /**
+ Creating one of these automatically sends analytics events to the Analytics
+ singeton when the corresponding button is clicked.
+
+ The name and parameters of the analytics event will be populated from the
+ variables supplied here. If clicking changes the button's state then the
+ parameters will have a {"ButtonState", "On"/"Off"} entry added.
+
+ @param buttonToTrack the button to track
+ @param triggeredEventName the name of the generated event
+ @param triggeredEventParameters the parameters to add to the generated
+ event
+
+ @see Analytics, AnalyticsDestination::AnalyticsEvent
+ */
+ ButtonTracker (Button& buttonToTrack,
+ const String& triggeredEventName,
+ const StringPairArray& triggeredEventParameters = {});
+
+ /** Destructor. */
+ ~ButtonTracker();
+
+private:
+ /** @internal */
+ void buttonClicked (Button*) override;
+
+ Button& button;
+ const String eventName;
+ const StringPairArray eventParameters;
+
+ JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (ButtonTracker)
+};
+
+} // namespace juce
diff --git a/modules/juce_analytics/destinations/juce_AnalyticsDestination.h b/modules/juce_analytics/destinations/juce_AnalyticsDestination.h
new file mode 100644
index 0000000000..23c364db2e
--- /dev/null
+++ b/modules/juce_analytics/destinations/juce_AnalyticsDestination.h
@@ -0,0 +1,86 @@
+/*
+ ==============================================================================
+
+ This file is part of the JUCE library.
+ Copyright (c) 2017 - ROLI Ltd.
+
+ JUCE is an open source library subject to commercial or open-source
+ licensing.
+
+ The code included in this file is provided under the terms of the ISC license
+ http://www.isc.org/downloads/software-support-policy/isc-license. Permission
+ To use, copy, modify, and/or distribute this software for any purpose with or
+ without fee is hereby granted provided that the above copyright notice and
+ this permission notice appear in all copies.
+
+ JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER
+ EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE
+ DISCLAIMED.
+
+ ==============================================================================
+*/
+
+namespace juce
+{
+
+//==============================================================================
+/**
+ An interface for handling analytics events collected by an Analytics object.
+
+ For basic analytics logging you can implement this interface and add your
+ class to an Analytics object.
+
+ For more advanced logging you may want to subclass
+ ThreadedAnalyticsDestination instead, which is more suitable for interacting
+ with web servers and other time consuming destinations.
+
+ @see Analytics, ThreadedAnalyticsDestination
+*/
+struct JUCE_API AnalyticsDestination
+{
+ /** Contains information about an event to be logged. */
+ struct AnalyticsEvent
+ {
+ /** The name of the event. */
+ String name;
+
+ /**
+ The timestamp of the event.
+
+ Timestamps are automatically applied by an Analytics object and are
+ derived from Time::getMillisecondCounter(). As such these timestamps
+ do not represent absolute times, but relative timings of events for
+ each user in each session will be accurate.
+ */
+ uint32 timestamp;
+
+ /** The parameters of the event. */
+ StringPairArray parameters;
+
+ /** The user ID associated with the event. */
+ String userID;
+
+ /** Properties associated with the user. */
+ StringPairArray userProperties;
+ };
+
+ /** Constructor. */
+ AnalyticsDestination() = default;
+
+ /** Destructor. */
+ virtual ~AnalyticsDestination() {}
+
+ /**
+ When an AnalyticsDestination is added to an Analytics object this method
+ is called when an analytics event is triggered from the Analytics
+ object.
+
+ Override this method to log the event information somewhere useful.
+ */
+ virtual void logEvent (const AnalyticsEvent& event) = 0;
+
+ JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (AnalyticsDestination)
+};
+
+
+} // namespace juce
diff --git a/modules/juce_analytics/destinations/juce_ThreadedAnalyticsDestination.cpp b/modules/juce_analytics/destinations/juce_ThreadedAnalyticsDestination.cpp
new file mode 100644
index 0000000000..2d9b18d2d6
--- /dev/null
+++ b/modules/juce_analytics/destinations/juce_ThreadedAnalyticsDestination.cpp
@@ -0,0 +1,350 @@
+/*
+ ==============================================================================
+
+ This file is part of the JUCE library.
+ Copyright (c) 2017 - ROLI Ltd.
+
+ JUCE is an open source library subject to commercial or open-source
+ licensing.
+
+ The code included in this file is provided under the terms of the ISC license
+ http://www.isc.org/downloads/software-support-policy/isc-license. Permission
+ To use, copy, modify, and/or distribute this software for any purpose with or
+ without fee is hereby granted provided that the above copyright notice and
+ this permission notice appear in all copies.
+
+ JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER
+ EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE
+ DISCLAIMED.
+
+ ==============================================================================
+*/
+
+namespace juce
+{
+
+ThreadedAnalyticsDestination::ThreadedAnalyticsDestination (const String& threadName)
+ : dispatcher (threadName, *this)
+{}
+
+ThreadedAnalyticsDestination::~ThreadedAnalyticsDestination()
+{
+ // If you hit this assertion then the analytics thread has not been shut down
+ // before this class is destroyed. Call stopAnalyticsThread() in your destructor!
+ jassert (! dispatcher.isThreadRunning());
+}
+
+void ThreadedAnalyticsDestination::setBatchPeriod (int newBatchPeriodMilliseconds)
+{
+ dispatcher.batchPeriodMilliseconds = newBatchPeriodMilliseconds;
+}
+
+void ThreadedAnalyticsDestination::logEvent (const AnalyticsEvent& event)
+{
+ dispatcher.addToQueue (event);
+}
+
+void ThreadedAnalyticsDestination::startAnalyticsThread (int initialBatchPeriodMilliseconds)
+{
+ setBatchPeriod (initialBatchPeriodMilliseconds);
+ dispatcher.startThread();
+}
+
+void ThreadedAnalyticsDestination::stopAnalyticsThread (int timeout)
+{
+ dispatcher.signalThreadShouldExit();
+ stopLoggingEvents();
+ dispatcher.stopThread (timeout);
+
+ if (dispatcher.eventQueue.size() > 0)
+ saveUnloggedEvents (dispatcher.eventQueue);
+}
+
+ThreadedAnalyticsDestination::EventDispatcher::EventDispatcher (const String& threadName,
+ ThreadedAnalyticsDestination& destination)
+ : Thread (threadName),
+ parent (destination)
+{}
+
+void ThreadedAnalyticsDestination::EventDispatcher::run()
+{
+ // We may have inserted some events into the queue (on the message thread)
+ // before this thread has started, so make sure the old events are at the
+ // front of the queue.
+ {
+ std::deque restoredEventQueue;
+ parent.restoreUnloggedEvents (restoredEventQueue);
+
+ const ScopedLock lock (queueAccess);
+
+ for (auto rit = restoredEventQueue.rbegin(); rit != restoredEventQueue.rend(); ++rit)
+ eventQueue.push_front (*rit);
+ }
+
+ const int maxBatchSize = parent.getMaximumBatchSize();
+
+ while (! threadShouldExit())
+ {
+ auto eventsToSendCapacity = maxBatchSize - eventsToSend.size();
+
+ if (eventsToSendCapacity > 0)
+ {
+ const ScopedLock lock (queueAccess);
+
+ const auto numEventsInQueue = (int) eventQueue.size();
+
+ if (numEventsInQueue > 0)
+ {
+ const auto numEventsToAdd = jmin (eventsToSendCapacity, numEventsInQueue);
+
+ for (size_t i = 0; i < (size_t) numEventsToAdd; ++i)
+ eventsToSend.add (eventQueue[i]);
+ }
+ }
+
+ const auto submissionTime = Time::getMillisecondCounter();
+
+ if (! eventsToSend.isEmpty())
+ {
+ if (parent.logBatchedEvents (eventsToSend))
+ {
+ const ScopedLock lock (queueAccess);
+
+ for (auto i = 0; i < eventsToSend.size(); ++i)
+ eventQueue.pop_front();
+
+ eventsToSend.clearQuick();
+ }
+ }
+
+ while (Time::getMillisecondCounter() - submissionTime < (uint32) batchPeriodMilliseconds.get())
+ {
+ if (threadShouldExit())
+ return;
+
+ Thread::sleep (100);
+ }
+ }
+}
+
+void ThreadedAnalyticsDestination::EventDispatcher::addToQueue (const AnalyticsEvent& event)
+{
+ const ScopedLock lock (queueAccess);
+ eventQueue.push_back (event);
+}
+
+//==============================================================================
+#if JUCE_UNIT_TESTS
+
+namespace DestinationTestHelpers
+{
+ //==============================================================================
+ struct TestDestination : public ThreadedAnalyticsDestination
+ {
+ TestDestination (std::deque& loggedEvents,
+ std::deque& unloggedEvents)
+ : ThreadedAnalyticsDestination ("ThreadedAnalyticsDestinationTest"),
+ loggedEventQueue (loggedEvents),
+ unloggedEventStore (unloggedEvents)
+ {}
+
+ virtual ~TestDestination() {}
+
+ int getMaximumBatchSize() override
+ {
+ return 5;
+ }
+
+ void saveUnloggedEvents (const std::deque& eventsToSave) override
+ {
+ unloggedEventStore = eventsToSave;
+ }
+
+ void restoreUnloggedEvents (std::deque& restoredEventQueue) override
+ {
+ restoredEventQueue = unloggedEventStore;
+ }
+
+ std::deque& loggedEventQueue;
+ std::deque& unloggedEventStore;
+ };
+
+ //==============================================================================
+ struct BasicDestination : public TestDestination
+ {
+ BasicDestination (std::deque& loggedEvents,
+ std::deque& unloggedEvents)
+ : TestDestination (loggedEvents, unloggedEvents)
+ {
+ startAnalyticsThread (100);
+ }
+
+ virtual ~BasicDestination()
+ {
+ stopAnalyticsThread (1000);
+ }
+
+
+ bool logBatchedEvents (const Array& events) override
+ {
+ jassert (events.size() <= getMaximumBatchSize());
+
+ for (auto& event : events)
+ loggedEventQueue.push_back (event);
+
+ return true;
+ }
+
+ void stopLoggingEvents() override {}
+ };
+
+ //==============================================================================
+ struct SlowWebDestination : public TestDestination
+ {
+ SlowWebDestination (std::deque& loggedEvents,
+ std::deque& unloggedEvents)
+ : TestDestination (loggedEvents, unloggedEvents)
+ {
+ startAnalyticsThread (initialPeriod);
+ }
+
+ virtual ~SlowWebDestination()
+ {
+ stopAnalyticsThread (1000);
+ }
+
+ bool logBatchedEvents (const Array& events) override
+ {
+ threadHasStarted.signal();
+
+ jassert (events.size() <= getMaximumBatchSize());
+
+ {
+ const ScopedLock lock (webStreamCreation);
+
+ if (shouldExit)
+ return false;
+
+ // An attempt to connect to an unroutable IP address will hang
+ // indefinitely, which simulates a very slow server
+ webStream = new WebInputStream (URL ("http://1.192.0.0"), true);
+ }
+
+ String data;
+
+ for (auto& event : events)
+ data << event.name;
+
+ webStream->withExtraHeaders (data);
+
+ const auto success = webStream->connect (nullptr);
+
+ // Exponential backoff on failure
+ if (success)
+ period = initialPeriod;
+ else
+ period *= 2;
+
+ setBatchPeriod (period);
+
+ return success;
+ }
+
+ void stopLoggingEvents() override
+ {
+ const ScopedLock lock (webStreamCreation);
+
+ shouldExit = true;
+
+ if (webStream != nullptr)
+ webStream->cancel();
+ }
+
+ const int initialPeriod = 100;
+ int period = initialPeriod;
+
+ CriticalSection webStreamCreation;
+ bool shouldExit = false;
+
+ ScopedPointer webStream;
+
+ WaitableEvent threadHasStarted;
+ };
+}
+
+//==============================================================================
+struct ThreadedAnalyticsDestinationTests : public UnitTest
+{
+ ThreadedAnalyticsDestinationTests()
+ : UnitTest ("ThreadedAnalyticsDestination")
+ {}
+
+ void compareEventQueues (const std::deque& a,
+ const std::deque& b)
+ {
+ const auto numEntries = a.size();
+ expectEquals (b.size(), numEntries);
+
+ for (size_t i = 0; i < numEntries; ++i)
+ {
+ expectEquals (a[i].name, b[i].name);
+ expect (a[i].timestamp == b[i].timestamp);
+ }
+ }
+
+ void runTest() override
+ {
+ std::deque testEvents;
+
+ for (int i = 0; i < 7; ++i)
+ testEvents.push_back ({ String (i), Time::getMillisecondCounter(), {}, "TestUser", {} });
+
+ std::deque loggedEvents, unloggedEvents;
+
+ beginTest ("Basic");
+ {
+ DestinationTestHelpers::BasicDestination destination (loggedEvents, unloggedEvents);
+
+ for (auto& event : testEvents)
+ destination.logEvent (event);
+
+ Thread::sleep (400);
+
+ compareEventQueues (loggedEvents, testEvents);
+ expect (unloggedEvents.size() == 0);
+
+ loggedEvents.clear();
+ }
+
+ beginTest ("Web");
+ {
+ {
+ DestinationTestHelpers::SlowWebDestination destination (loggedEvents, unloggedEvents);
+
+ for (auto& event : testEvents)
+ destination.logEvent (event);
+ }
+
+ expect (loggedEvents.size() == 0);
+ compareEventQueues (unloggedEvents, testEvents);
+
+ {
+ DestinationTestHelpers::SlowWebDestination destination (loggedEvents, unloggedEvents);
+
+ destination.threadHasStarted.wait();
+ unloggedEvents.clear();
+ }
+
+ expect (loggedEvents.size() == 0);
+ compareEventQueues (unloggedEvents, testEvents);
+
+ unloggedEvents.clear();
+ }
+ }
+};
+
+static ThreadedAnalyticsDestinationTests threadedAnalyticsDestinationTests;
+
+#endif
+
+} // namespace juce
diff --git a/modules/juce_analytics/destinations/juce_ThreadedAnalyticsDestination.h b/modules/juce_analytics/destinations/juce_ThreadedAnalyticsDestination.h
new file mode 100644
index 0000000000..3e7010865d
--- /dev/null
+++ b/modules/juce_analytics/destinations/juce_ThreadedAnalyticsDestination.h
@@ -0,0 +1,212 @@
+/*
+ ==============================================================================
+
+ This file is part of the JUCE library.
+ Copyright (c) 2017 - ROLI Ltd.
+
+ JUCE is an open source library subject to commercial or open-source
+ licensing.
+
+ The code included in this file is provided under the terms of the ISC license
+ http://www.isc.org/downloads/software-support-policy/isc-license. Permission
+ To use, copy, modify, and/or distribute this software for any purpose with or
+ without fee is hereby granted provided that the above copyright notice and
+ this permission notice appear in all copies.
+
+ JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER
+ EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE
+ DISCLAIMED.
+
+ ==============================================================================
+*/
+
+namespace juce
+{
+
+//==============================================================================
+/**
+ A base class for dispatching analytics events on a dedicated thread.
+
+ This class is particularly useful for sending analytics events to a web
+ server without blocking the message thread. It can also save (and restore)
+ events that were not dispatched so no information is lost when an internet
+ connection is absent or something else prevents successful logging.
+
+ Once startAnalyticsThread is called the logBatchedEvents method is
+ periodically invoked on an analytics thread, with the period determined by
+ calls to setBatchPeriod. Here events are grouped together into batches, with
+ the maximum batch size set by the implementation of getMaximumBatchSize.
+
+ It's important to call stopAnalyticsThread in the destructor of your
+ subclass (or before then) to give the analytics thread time to shut down.
+ Calling stopAnalyticsThread will, in turn, call stopLoggingEvents, which
+ you should use to terminate the currently running logBatchedEvents call.
+
+ @see Analytics, AnalyticsDestination, AnalyticsDestination::AnalyticsEvent
+*/
+class JUCE_API ThreadedAnalyticsDestination : public AnalyticsDestination
+{
+public:
+ //==============================================================================
+ /**
+ Creates a ThreadedAnalyticsDestination.
+
+ @param threadName used to identify the analytics
+ thread in debug builds
+ */
+ ThreadedAnalyticsDestination (const String& threadName = "Analytics thread");
+
+ /** Destructor. */
+ virtual ~ThreadedAnalyticsDestination();
+
+ //==============================================================================
+ /**
+ Override this method to provide the maximum batch size you can handle in
+ your subclass.
+
+ Calls to logBatchedEvents will contain no more than this number of events.
+ */
+ virtual int getMaximumBatchSize() = 0;
+
+ /**
+ This method will be called periodically on the analytics thread.
+
+ If this method returns false then the subsequent call of this function will
+ contain the same events as previous call, plus any new events that have been
+ generated in the period between calls. The order of events will not be
+ changed. This allows you to retry logging events until they are logged
+ successfully.
+
+ @param events a list of events to be logged
+ @returns if the events were successfully logged
+ */
+ virtual bool logBatchedEvents (const Array& events) = 0;
+
+ /**
+ You must always call stopAnalyticsThread in the destructor of your subclass
+ (or before then) to give the analytics thread time to shut down.
+
+ Calling stopAnalyticsThread triggers a call to this method. At this point
+ you are guaranteed that logBatchedEvents has been called for the last time
+ and you should make sure that the current call to logBatchedEvents finishes
+ as quickly as possible. This method and a subsequent call to
+ saveUnloggedEvents must both complete before the timeout supplied to
+ stopAnalyticsThread.
+
+ In a normal use case stopLoggingEvents will be called on the message thread
+ from the destructor of your ThreadedAnalyticsDestination subclass, and must
+ stop the logBatchedEvents method which is running on the analytics thread.
+
+ @see stopAnalyticsThread
+ */
+ virtual void stopLoggingEvents() = 0;
+
+ //==============================================================================
+ /**
+ Call this to set the period between logBatchedEvents invocations.
+
+ This method is thread safe and can be used to implements things like
+ exponential backoff in logBatchedEvents calls.
+
+ @param newSubmissionPeriodMilliseconds the new submission period to
+ use in milliseconds
+ */
+ void setBatchPeriod (int newSubmissionPeriodMilliseconds);
+
+ /**
+ Adds an event to the queue, which will ultimately be submitted to
+ logBatchedEvents.
+
+ This method is thread safe.
+
+ @param event the analytics event to add to the queue
+ */
+ void logEvent (const AnalyticsEvent& event) override final;
+
+protected:
+ //==============================================================================
+ /**
+ Starts the analytics thread, with an initial event batching period.
+
+ @param initialBatchPeriodMilliseconds the initial event batching period
+ in milliseconds
+ */
+ void startAnalyticsThread (int initialBatchPeriodMilliseconds);
+
+ //==============================================================================
+ /**
+ Triggers the shutdown of the analytics thread.
+
+ You must call this method in the destructor of your subclass (or before
+ then) to give the analytics thread time to shut down.
+
+ This method invokes stopLoggingEvents and you should ensure that both the
+ analytics thread and a call to saveUnloggedEvents are able to finish before
+ the supplied timeout. This timeout is important because on platforms like
+ iOS an app is killed if it takes too long to shut down.
+
+ @param timeoutMilliseconds the number of milliseconds before
+ the analytics thread is forcibly
+ terminated
+ */
+ void stopAnalyticsThread (int timeoutMilliseconds);
+
+private:
+ //==============================================================================
+ /**
+ This method will be called when the analytics thread is shut down,
+ giving you the chance to save any analytics events that could not be
+ logged. Once saved these events can be put back into the queue of events
+ when the ThreadedAnalyticsDestination is recreated via
+ restoreUnloggedEvents.
+
+ This method should return as quickly as possible, as both
+ stopLoggingEvents and this method need to complete inside the timeout
+ set in stopAnalyticsThread.
+
+ @param eventsToSave the events that could not be logged
+
+ @see stopAnalyticsThread, stopLoggingEvents, restoreUnloggedEvents
+ */
+ virtual void saveUnloggedEvents (const std::deque& eventsToSave) = 0;
+
+ /**
+ The counterpart to saveUnloggedEvents.
+
+ Events added to the event queue provided by this method will be the
+ first events supplied to logBatchedEvents calls. Use this method to
+ restore any unlogged events previously stored in a call to
+ saveUnloggedEvents.
+
+ This method is called on the analytics thread.
+
+ @param restoredEventQueue place restored events into this queue
+
+ @see saveUnloggedEvents
+ */
+ virtual void restoreUnloggedEvents (std::deque& restoredEventQueue) = 0;
+
+ struct EventDispatcher : public Thread
+ {
+ EventDispatcher (const String& threadName, ThreadedAnalyticsDestination&);
+
+ void run() override;
+ void addToQueue (const AnalyticsEvent&);
+
+ ThreadedAnalyticsDestination& parent;
+
+ std::deque eventQueue;
+ CriticalSection queueAccess;
+
+ Atomic batchPeriodMilliseconds { 1000 };
+
+ Array eventsToSend;
+ };
+
+ const String destinationName;
+ EventDispatcher dispatcher;
+
+ JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (ThreadedAnalyticsDestination)
+};
+
+} // namespace juce
diff --git a/modules/juce_analytics/juce_analytics.cpp b/modules/juce_analytics/juce_analytics.cpp
new file mode 100644
index 0000000000..f66a20495d
--- /dev/null
+++ b/modules/juce_analytics/juce_analytics.cpp
@@ -0,0 +1,40 @@
+/*
+ ==============================================================================
+
+ This file is part of the JUCE library.
+ Copyright (c) 2017 - ROLI Ltd.
+
+ JUCE is an open source library subject to commercial or open-source
+ licensing.
+
+ By using JUCE, you agree to the terms of both the JUCE 5 End-User License
+ Agreement and JUCE 5 Privacy Policy (both updated and effective as of the
+ 27th April 2017).
+
+ End User License Agreement: www.juce.com/juce-5-licence
+ Privacy Policy: www.juce.com/juce-5-privacy-policy
+
+ Or: You may also use this code under the terms of the GPL v3 (see
+ www.gnu.org/licenses).
+
+ JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER
+ EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE
+ DISCLAIMED.
+
+ ==============================================================================
+*/
+
+#ifdef JUCE_ANALYTICS_H_INCLUDED
+ /* When you add this cpp file to your project, you mustn't include it in a file where you've
+ already included any other headers - just put it inside a file on its own, possibly with your config
+ flags preceding it, but don't include anything else. That also includes avoiding any automatic prefix
+ header files that the compiler may be using.
+ */
+ #error "Incorrect use of JUCE cpp file"
+#endif
+
+#include "juce_analytics.h"
+
+#include "destinations/juce_ThreadedAnalyticsDestination.cpp"
+#include "analytics/juce_Analytics.cpp"
+#include "analytics/juce_ButtonTracker.cpp"
diff --git a/modules/juce_analytics/juce_analytics.h b/modules/juce_analytics/juce_analytics.h
new file mode 100644
index 0000000000..c9ed5facf2
--- /dev/null
+++ b/modules/juce_analytics/juce_analytics.h
@@ -0,0 +1,56 @@
+/*
+ ==============================================================================
+
+ This file is part of the JUCE library.
+ Copyright (c) 2017 - ROLI Ltd.
+
+ JUCE is an open source library subject to commercial or open-source
+ licensing.
+
+ The code included in this file is provided under the terms of the ISC license
+ http://www.isc.org/downloads/software-support-policy/isc-license. Permission
+ To use, copy, modify, and/or distribute this software for any purpose with or
+ without fee is hereby granted provided that the above copyright notice and
+ this permission notice appear in all copies.
+
+ JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER
+ EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE
+ DISCLAIMED.
+
+ ==============================================================================
+*/
+
+/*******************************************************************************
+ The block below describes the properties of this module, and is read by
+ the Projucer to automatically generate project code that uses it.
+ For details about the syntax and how to create or use a module, see the
+ JUCE Module Format.txt file.
+
+
+ BEGIN_JUCE_MODULE_DECLARATION
+
+ ID: juce_analytics
+ vendor: juce
+ version: 5.1.1
+ name: JUCE analytics classes
+ description: Classes to collect analytics and send to destinations
+ website: http://www.juce.com/juce
+ license: GPL/Commercial
+
+ dependencies: juce_gui_basics
+
+ END_JUCE_MODULE_DECLARATION
+
+*******************************************************************************/
+
+
+#pragma once
+#define JUCE_ANALYTICS_H_INCLUDED
+
+#include
+#include
+
+#include "destinations/juce_AnalyticsDestination.h"
+#include "destinations/juce_ThreadedAnalyticsDestination.h"
+#include "analytics/juce_Analytics.h"
+#include "analytics/juce_ButtonTracker.h"