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"