├── .gitignore
├── .idea
├── .gitignore
├── compiler.xml
├── gradle.xml
├── jarRepositories.xml
├── kotlinc.xml
├── libraries-with-intellij-classes.xml
├── misc.xml
├── modules
│ ├── persistance
│ │ ├── KMMT.persistance.androidTest.iml
│ │ ├── KMMT.persistance.commonTest.iml
│ │ ├── KMMT.persistance.iosArm64Test.iml
│ │ ├── KMMT.persistance.iosSimulatorArm64Test.iml
│ │ ├── KMMT.persistance.iosTest.iml
│ │ ├── KMMT.persistance.iosX64Test.iml
│ │ └── KMMT.persistance.unitTest.iml
│ └── shared
│ │ ├── KMMT.shared.androidTest.iml
│ │ ├── KMMT.shared.commonTest.iml
│ │ ├── KMMT.shared.iosArm64Test.iml
│ │ ├── KMMT.shared.iosSimulatorArm64Test.iml
│ │ ├── KMMT.shared.iosTest.iml
│ │ ├── KMMT.shared.iosX64Test.iml
│ │ └── KMMT.shared.unitTest.iml
├── runConfigurations
│ ├── androidApp.xml
│ └── ioApp.xml
├── uiDesigner.xml
└── vcs.xml
├── KMultiplatform.png
├── LICENSE
├── README.md
├── androidApp
├── build.gradle.kts
└── src
│ └── main
│ ├── AndroidManifest.xml
│ ├── java
│ └── com
│ │ └── jittyandiyan
│ │ └── androidApp
│ │ ├── KMMTApplication.kt
│ │ └── demo
│ │ └── features
│ │ ├── LoginActivity.kt
│ │ ├── home
│ │ ├── HomeActivity.kt
│ │ └── adapter
│ │ │ ├── PostAdapter.kt
│ │ │ └── PostViewHolder.kt
│ │ ├── kampkit
│ │ ├── BreedActivity.kt
│ │ └── adapter
│ │ │ ├── BreedAdapter.kt
│ │ │ └── BreedViewHolder.kt
│ │ └── tvshows
│ │ ├── WelcomeActivity.kt
│ │ └── shows
│ │ ├── TVShowsSearchActivity.kt
│ │ └── adapter
│ │ ├── TVShowViewHolder.kt
│ │ └── TVShowsAdapter.kt
│ └── res
│ ├── drawable
│ ├── ic_favorite_24px.xml
│ └── ic_favorite_border_24px.xml
│ ├── layout
│ ├── activity_home.xml
│ ├── activity_kamp_kit.xml
│ ├── activity_main.xml
│ ├── activity_tvshows.xml
│ ├── activity_welcome.xml
│ ├── item_breed.xml
│ ├── post_adapter_item.xml
│ └── tvshow_adapter_item.xml
│ └── values
│ ├── colors.xml
│ ├── strings.xml
│ └── styles.xml
├── build.gradle.kts
├── buildSrc
├── build.gradle.kts
└── src
│ └── main
│ └── java
│ ├── AppConfig.kt
│ ├── Dependencies.kt
│ ├── Modules.kt
│ ├── Plugins.kt
│ ├── Repositories.kt
│ └── Versions.kt
├── gradle.properties
├── gradle
└── wrapper
│ ├── gradle-wrapper.jar
│ └── gradle-wrapper.properties
├── gradlew
├── gradlew.bat
├── iOS_App
├── KMMT App
│ ├── AppDelegate.swift
│ ├── Assets.xcassets
│ │ ├── AccentColor.colorset
│ │ │ └── Contents.json
│ │ ├── AppIcon.appiconset
│ │ │ └── Contents.json
│ │ └── Contents.json
│ ├── Base.lproj
│ │ ├── LaunchScreen.storyboard
│ │ └── Main.storyboard
│ ├── Info.plist
│ ├── SceneDelegate.swift
│ ├── core
│ │ └── view
│ │ │ ├── KMMUIViewController.swift
│ │ │ ├── extensions
│ │ │ ├── UIControlExtensions.swift
│ │ │ ├── UIFontExtensions.swift
│ │ │ └── UITextFieldControl.swift
│ │ │ ├── resources
│ │ │ └── Colors.swift
│ │ │ └── uicontrols
│ │ │ └── UITextFieldX.swift
│ └── demo
│ │ ├── LoginViewController.swift
│ │ ├── home
│ │ ├── HomeViewController.swift
│ │ └── postTableView
│ │ │ ├── PostCell.swift
│ │ │ └── PostTableViewDataSource.swift
│ │ ├── kampkit
│ │ ├── BreedViewController.swift
│ │ └── breedTableView
│ │ │ ├── BreedCell.swift
│ │ │ └── BreedTableViewDataSource.swift
│ │ └── tvshows
│ │ ├── WelcomeViewController.swift
│ │ └── showsearch
│ │ ├── TVShowsViewController.swift
│ │ └── showresultTableView
│ │ ├── ShowCell.swift
│ │ └── ShowTableViewDataSource.swift
├── KMMT AppTests
│ ├── Info.plist
│ └── KMMT_AppTests.swift
├── KMMT AppUITests
│ ├── Info.plist
│ └── KMMT_AppUITests.swift
├── KMMTApp.xcodeproj
│ ├── project.pbxproj
│ ├── project.xcworkspace
│ │ ├── contents.xcworkspacedata
│ │ ├── xcshareddata
│ │ │ └── IDEWorkspaceChecks.plist
│ │ └── xcuserdata
│ │ │ └── innovateq.xcuserdatad
│ │ │ └── UserInterfaceState.xcuserstate
│ └── xcuserdata
│ │ ├── innovateq.xcuserdatad
│ │ └── xcschemes
│ │ │ └── xcschememanagement.plist
│ │ └── jittyandiyan.xcuserdatad
│ │ └── xcschemes
│ │ └── xcschememanagement.plist
├── KMMTApp.xcworkspace
│ ├── contents.xcworkspacedata
│ ├── xcshareddata
│ │ └── IDEWorkspaceChecks.plist
│ └── xcuserdata
│ │ └── jittyandiyan.xcuserdatad
│ │ └── UserInterfaceState.xcuserstate
├── Podfile
├── Podfile.lock
└── Pods
│ ├── Local Podspecs
│ ├── kmmtshared.podspec.json
│ ├── presenter.podspec.json
│ └── shared.podspec.json
│ ├── Manifest.lock
│ ├── Mixpanel
│ ├── LICENSE
│ ├── README.md
│ └── Sources
│ │ ├── AutomaticEvents.h
│ │ ├── AutomaticEvents.m
│ │ ├── MPDB.h
│ │ ├── MPDB.m
│ │ ├── MPFoundation.h
│ │ ├── MPJSONHander.h
│ │ ├── MPJSONHandler.m
│ │ ├── MPLogger.h
│ │ ├── MPLogger.m
│ │ ├── MPNetwork.h
│ │ ├── MPNetwork.m
│ │ ├── MPNetworkPrivate.h
│ │ ├── Mixpanel.h
│ │ ├── Mixpanel.m
│ │ ├── MixpanelExceptionHandler.h
│ │ ├── MixpanelExceptionHandler.m
│ │ ├── MixpanelGroup.h
│ │ ├── MixpanelGroup.m
│ │ ├── MixpanelGroupPrivate.h
│ │ ├── MixpanelIdentity.h
│ │ ├── MixpanelIdentity.m
│ │ ├── MixpanelPeople.h
│ │ ├── MixpanelPeople.m
│ │ ├── MixpanelPeoplePrivate.h
│ │ ├── MixpanelPersistence.h
│ │ ├── MixpanelPersistence.m
│ │ ├── MixpanelPrivate.h
│ │ ├── MixpanelType.h
│ │ ├── MixpanelType.m
│ │ ├── SessionMetadata.h
│ │ └── SessionMetadata.m
│ ├── Pods.xcodeproj
│ ├── project.pbxproj
│ └── xcuserdata
│ │ └── jittyandiyan.xcuserdatad
│ │ └── xcschemes
│ │ ├── Mixpanel.xcscheme
│ │ ├── Pods-KMMTApp.xcscheme
│ │ ├── UXCam.xcscheme
│ │ ├── kmmtshared.xcscheme
│ │ └── xcschememanagement.plist
│ ├── Target Support Files
│ ├── Mixpanel
│ │ ├── Mixpanel-Info.plist
│ │ ├── Mixpanel-dummy.m
│ │ ├── Mixpanel-prefix.pch
│ │ ├── Mixpanel-umbrella.h
│ │ ├── Mixpanel.debug.xcconfig
│ │ ├── Mixpanel.modulemap
│ │ └── Mixpanel.release.xcconfig
│ ├── Pods-KMMTApp
│ │ ├── Pods-KMMTApp-Info.plist
│ │ ├── Pods-KMMTApp-acknowledgements.markdown
│ │ ├── Pods-KMMTApp-acknowledgements.plist
│ │ ├── Pods-KMMTApp-dummy.m
│ │ ├── Pods-KMMTApp-frameworks-Debug-input-files.xcfilelist
│ │ ├── Pods-KMMTApp-frameworks-Debug-output-files.xcfilelist
│ │ ├── Pods-KMMTApp-frameworks-Release-input-files.xcfilelist
│ │ ├── Pods-KMMTApp-frameworks-Release-output-files.xcfilelist
│ │ ├── Pods-KMMTApp-frameworks.sh
│ │ ├── Pods-KMMTApp-umbrella.h
│ │ ├── Pods-KMMTApp.debug.xcconfig
│ │ ├── Pods-KMMTApp.modulemap
│ │ └── Pods-KMMTApp.release.xcconfig
│ ├── UXCam
│ │ ├── UXCam-xcframeworks-input-files.xcfilelist
│ │ ├── UXCam-xcframeworks-output-files.xcfilelist
│ │ ├── UXCam-xcframeworks.sh
│ │ ├── UXCam.debug.xcconfig
│ │ └── UXCam.release.xcconfig
│ └── kmmtshared
│ │ ├── kmmtshared.debug.xcconfig
│ │ └── kmmtshared.release.xcconfig
│ └── UXCam
│ └── UXCam.xcframework
│ ├── Info.plist
│ ├── ios-arm64_armv7
│ └── UXCam.framework
│ │ ├── CHANGELOG.md
│ │ ├── FileMD5Hash-LICENSE
│ │ ├── FileMD5Hash-NOTICE
│ │ ├── Frameworks
│ │ └── module.modulemap
│ │ ├── GZIP-LICENCE.md
│ │ ├── Headers
│ │ ├── UXCam-umbrella.h
│ │ ├── UXCam.h
│ │ ├── UXCamBlurSetting.h
│ │ ├── UXCamConfiguration.h
│ │ ├── UXCamOccludeAllTextFields.h
│ │ ├── UXCamOcclusion.h
│ │ ├── UXCamOcclusionParameter.h
│ │ ├── UXCamOcclusionScreen.h
│ │ ├── UXCamOcclusionSetting.h
│ │ ├── UXCamOverlaySetting.h
│ │ └── UXOcclusionHeaders.h
│ │ ├── Info.plist
│ │ ├── LICENSE-minizip
│ │ ├── Modules
│ │ └── module.modulemap
│ │ ├── PLCrashReporter-LICENSE
│ │ ├── SSZipArchive-LICENSE.txt
│ │ ├── UXCam
│ │ └── iOSViewHierarchy-LICENSE.txt
│ └── ios-arm64_i386_x86_64-simulator
│ └── UXCam.framework
│ ├── CHANGELOG.md
│ ├── FileMD5Hash-LICENSE
│ ├── FileMD5Hash-NOTICE
│ ├── Frameworks
│ └── module.modulemap
│ ├── GZIP-LICENCE.md
│ ├── Headers
│ ├── UXCam-umbrella.h
│ ├── UXCam.h
│ ├── UXCamBlurSetting.h
│ ├── UXCamConfiguration.h
│ ├── UXCamOccludeAllTextFields.h
│ ├── UXCamOcclusion.h
│ ├── UXCamOcclusionParameter.h
│ ├── UXCamOcclusionScreen.h
│ ├── UXCamOcclusionSetting.h
│ ├── UXCamOverlaySetting.h
│ └── UXOcclusionHeaders.h
│ ├── Info.plist
│ ├── LICENSE-minizip
│ ├── Modules
│ └── module.modulemap
│ ├── PLCrashReporter-LICENSE
│ ├── SSZipArchive-LICENSE.txt
│ ├── UXCam
│ ├── _CodeSignature
│ ├── CodeDirectory
│ ├── CodeRequirements
│ ├── CodeRequirements-1
│ ├── CodeResources
│ └── CodeSignature
│ └── iOSViewHierarchy-LICENSE.txt
├── img.png
├── img_1.png
├── kmmtshared
├── analytics
│ ├── build.gradle.kts
│ └── src
│ │ ├── androidMain
│ │ ├── AndroidManifest.xml
│ │ └── kotlin
│ │ │ └── com
│ │ │ └── kmmt
│ │ │ └── analytics
│ │ │ ├── expectations
│ │ │ └── AnalyticsContext.kt
│ │ │ └── platforms
│ │ │ ├── mixpanel
│ │ │ ├── AnalyticsMixpanel.kt
│ │ │ └── ExpectationsMixpanel.kt
│ │ │ └── uxcam
│ │ │ ├── AnalyticsUXcam.kt
│ │ │ └── ExpectationsMixpanel.kt
│ │ ├── commonMain
│ │ └── kotlin
│ │ │ └── com
│ │ │ └── kmmt
│ │ │ └── analytics
│ │ │ ├── core
│ │ │ ├── AnalyticsEvent.kt
│ │ │ ├── AnalyticsEventProperties.kt
│ │ │ ├── AppInfo.kt
│ │ │ └── HashCreator.kt
│ │ │ ├── event
│ │ │ └── log
│ │ │ │ ├── EventExtensions.kt
│ │ │ │ ├── LogCategory.kt
│ │ │ │ └── events
│ │ │ │ ├── BaseLogEvent.kt
│ │ │ │ └── GeneralEvents.kt
│ │ │ ├── expectations
│ │ │ └── AnalyticsContext.kt
│ │ │ └── platforms
│ │ │ ├── mixpanel
│ │ │ ├── AnalyticsMixpanel.kt
│ │ │ └── ExpectationsMixpanel.kt
│ │ │ └── uxcam
│ │ │ ├── AnalyticsUXcam.kt
│ │ │ └── ExpectationsUXCam.kt
│ │ └── iosMain
│ │ └── kotlin
│ │ └── com
│ │ └── kmmt
│ │ └── analytics
│ │ ├── expectations
│ │ └── AnalyticsContext.kt
│ │ └── platforms
│ │ ├── mixpanel
│ │ ├── AnalyticsMixpanel.kt
│ │ └── ExpectationsMixpanel.kt
│ │ └── uxcam
│ │ ├── AnalyticsUXcam.kt
│ │ └── ExpectationsMixpanel.kt
├── build.gradle.kts
├── common
│ ├── build.gradle.kts
│ └── src
│ │ ├── androidMain
│ │ ├── AndroidManifest.xml
│ │ └── kotlin
│ │ │ └── com
│ │ │ └── kmmt
│ │ │ └── common
│ │ │ ├── dependencyInjection
│ │ │ └── Android.kt
│ │ │ └── expectations
│ │ │ ├── Application.kt
│ │ │ ├── Dispatchers.kt
│ │ │ └── platform.kt
│ │ ├── commonMain
│ │ └── kotlin
│ │ │ └── com
│ │ │ └── kmmt
│ │ │ └── common
│ │ │ ├── expectations
│ │ │ ├── Application.kt
│ │ │ ├── Dispatchers.kt
│ │ │ └── platform.kt
│ │ │ ├── extensions
│ │ │ ├── JsonExtensions.kt
│ │ │ └── StringExtensions.kt
│ │ │ ├── functional
│ │ │ └── Either.kt
│ │ │ ├── models
│ │ │ └── Failure.kt
│ │ │ ├── platforms
│ │ │ ├── Platform.kt
│ │ │ └── PlatformBlocks.kt
│ │ │ └── serialization
│ │ │ └── JsonSerializationHelper.kt
│ │ └── iosMain
│ │ └── kotlin
│ │ └── com
│ │ └── kmmt
│ │ └── common
│ │ ├── dependencyInjection
│ │ └── IOS.kt
│ │ └── expectations
│ │ ├── Application.kt
│ │ ├── Dispatchers.kt
│ │ └── platform.kt
├── core
│ ├── build.gradle.kts
│ └── src
│ │ ├── androidMain
│ │ ├── AndroidManifest.xml
│ │ └── kotlin
│ │ │ └── com
│ │ │ └── kmmt
│ │ │ └── core
│ │ │ ├── architecture
│ │ │ └── view
│ │ │ │ └── KMMActivity.kt
│ │ │ ├── extensions
│ │ │ └── ViewExtensions.kt
│ │ │ ├── liveData
│ │ │ └── LiveDataX.kt
│ │ │ └── platform
│ │ │ └── expectations
│ │ │ └── PlatformExpectations.kt
│ │ ├── androidTest
│ │ └── kotlin
│ │ │ └── com
│ │ │ └── kmmt
│ │ │ └── core
│ │ │ └── androidTest.kt
│ │ ├── commonMain
│ │ └── kotlin
│ │ │ └── com
│ │ │ └── kmmt
│ │ │ └── core
│ │ │ ├── architecture
│ │ │ ├── presenter
│ │ │ │ ├── BasePresenter.kt
│ │ │ │ ├── async
│ │ │ │ │ └── Async.kt
│ │ │ │ └── viewState
│ │ │ │ │ └── ViewState.kt
│ │ │ ├── repository
│ │ │ │ └── BaseRepository.kt
│ │ │ ├── usecase
│ │ │ │ ├── BaseRepositoryUseCase.kt
│ │ │ │ └── BaseUseCase.kt
│ │ │ └── view
│ │ │ │ └── BaseView.kt
│ │ │ ├── bundle
│ │ │ └── BundleValues.kt
│ │ │ ├── dataFlow
│ │ │ └── FlowState.kt
│ │ │ ├── dataSync
│ │ │ └── BaseDataCache.kt
│ │ │ ├── extensions
│ │ │ └── FlowExtensions.kt
│ │ │ ├── liveData
│ │ │ ├── LiveData.kt
│ │ │ ├── LiveDataObservable.kt
│ │ │ ├── LiveDataOperators.kt
│ │ │ ├── LiveDataTransformations.kt
│ │ │ └── lifecycle
│ │ │ │ ├── LiveDataLifecycle.kt
│ │ │ │ └── LiveDataLifecycleAndObserver.kt
│ │ │ └── platform
│ │ │ └── expectations
│ │ │ └── PlatformExpectations.kt
│ │ ├── commonTest
│ │ └── kotlin
│ │ │ └── com
│ │ │ └── kmmt
│ │ │ └── core
│ │ │ └── commonTest.kt
│ │ ├── iosMain
│ │ └── kotlin
│ │ │ └── com
│ │ │ └── kmmt
│ │ │ └── core
│ │ │ ├── liveData
│ │ │ └── LiveDataX.kt
│ │ │ └── platform
│ │ │ └── expectations
│ │ │ └── PlatformExpectations.kt
│ │ └── iosTest
│ │ └── kotlin
│ │ └── com
│ │ └── kmmt
│ │ └── core
│ │ └── iosTest.kt
├── domain
│ ├── build.gradle.kts
│ └── src
│ │ ├── androidMain
│ │ └── AndroidManifest.xml
│ │ └── commonMain
│ │ └── kotlin
│ │ └── com
│ │ └── kmmt
│ │ └── domain
│ │ ├── demo
│ │ └── cache
│ │ │ └── BreedListCache.kt
│ │ └── demotvshowsearch
│ │ ├── repository
│ │ └── TVShowSearchRepository.kt
│ │ └── usecase
│ │ └── TVShowSearchUseCase.kt
├── injector
│ ├── build.gradle.kts
│ └── src
│ │ ├── androidMain
│ │ └── AndroidManifest.xml
│ │ └── commonMain
│ │ └── kotlin
│ │ └── com
│ │ └── kmmt
│ │ └── injector
│ │ └── koin
│ │ └── InjectionConfigurations.kt
├── models
│ ├── build.gradle.kts
│ └── src
│ │ ├── androidMain
│ │ └── AndroidManifest.xml
│ │ └── commonMain
│ │ └── kotlin
│ │ └── com
│ │ └── kmmt
│ │ └── models
│ │ ├── demo
│ │ ├── domain
│ │ │ ├── Breed.kt
│ │ │ ├── CredentialsModel.kt
│ │ │ ├── PostModel.kt
│ │ │ └── UserModel.kt
│ │ └── dto
│ │ │ └── BreedResult.kt
│ │ └── demotvshowsearch
│ │ ├── domain
│ │ └── TVShowInfo.kt
│ │ └── dto
│ │ ├── TMDBTVSearchDTO.kt
│ │ └── TVShowsDTO.kt
├── network
│ ├── build.gradle.kts
│ └── src
│ │ ├── androidMain
│ │ └── AndroidManifest.xml
│ │ └── commonMain
│ │ └── kotlin
│ │ └── com
│ │ └── kmmt
│ │ └── network
│ │ ├── apis
│ │ ├── BreedServiceAPI.kt
│ │ ├── JsonPlaceHolderServiceAPI.kt
│ │ └── TVMazeAPI.kt
│ │ └── core
│ │ ├── BaseAPI.kt
│ │ └── HTTPHelper.kt
├── persistence
│ ├── build.gradle.kts
│ └── src
│ │ ├── androidMain
│ │ ├── AndroidManifest.xml
│ │ └── kotlin
│ │ │ └── com
│ │ │ └── kmmt
│ │ │ └── persistance
│ │ │ ├── keyValueStore
│ │ │ └── settings
│ │ │ │ └── expectations
│ │ │ │ └── settings.kt
│ │ │ └── storage
│ │ │ └── sqlite
│ │ │ └── expectations
│ │ │ └── sqliteDriver.kt
│ │ ├── commonMain
│ │ ├── kotlin
│ │ │ └── com
│ │ │ │ └── kmmt
│ │ │ │ └── persistance
│ │ │ │ ├── dataSources
│ │ │ │ └── breed
│ │ │ │ │ ├── BreedDataSource.kt
│ │ │ │ │ ├── BreedRealmDataSource.kt
│ │ │ │ │ └── BreedSQLiteDataSource.kt
│ │ │ │ ├── keyValueStore
│ │ │ │ └── settings
│ │ │ │ │ ├── KeyValueStore.kt
│ │ │ │ │ ├── SettingsExtensions.kt
│ │ │ │ │ ├── dependencyInjection
│ │ │ │ │ └── Store.kt
│ │ │ │ │ └── expectations
│ │ │ │ │ └── settings.kt
│ │ │ │ └── storage
│ │ │ │ ├── realm
│ │ │ │ ├── RealmHelper.kt
│ │ │ │ └── TBreed.kt
│ │ │ │ └── sqlite
│ │ │ │ ├── ModelMapper.kt
│ │ │ │ ├── SQLDelightHelper.kt
│ │ │ │ ├── expectations
│ │ │ │ └── sqliteDriver.kt
│ │ │ │ └── extensions
│ │ │ │ └── SQLDelightExtensions.kt
│ │ └── sqldelight
│ │ │ └── com
│ │ │ └── jittyandiyan
│ │ │ └── mobile
│ │ │ └── TBreed.sq
│ │ └── iosMain
│ │ └── kotlin
│ │ └── com
│ │ └── kmmt
│ │ └── persistance
│ │ ├── keyValueStore
│ │ └── settings
│ │ │ └── expectations
│ │ │ └── settings.kt
│ │ └── storage
│ │ └── sqlite
│ │ └── expectations
│ │ └── sqliteDriver.kt
├── presenter
│ ├── build.gradle.kts
│ └── src
│ │ ├── androidMain
│ │ ├── AndroidManifest.xml
│ │ └── kotlin
│ │ │ └── com
│ │ │ └── jittyandiyan
│ │ │ └── shared
│ │ │ └── Platform.kt
│ │ ├── androidTest
│ │ └── kotlin
│ │ │ └── com
│ │ │ └── jittyandiyan
│ │ │ └── shared
│ │ │ └── androidTest.kt
│ │ ├── commonMain
│ │ └── kotlin
│ │ │ └── com
│ │ │ └── jittyandiyan
│ │ │ └── shared
│ │ │ ├── Greeting.kt
│ │ │ ├── Platform.kt
│ │ │ ├── demo
│ │ │ └── features
│ │ │ │ ├── home
│ │ │ │ ├── HomePresenter.kt
│ │ │ │ └── HomeView.kt
│ │ │ │ ├── kampkit
│ │ │ │ ├── BreedPresenter.kt
│ │ │ │ └── BreedView.kt
│ │ │ │ └── login
│ │ │ │ ├── LoginPresenter.kt
│ │ │ │ └── LoginView.kt
│ │ │ └── demoTVMazeShowSearch
│ │ │ └── features
│ │ │ ├── tvshows
│ │ │ ├── TVShowsSearchPresenter.kt
│ │ │ └── TVShowsSearchView.kt
│ │ │ └── welcome
│ │ │ ├── WelcomePresenter.kt
│ │ │ └── WelcomeView.kt
│ │ ├── iosMain
│ │ └── kotlin
│ │ │ └── com
│ │ │ └── jittyandiyan
│ │ │ └── shared
│ │ │ └── Platform.kt
│ │ └── iosTest
│ │ └── kotlin
│ │ └── com
│ │ └── jittyandiyan
│ │ └── shared
│ │ └── iosTest.kt
├── resources
│ ├── build.gradle.kts
│ └── src
│ │ ├── androidMain
│ │ ├── AndroidManifest.xml
│ │ └── kotlin
│ │ │ └── com
│ │ │ └── kmmt
│ │ │ └── resources
│ │ │ ├── Utils.kt
│ │ │ └── expectations
│ │ │ └── localized.kt
│ │ ├── commonMain
│ │ ├── kotlin
│ │ │ └── com
│ │ │ │ └── kmmt
│ │ │ │ └── resources
│ │ │ │ └── expectations
│ │ │ │ └── localized.kt
│ │ └── resources
│ │ │ └── MR
│ │ │ ├── base
│ │ │ └── strings.xml
│ │ │ ├── colors
│ │ │ └── colors.xml
│ │ │ └── de
│ │ │ └── strings.xml
│ │ └── iosMain
│ │ └── kotlin
│ │ └── com
│ │ └── kmmt
│ │ └── resources
│ │ ├── Utils.kt
│ │ └── expectations
│ │ └── localized.kt
└── src
│ ├── androidMain
│ ├── AndroidManifest.xml
│ └── kotlin
│ │ └── com
│ │ └── jitty
│ │ └── kmmtshared
│ │ └── Platform.kt
│ ├── commonMain
│ └── kotlin
│ │ └── com
│ │ └── jitty
│ │ └── kmmtshared
│ │ ├── Greeting.kt
│ │ └── Platform.kt
│ └── iosMain
│ └── kotlin
│ └── com
│ └── jitty
│ └── kmmtshared
│ └── Platform.kt
├── local.properties
└── settings.gradle.kts
/.gitignore:
--------------------------------------------------------------------------------
1 | # Project exclude paths
2 | /.gradle/
3 | /buildSrc/.gradle/
4 | /buildSrc/build/
5 | /build/
6 | /*/build/
7 | *.podspec
--------------------------------------------------------------------------------
/.idea/.gitignore:
--------------------------------------------------------------------------------
1 | # Default ignored files
2 | /shelf/
3 | /workspace.xml
4 |
--------------------------------------------------------------------------------
/.idea/compiler.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
--------------------------------------------------------------------------------
/.idea/gradle.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
30 |
31 |
--------------------------------------------------------------------------------
/.idea/jarRepositories.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
28 |
29 |
30 |
31 |
32 |
33 |
34 |
35 |
36 |
37 |
38 |
39 |
40 |
--------------------------------------------------------------------------------
/.idea/kotlinc.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
--------------------------------------------------------------------------------
/.idea/misc.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
--------------------------------------------------------------------------------
/.idea/modules/persistance/KMMT.persistance.androidTest.iml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
--------------------------------------------------------------------------------
/.idea/modules/persistance/KMMT.persistance.commonTest.iml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
--------------------------------------------------------------------------------
/.idea/modules/persistance/KMMT.persistance.iosArm64Test.iml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
--------------------------------------------------------------------------------
/.idea/modules/persistance/KMMT.persistance.iosSimulatorArm64Test.iml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
--------------------------------------------------------------------------------
/.idea/modules/persistance/KMMT.persistance.iosTest.iml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
--------------------------------------------------------------------------------
/.idea/modules/persistance/KMMT.persistance.iosX64Test.iml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
--------------------------------------------------------------------------------
/.idea/modules/persistance/KMMT.persistance.unitTest.iml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
--------------------------------------------------------------------------------
/.idea/modules/shared/KMMT.shared.androidTest.iml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
--------------------------------------------------------------------------------
/.idea/modules/shared/KMMT.shared.commonTest.iml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
--------------------------------------------------------------------------------
/.idea/modules/shared/KMMT.shared.iosArm64Test.iml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
--------------------------------------------------------------------------------
/.idea/modules/shared/KMMT.shared.iosSimulatorArm64Test.iml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
--------------------------------------------------------------------------------
/.idea/modules/shared/KMMT.shared.iosTest.iml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
--------------------------------------------------------------------------------
/.idea/modules/shared/KMMT.shared.iosX64Test.iml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
--------------------------------------------------------------------------------
/.idea/modules/shared/KMMT.shared.unitTest.iml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
--------------------------------------------------------------------------------
/.idea/runConfigurations/ioApp.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
--------------------------------------------------------------------------------
/.idea/vcs.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
--------------------------------------------------------------------------------
/KMultiplatform.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jittya/KMMT/2faa5eb1fdd785cc1b07f03b9c186af1a3acfc40/KMultiplatform.png
--------------------------------------------------------------------------------
/LICENSE:
--------------------------------------------------------------------------------
1 | MIT License
2 |
3 | Copyright (c) 2021 Jitty Andiyan
4 |
5 | Permission is hereby granted, free of charge, to any person obtaining a copy
6 | of this software and associated documentation files (the "Software"), to deal
7 | in the Software without restriction, including without limitation the rights
8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9 | copies of the Software, and to permit persons to whom the Software is
10 | furnished to do so, subject to the following conditions:
11 |
12 | The above copyright notice and this permission notice shall be included in all
13 | copies or substantial portions of the Software.
14 |
15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21 | SOFTWARE.
22 |
--------------------------------------------------------------------------------
/androidApp/src/main/AndroidManifest.xml:
--------------------------------------------------------------------------------
1 |
2 |
4 |
5 |
6 |
7 |
8 |
9 |
15 |
16 |
17 |
18 |
19 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
28 |
29 |
31 |
32 |
33 |
34 |
35 |
36 |
37 |
38 |
39 |
--------------------------------------------------------------------------------
/androidApp/src/main/java/com/jittyandiyan/androidApp/demo/features/home/adapter/PostAdapter.kt:
--------------------------------------------------------------------------------
1 | package com.jittyandiyan.androidApp.demo.features.home.adapter
2 |
3 | import android.view.LayoutInflater
4 | import android.view.ViewGroup
5 | import androidx.recyclerview.widget.DiffUtil
6 | import androidx.recyclerview.widget.ListAdapter
7 | import com.jittyandiyan.androidApp.databinding.PostAdapterItemBinding
8 | import com.kmmt.models.demo.domain.PostModel
9 |
10 | class PostAdapter : ListAdapter(postCallback) {
11 | override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): PostViewHolder {
12 | var binding = PostAdapterItemBinding.inflate(LayoutInflater.from(parent.context), parent, false)
13 | return PostViewHolder(binding)
14 | }
15 |
16 | override fun onBindViewHolder(holder: PostViewHolder, position: Int) {
17 | holder.bindData(getItem(position))
18 | }
19 |
20 | companion object {
21 | private val postCallback = object : DiffUtil.ItemCallback() {
22 | override fun areContentsTheSame(oldItem: PostModel, newItem: PostModel): Boolean = oldItem == newItem
23 | override fun areItemsTheSame(oldItem: PostModel, newItem: PostModel): Boolean = oldItem.id == newItem.id
24 | }
25 | }
26 | }
--------------------------------------------------------------------------------
/androidApp/src/main/java/com/jittyandiyan/androidApp/demo/features/home/adapter/PostViewHolder.kt:
--------------------------------------------------------------------------------
1 | package com.jittyandiyan.androidApp.demo.features.home.adapter
2 |
3 | import androidx.recyclerview.widget.RecyclerView
4 | import com.jittyandiyan.androidApp.databinding.PostAdapterItemBinding
5 | import com.kmmt.models.demo.domain.PostModel
6 |
7 | class PostViewHolder(binding: PostAdapterItemBinding) : RecyclerView.ViewHolder(binding.root) {
8 | private val postDescTV = binding.postDescTV
9 | private val postEmailTV = binding.postEmailTV
10 | private val postNameTV = binding.postNameTV
11 |
12 | fun bindData(postModel: PostModel)
13 | {
14 | postDescTV.text = postModel.body
15 | postEmailTV.text = postModel.email
16 | postNameTV.text = postModel.name
17 | }
18 | }
--------------------------------------------------------------------------------
/androidApp/src/main/java/com/jittyandiyan/androidApp/demo/features/kampkit/adapter/BreedAdapter.kt:
--------------------------------------------------------------------------------
1 | package com.jittyandiyan.androidApp.demo.features.kampkit.adapter
2 |
3 | import android.view.LayoutInflater
4 | import android.view.ViewGroup
5 | import androidx.recyclerview.widget.DiffUtil
6 | import androidx.recyclerview.widget.ListAdapter
7 | import com.jittyandiyan.androidApp.databinding.ItemBreedBinding
8 | import com.kmmt.models.demo.domain.Breed
9 | import kotlin.reflect.KFunction1
10 |
11 | class BreedAdapter : ListAdapter(postCallback) {
12 | private var invertBreedFavouriteState: KFunction1? = null
13 |
14 | override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): BreedViewHolder {
15 | var binding = ItemBreedBinding.inflate(LayoutInflater.from(parent.context), parent, false)
16 | return BreedViewHolder(binding)
17 | }
18 |
19 | override fun onBindViewHolder(holder: BreedViewHolder, position: Int) {
20 | holder.bindData(getItem(position))
21 | holder.favoriteButton.setOnClickListener {
22 | invertBreedFavouriteState?.invoke(getItem(position))
23 | }
24 | }
25 |
26 | fun setBreedFavouriteClickAction(invertBreedFavouriteState: KFunction1) {
27 | this.invertBreedFavouriteState = invertBreedFavouriteState
28 | }
29 |
30 | companion object {
31 | private val postCallback = object : DiffUtil.ItemCallback() {
32 | override fun areContentsTheSame(oldItem: Breed, newItem: Breed): Boolean = oldItem == newItem
33 | override fun areItemsTheSame(oldItem: Breed, newItem: Breed): Boolean = oldItem.id == newItem.id
34 | }
35 | }
36 | }
--------------------------------------------------------------------------------
/androidApp/src/main/java/com/jittyandiyan/androidApp/demo/features/kampkit/adapter/BreedViewHolder.kt:
--------------------------------------------------------------------------------
1 | package com.jittyandiyan.androidApp.demo.features.kampkit.adapter
2 |
3 | import androidx.recyclerview.widget.RecyclerView
4 | import com.jittyandiyan.androidApp.R
5 | import com.jittyandiyan.androidApp.databinding.ItemBreedBinding
6 | import com.kmmt.models.demo.domain.Breed
7 |
8 | class BreedViewHolder(binding: ItemBreedBinding) : RecyclerView.ViewHolder(binding.root) {
9 | private val nameTextView = binding.breedNameTextView
10 | val favoriteButton = binding.favoriteButton
11 |
12 | fun bindData(breed: Breed) {
13 | nameTextView.text = breed.name
14 | if (breed.favorite) {
15 | favoriteButton.setBackgroundResource(R.drawable.ic_favorite_24px)
16 | } else {
17 | favoriteButton.setBackgroundResource(R.drawable.ic_favorite_border_24px)
18 | }
19 | }
20 | }
--------------------------------------------------------------------------------
/androidApp/src/main/java/com/jittyandiyan/androidApp/demo/features/tvshows/WelcomeActivity.kt:
--------------------------------------------------------------------------------
1 | package com.jittyandiyan.androidApp.demo.features.tvshows
2 |
3 | import com.jittyandiyan.androidApp.databinding.ActivityWelcomeBinding
4 | import com.jittyandiyan.androidApp.demo.features.tvshows.shows.TVShowsSearchActivity
5 | import com.kmmt.core.architecture.view.KMMActivity
6 | import com.kmmt.core.extensions.setClickAction
7 | import com.jittyandiyan.shared.demoTVMazeShowSearch.features.welcome.WelcomePresenter
8 | import com.jittyandiyan.shared.demoTVMazeShowSearch.features.welcome.WelcomeView
9 | import kotlin.reflect.KFunction0
10 |
11 | class WelcomeActivity : KMMActivity(), WelcomeView {
12 |
13 | //Generated Methods from KMMActivity based on WelcomeViewModel
14 | override fun initializePresenter(): WelcomePresenter {
15 | return WelcomePresenter(this)
16 | }
17 |
18 | override fun viewBindingInflate(): ActivityWelcomeBinding {
19 | return ActivityWelcomeBinding.inflate(layoutInflater)
20 | }
21 |
22 | //Generated Methods from WelcomeView
23 | override fun setWelcomePageLabel(msg: String) {
24 | binding.textView.text = msg
25 | }
26 |
27 | override fun setTVShowsButtonClickAction(onLoginClick: KFunction0) {
28 | binding.welcomeBtn.setClickAction(onLoginClick)
29 | }
30 |
31 | override fun setTVShowsButtonLabel(tvShowsBtnLbl: String) {
32 | binding.welcomeBtn.text = tvShowsBtnLbl
33 | }
34 |
35 | override fun navigateToTVShowsPage() {
36 | openActivity(TVShowsSearchActivity::class.java)
37 | finish()
38 | }
39 |
40 | }
41 |
--------------------------------------------------------------------------------
/androidApp/src/main/java/com/jittyandiyan/androidApp/demo/features/tvshows/shows/adapter/TVShowViewHolder.kt:
--------------------------------------------------------------------------------
1 | package com.jittyandiyan.androidApp.demo.features.tvshows.shows.adapter
2 |
3 | import android.text.Html
4 | import androidx.recyclerview.widget.RecyclerView
5 | import com.jittyandiyan.androidApp.databinding.TvshowAdapterItemBinding
6 | import com.kmmt.models.demotvshowsearch.domain.TVShowInfo
7 |
8 | class TVShowViewHolder(binding: TvshowAdapterItemBinding) : RecyclerView.ViewHolder(binding.root) {
9 | private val showDescTV = binding.showDescTV
10 | private val showLanguageTV = binding.showLanguageTV
11 | private val showNameTV = binding.showNameTV
12 |
13 | fun bindData(showModel: TVShowInfo)
14 | {
15 | showModel.summary?.let {
16 | showDescTV.text = Html.fromHtml(it)
17 | }
18 | showModel.language?.let {
19 | showLanguageTV.text = it
20 | }
21 | showModel.name?.let {
22 | showNameTV.text = it
23 | }
24 | }
25 | }
--------------------------------------------------------------------------------
/androidApp/src/main/java/com/jittyandiyan/androidApp/demo/features/tvshows/shows/adapter/TVShowsAdapter.kt:
--------------------------------------------------------------------------------
1 | package com.jittyandiyan.androidApp.demo.features.tvshows.shows.adapter
2 |
3 | import android.view.LayoutInflater
4 | import android.view.ViewGroup
5 | import androidx.recyclerview.widget.DiffUtil
6 | import androidx.recyclerview.widget.ListAdapter
7 | import com.jittyandiyan.androidApp.databinding.TvshowAdapterItemBinding
8 | import com.kmmt.models.demotvshowsearch.domain.TVShowInfo
9 |
10 | class TVShowsAdapter : ListAdapter(postCallback) {
11 | override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): TVShowViewHolder {
12 | var binding = TvshowAdapterItemBinding.inflate(LayoutInflater.from(parent.context), parent, false)
13 | return TVShowViewHolder(binding)
14 | }
15 |
16 | override fun onBindViewHolder(holder: TVShowViewHolder, position: Int) {
17 | holder.bindData(getItem(position))
18 | }
19 |
20 | companion object {
21 | private val postCallback = object : DiffUtil.ItemCallback() {
22 | override fun areContentsTheSame(oldItem: TVShowInfo, newItem: TVShowInfo): Boolean = oldItem == newItem
23 | override fun areItemsTheSame(oldItem: TVShowInfo, newItem: TVShowInfo): Boolean = oldItem.id == newItem.id
24 | }
25 | }
26 | }
--------------------------------------------------------------------------------
/androidApp/src/main/res/drawable/ic_favorite_24px.xml:
--------------------------------------------------------------------------------
1 |
6 |
9 |
10 |
--------------------------------------------------------------------------------
/androidApp/src/main/res/drawable/ic_favorite_border_24px.xml:
--------------------------------------------------------------------------------
1 |
6 |
9 |
10 |
--------------------------------------------------------------------------------
/androidApp/src/main/res/layout/activity_home.xml:
--------------------------------------------------------------------------------
1 |
2 |
8 |
9 |
17 |
26 |
31 |
--------------------------------------------------------------------------------
/androidApp/src/main/res/layout/activity_kamp_kit.xml:
--------------------------------------------------------------------------------
1 |
2 |
9 |
17 |
25 |
26 |
--------------------------------------------------------------------------------
/androidApp/src/main/res/layout/activity_tvshows.xml:
--------------------------------------------------------------------------------
1 |
2 |
9 |
10 |
21 |
29 |
--------------------------------------------------------------------------------
/androidApp/src/main/res/layout/activity_welcome.xml:
--------------------------------------------------------------------------------
1 |
2 |
10 |
11 |
12 |
18 |
27 |
28 |
35 |
36 |
37 |
--------------------------------------------------------------------------------
/androidApp/src/main/res/layout/item_breed.xml:
--------------------------------------------------------------------------------
1 |
2 |
6 |
7 |
12 |
13 |
23 |
24 |
33 |
34 |
35 |
36 |
--------------------------------------------------------------------------------
/androidApp/src/main/res/values/colors.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 | #6200EE
4 | #3700B3
5 | #03DAC5
6 |
--------------------------------------------------------------------------------
/androidApp/src/main/res/values/strings.xml:
--------------------------------------------------------------------------------
1 |
2 |
--------------------------------------------------------------------------------
/androidApp/src/main/res/values/styles.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
9 |
10 |
--------------------------------------------------------------------------------
/build.gradle.kts:
--------------------------------------------------------------------------------
1 | buildscript {
2 | repositories {
3 | gradlePluginPortal()
4 | google()
5 | mavenCentral()
6 | }
7 | dependencies {
8 | classpath(Plugins.kotlinGradlePlugin)
9 | classpath(Plugins.AndroidBuildGradlePlugin)
10 | classpath(Plugins.kotlinSerializationGradlePlugin)
11 | classpath(Plugins.SQLDelightGradlePlugin)
12 | classpath(Plugins.RealmGradlePlugin)
13 | classpath(Plugins.MokoResourceGenerator)
14 | }
15 | }
16 |
17 | group = AppConfig.group
18 | version = AppConfig.version
19 |
20 | allprojects {
21 | repositories {
22 | google()
23 | mavenCentral()
24 | maven(url = "https://sdk.uxcam.com/android/")
25 | }
26 | }
--------------------------------------------------------------------------------
/buildSrc/build.gradle.kts:
--------------------------------------------------------------------------------
1 | import org.gradle.kotlin.dsl.`kotlin-dsl`
2 |
3 | repositories{
4 | jcenter()
5 | }
6 | plugins {
7 | `kotlin-dsl`
8 | }
9 |
10 | tasks.withType {
11 | kotlinOptions {
12 | jvmTarget = "11"
13 | }
14 | }
--------------------------------------------------------------------------------
/buildSrc/src/main/java/AppConfig.kt:
--------------------------------------------------------------------------------
1 | object AppConfig {
2 | const val AppName = "KMMT App"
3 | const val versionCode = 1
4 | const val version = "0.1.1.21.4.26" //Major.Minor.intermediate.Year.Month.Day
5 | const val group = "com.jittyandiyan.mobile"
6 | const val dbName = "KMMTDB"
7 | object Android {
8 | var appName = AppName.replace(" ", "")
9 | var packageName = "$group.$appName.android"
10 | const val compileSdkVersion = 32
11 | const val minSdkVersion = 21
12 | const val targetSdkVersion = 32
13 | }
14 | }
15 |
16 |
17 |
18 |
--------------------------------------------------------------------------------
/buildSrc/src/main/java/Modules.kt:
--------------------------------------------------------------------------------
1 | object Modules {
2 | const val kmmtshared =":kmmtshared"
3 | const val presenter = "$kmmtshared:presenter"
4 | const val core = "$kmmtshared:core"
5 | const val persistence = "$kmmtshared:persistence"
6 | const val injector = "$kmmtshared:injector"
7 | const val common = "$kmmtshared:common"
8 | const val network = "$kmmtshared:network"
9 | const val models = "$kmmtshared:models"
10 | const val domain = "$kmmtshared:domain"
11 | const val resources = "$kmmtshared:resources"
12 | const val analytics = "$kmmtshared:analytics"
13 | }
--------------------------------------------------------------------------------
/buildSrc/src/main/java/Plugins.kt:
--------------------------------------------------------------------------------
1 | object Plugins {
2 | const val SQLDelightGradlePlugin =
3 | "com.squareup.sqldelight:gradle-plugin:${Versions.Dependencies.KMM.SQLDelightVersion}"
4 | const val kotlinGradlePlugin =
5 | "org.jetbrains.kotlin:kotlin-gradle-plugin:${Versions.Project.kotlin_version}"
6 | const val kotlinSerializationGradlePlugin =
7 | "org.jetbrains.kotlin:kotlin-serialization:${Versions.Project.kotlin_version}"
8 | const val AndroidBuildGradlePlugin =
9 | "com.android.tools.build:gradle:${Versions.Project.Android_Gradle_Plugin_version}"
10 | const val RealmGradlePlugin =
11 | "io.realm.kotlin:gradle-plugin:${Versions.Project.Realm_Gradle_Plugin_version}"
12 | const val MokoResourceGenerator = Dependencies.KMM.MOKO.resources_generator
13 | }
--------------------------------------------------------------------------------
/buildSrc/src/main/java/Repositories.kt:
--------------------------------------------------------------------------------
1 | object Repositories {
2 | object Maven{
3 | const val Maven2 = "https://repo1.maven.org/maven2/"
4 | const val Kotlinx = "https://kotlin.bintray.com/kotlinx"
5 | const val KodeinDI = "https://dl.bintray.com/kodein-framework/Kodein-DI/"
6 | const val Koin = "https://dl.bintray.com/ekito/koin"
7 | const val Jitpack = "https://jitpack.io"
8 | const val MultiplatformSettings = "https://dl.bintray.com/russhwolf/multiplatform-settings"
9 | const val Commonsware = "https://s3.amazonaws.com/repo.commonsware.com"
10 | const val AbtsoftwareScichart = "https://www.myget.org/F/abtsoftware/maven"
11 | const val Arcgis = "https://esri.bintray.com/arcgis"
12 | const val MEventBus = "https://dl.bintray.com/florent37/maven"
13 | }
14 |
15 | }
--------------------------------------------------------------------------------
/gradle.properties:
--------------------------------------------------------------------------------
1 | #org.gradle.jvmargs=-Xms512m -Xmx2048m -XX:+CMSClassUnloadingEnabled
2 | org.gradle.caching=true
3 |
4 | #Gradle
5 | org.gradle.jvmargs=-Xmx2048M -Dkotlin.daemon.jvm.options\="-Xmx2048M"
6 |
7 | #Kotlin
8 | kotlin.code.style=official
9 | kotlin.native.binary.memoryModel=experimental
10 | kotlin.native.binary.freezing=disabled
11 |
12 | #Android
13 | android.useAndroidX=true
14 |
15 | #MPP
16 | kotlin.mpp.enableGranularSourceSetsMetadata=true
17 | kotlin.native.enableDependencyPropagation=false
18 | kotlin.mpp.enableCInteropCommonization=true
--------------------------------------------------------------------------------
/gradle/wrapper/gradle-wrapper.jar:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jittya/KMMT/2faa5eb1fdd785cc1b07f03b9c186af1a3acfc40/gradle/wrapper/gradle-wrapper.jar
--------------------------------------------------------------------------------
/gradle/wrapper/gradle-wrapper.properties:
--------------------------------------------------------------------------------
1 | distributionBase=GRADLE_USER_HOME
2 | distributionPath=wrapper/dists
3 | distributionUrl=https\://services.gradle.org/distributions/gradle-7.4-bin.zip
4 | zipStoreBase=GRADLE_USER_HOME
5 | zipStorePath=wrapper/dists
6 |
--------------------------------------------------------------------------------
/iOS_App/KMMT App/Assets.xcassets/AccentColor.colorset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "colors" : [
3 | {
4 | "idiom" : "universal"
5 | }
6 | ],
7 | "info" : {
8 | "author" : "xcode",
9 | "version" : 1
10 | }
11 | }
12 |
--------------------------------------------------------------------------------
/iOS_App/KMMT App/Assets.xcassets/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "info" : {
3 | "author" : "xcode",
4 | "version" : 1
5 | }
6 | }
7 |
--------------------------------------------------------------------------------
/iOS_App/KMMT App/Base.lproj/LaunchScreen.storyboard:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
--------------------------------------------------------------------------------
/iOS_App/KMMT App/core/view/extensions/UIControlExtensions.swift:
--------------------------------------------------------------------------------
1 | //
2 | // ExtensionsTest.swift
3 | // iosApp
4 | //
5 | // Created by Innovateq on 14/04/2021.
6 | //
7 |
8 | import Foundation
9 | import UIKit
10 | import shared
11 |
12 | extension UIControl {
13 |
14 | func addActionOnPress(handler: @escaping () -> KotlinUnit) {
15 | self.addAction(UIAction(
16 | title: "",
17 | image: nil,
18 | handler: { _ in
19 | handler()
20 | }
21 | ),for: .touchUpInside)
22 | }
23 | }
24 |
--------------------------------------------------------------------------------
/iOS_App/KMMT App/core/view/extensions/UIFontExtensions.swift:
--------------------------------------------------------------------------------
1 | //
2 | // UIFontExtensions.swift
3 | // KMMTApp
4 | //
5 | // Created by Innovateq on 30/04/2021.
6 | //
7 |
8 | import UIKit
9 |
10 |
11 | extension UIFont {
12 | var bold: UIFont {
13 | return with(.traitBold)
14 | }
15 |
16 | var italic: UIFont {
17 | return with(.traitItalic)
18 | }
19 |
20 | var boldItalic: UIFont {
21 | return with([.traitBold, .traitItalic])
22 | }
23 |
24 |
25 |
26 | func with(_ traits: UIFontDescriptor.SymbolicTraits...) -> UIFont {
27 | guard let descriptor = self.fontDescriptor.withSymbolicTraits(UIFontDescriptor.SymbolicTraits(traits).union(self.fontDescriptor.symbolicTraits)) else {
28 | return self
29 | }
30 | return UIFont(descriptor: descriptor, size: 0)
31 | }
32 |
33 | func without(_ traits: UIFontDescriptor.SymbolicTraits...) -> UIFont {
34 | guard let descriptor = self.fontDescriptor.withSymbolicTraits(self.fontDescriptor.symbolicTraits.subtracting(UIFontDescriptor.SymbolicTraits(traits))) else {
35 | return self
36 | }
37 | return UIFont(descriptor: descriptor, size: 0)
38 | }
39 | }
40 |
--------------------------------------------------------------------------------
/iOS_App/KMMT App/core/view/extensions/UITextFieldControl.swift:
--------------------------------------------------------------------------------
1 | //
2 | // UITextFieldControl.swift
3 | // KMMTApp
4 | //
5 | // Created by JittyKunju on 04/11/21.
6 | //
7 |
8 | import Foundation
9 | import UIKit
10 | import shared
11 |
12 | extension UITextField {
13 |
14 |
15 | func onTextChanged(handler: @escaping (String) -> KotlinUnit) {
16 | self.addAction(UIAction(
17 | title: "",
18 | image: nil,
19 | handler: { _ in
20 | handler(self.text!)
21 | }
22 | ),for: .editingChanged)
23 | }
24 |
25 | }
26 |
--------------------------------------------------------------------------------
/iOS_App/KMMT App/demo/home/HomeViewController.swift:
--------------------------------------------------------------------------------
1 | //
2 | // HomeViewController.swift
3 | // KMMTApp
4 | //
5 | // Created by Innovateq on 29/04/2021.
6 | //
7 |
8 | import UIKit
9 | import shared
10 | import Foundation
11 |
12 | class HomeViewController: KMMUIViewController,HomeView {
13 | func navigateToKampKitDemoPage() {
14 | // self.dismiss(animated: true, completion: nil);
15 | openViewController(newViewControllerName: "BreedViewController")
16 | }
17 |
18 | func setKampKitBtnClickAction(btnClickAction: @escaping () -> KotlinUnit) {
19 | kampKitDemoBtn.addActionOnPress(handler: btnClickAction)
20 | }
21 |
22 | func setKampKitPageButtonLabel(btnLabel: String) {
23 | kampKitDemoBtn.setTitle(btnLabel, for: UIControl.State.normal)
24 | }
25 |
26 |
27 | var postList: [PostModel] = []
28 |
29 | override func viewDidLoad() {
30 | super.viewDidLoad()
31 | postTableView.dataSource = self
32 |
33 | }
34 |
35 | func showUsername(username: String) {
36 | usernameLabel.text=username
37 | }
38 |
39 |
40 | func showPostList(postList: [PostModel]) {
41 | self.postList = postList
42 | postTableView.reloadData()
43 | }
44 |
45 |
46 | @IBOutlet weak var usernameLabel: UILabel!
47 | @IBOutlet weak var postTableView: UITableView!
48 | @IBOutlet weak var kampKitDemoBtn: UIButton!
49 |
50 | override func initializePresenter() -> BasePresenter {
51 | return HomePresenter(view: self).getPresenter()
52 | }
53 |
54 | }
55 |
56 |
--------------------------------------------------------------------------------
/iOS_App/KMMT App/demo/home/postTableView/PostCell.swift:
--------------------------------------------------------------------------------
1 | //
2 | // PostCell.swift
3 | // KMMTApp
4 | //
5 | // Created by Innovateq on 30/04/2021.
6 | //
7 |
8 | import UIKit
9 | import shared
10 |
11 | class PostCell: UITableViewCell {
12 |
13 | var post: PostModel?
14 |
15 | @IBOutlet weak var postName: UILabel!
16 | @IBOutlet weak var postEmail: UILabel!
17 | @IBOutlet weak var postDesLbl: UILabel!
18 |
19 | func bindData(_ post: PostModel) {
20 | self.post = post
21 | postDesLbl.text = post.body
22 | postName.text = post.name
23 | postEmail.text = post.email
24 | postEmail.font = postEmail.font.italic
25 | }
26 | }
27 |
--------------------------------------------------------------------------------
/iOS_App/KMMT App/demo/home/postTableView/PostTableViewDataSource.swift:
--------------------------------------------------------------------------------
1 | //
2 | // PostTableViewDataSource.swift
3 | // KMMTApp
4 | //
5 | // Created by Innovateq on 30/04/2021.
6 | //
7 |
8 | import UIKit
9 | import shared
10 |
11 | extension HomeViewController : UITableViewDataSource {
12 |
13 |
14 | func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
15 | return postList.count
16 | }
17 |
18 | func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
19 | let cell = tableView.dequeueReusableCell(withIdentifier: "PostCell", for: indexPath)
20 | if let postCell = cell as? PostCell {
21 | let post = postList[indexPath.row]
22 | postCell.bindData(post)
23 | }
24 | return cell
25 | }
26 |
27 | }
28 |
--------------------------------------------------------------------------------
/iOS_App/KMMT App/demo/kampkit/breedTableView/BreedCell.swift:
--------------------------------------------------------------------------------
1 | //
2 | // BreedCell.swift
3 | // KMMTApp
4 | //
5 | // Created by Innovateq on 03/05/2021.
6 | //
7 |
8 |
9 | import UIKit
10 | import shared
11 |
12 | protocol BreedCellDelegate: AnyObject {
13 | func toggleFavorite(_ breed: Breed)
14 | }
15 |
16 | class BreedCell: UITableViewCell {
17 | @IBOutlet weak var nameLabel: UILabel!
18 | @IBOutlet weak var favoriteButton: UIButton!
19 | var breed: Breed?
20 | weak var delegate: BreedCellDelegate?
21 |
22 | func bindData(_ breed: Breed) {
23 | self.breed = breed
24 | nameLabel.text = breed.name
25 |
26 | let imageName = (breed.favorite) ? "heart.fill" : "heart"
27 | favoriteButton.setImage(UIImage(systemName: imageName), for: .normal)
28 | }
29 | @IBAction func favoriteButtonPressed(_ sender: Any) {
30 | if let breed = breed {
31 | delegate?.toggleFavorite(breed)
32 | }
33 | }
34 | }
35 |
--------------------------------------------------------------------------------
/iOS_App/KMMT App/demo/kampkit/breedTableView/BreedTableViewDataSource.swift:
--------------------------------------------------------------------------------
1 | //
2 | // BreedTableViewDataSource.swift
3 | // KMMTApp
4 | //
5 | // Created by Innovateq on 03/05/2021.
6 | //
7 |
8 | import UIKit
9 | import shared
10 |
11 | extension BreedViewController : UITableViewDataSource,BreedCellDelegate{
12 | func toggleFavorite(_ breed: Breed) {
13 | if(invertBreedFavouriteState != nil)
14 | {
15 | invertBreedFavouriteState!(breed)
16 | }
17 | }
18 |
19 | func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
20 | return breedList.count
21 | }
22 |
23 | func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
24 | let cell = tableView.dequeueReusableCell(withIdentifier: "BreedCell", for: indexPath)
25 | if let breedCell = cell as? BreedCell {
26 | let breed = breedList[indexPath.row]
27 | breedCell.bindData(breed)
28 | breedCell.delegate=self
29 | }
30 | return cell
31 | }
32 |
33 | }
34 |
35 |
--------------------------------------------------------------------------------
/iOS_App/KMMT App/demo/tvshows/WelcomeViewController.swift:
--------------------------------------------------------------------------------
1 | //
2 | // ViewController.swift
3 | // KMMT App
4 | //
5 | // Created by Jitty on 26/04/2021.
6 | //
7 |
8 | import UIKit
9 | import shared
10 |
11 | class WelcomeViewController: KMMUIViewController ,WelcomeView {
12 |
13 |
14 | override func setPageTitle(title: String) {
15 | self.title=title
16 | }
17 |
18 | @IBOutlet weak var textlabel: UILabel!
19 | @IBOutlet weak var welcomeBtn: UIButton!
20 |
21 | override func viewDidLoad() {
22 | super.viewDidLoad()
23 | // Do any additional setup after loading the view.
24 | }
25 |
26 | //Generated Methods from WelcomeView
27 | func navigateToTVShowsPage() {
28 | openViewController(newViewControllerName: "TVShowsViewController")
29 | }
30 |
31 | func setTVShowsButtonClickAction(onLoginClick: @escaping () -> KotlinUnit) {
32 | welcomeBtn.addActionOnPress(handler: onLoginClick)
33 | }
34 |
35 | func setTVShowsButtonLabel(tvShowsBtnLbl: String) {
36 | welcomeBtn.setTitle(tvShowsBtnLbl, for: UIControl.State.normal)
37 | }
38 |
39 | func setWelcomePageLabel(msg: String) {
40 | textlabel.text=msg
41 | }
42 |
43 | //Generated Methods from KMMUIViewController
44 | override func initializePresenter() -> BasePresenter {
45 | return WelcomePresenter(view: self).getPresenter()
46 | }
47 |
48 | }
49 |
50 |
--------------------------------------------------------------------------------
/iOS_App/KMMT App/demo/tvshows/showsearch/TVShowsViewController.swift:
--------------------------------------------------------------------------------
1 | //
2 | // HomeViewController.swift
3 | // KMMTApp
4 | //
5 | // Created by Jitty on 29/04/2021.
6 | //
7 |
8 | import UIKit
9 | import shared
10 | import Foundation
11 |
12 | class TVShowsViewController: KMMUIViewController,TVShowsSearchView {
13 |
14 |
15 | override func setPageTitle(title: String) {
16 | }
17 |
18 | var showList: [TVShowInfo] = []
19 |
20 | override func viewDidLoad() {
21 | super.viewDidLoad()
22 | postTableView.dataSource = self
23 |
24 | }
25 |
26 | @IBOutlet weak var searchTF: UITextField!
27 | @IBOutlet weak var postTableView: UITableView!
28 |
29 | override func initializePresenter() -> BasePresenter {
30 | return TVShowsSearchPresenter.companion.getTVShowsSearchPresenterInstance(view: self).getPresenter()
31 | }
32 |
33 | func setSearchQueryChangeListener(onSearchQueryStringChanged: @escaping (String) -> KotlinUnit) {
34 | searchTF.onTextChanged(handler: onSearchQueryStringChanged)
35 | }
36 |
37 | func showTVShowsList(tvShowList: [TVShowInfo]) {
38 | self.showList = tvShowList
39 | postTableView.reloadData()
40 | }
41 |
42 | }
43 |
44 |
--------------------------------------------------------------------------------
/iOS_App/KMMT App/demo/tvshows/showsearch/showresultTableView/ShowCell.swift:
--------------------------------------------------------------------------------
1 | //
2 | // PostCell.swift
3 | // KMMTApp
4 | //
5 | // Created by Jitty on 30/04/2021.
6 | //
7 |
8 | import UIKit
9 | import shared
10 |
11 | class ShowCell: UITableViewCell {
12 |
13 | var tvShow: TVShowInfo?
14 |
15 | @IBOutlet weak var showName: UILabel!
16 | @IBOutlet weak var showLanguage: UILabel!
17 | @IBOutlet weak var showSummary: UILabel!
18 |
19 | func bindData(_ post: TVShowInfo) {
20 | self.tvShow = post
21 | showSummary.text = post.summary
22 | showName.text = post.name
23 | showLanguage.text = post.language
24 | showLanguage.font = showLanguage.font.italic
25 | }
26 | }
27 |
--------------------------------------------------------------------------------
/iOS_App/KMMT App/demo/tvshows/showsearch/showresultTableView/ShowTableViewDataSource.swift:
--------------------------------------------------------------------------------
1 | //
2 | // PostTableViewDataSource.swift
3 | // KMMTApp
4 | //
5 | // Created by Jitty on 30/04/2021.
6 | //
7 |
8 | import UIKit
9 | import shared
10 |
11 | extension TVShowsViewController : UITableViewDataSource {
12 |
13 |
14 | func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
15 | return showList.count
16 | }
17 |
18 | func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
19 | let cell = tableView.dequeueReusableCell(withIdentifier: "ShowCell", for: indexPath)
20 | if let showCell = cell as? ShowCell {
21 | let show = showList[indexPath.row]
22 | showCell.bindData(show)
23 | }
24 | return cell
25 | }
26 |
27 | }
28 |
--------------------------------------------------------------------------------
/iOS_App/KMMT AppTests/Info.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | CFBundleDevelopmentRegion
6 | $(DEVELOPMENT_LANGUAGE)
7 | CFBundleExecutable
8 | $(EXECUTABLE_NAME)
9 | CFBundleIdentifier
10 | $(PRODUCT_BUNDLE_IDENTIFIER)
11 | CFBundleInfoDictionaryVersion
12 | 6.0
13 | CFBundleName
14 | $(PRODUCT_NAME)
15 | CFBundlePackageType
16 | $(PRODUCT_BUNDLE_PACKAGE_TYPE)
17 | CFBundleShortVersionString
18 | 1.0
19 | CFBundleVersion
20 | 1
21 |
22 |
23 |
--------------------------------------------------------------------------------
/iOS_App/KMMT AppTests/KMMT_AppTests.swift:
--------------------------------------------------------------------------------
1 | //
2 | // KMMT_AppTests.swift
3 | // KMMT AppTests
4 | //
5 | // Created by Innovateq on 26/04/2021.
6 | //
7 |
8 | import XCTest
9 | @testable import KMMT_App
10 |
11 | class KMMT_AppTests: XCTestCase {
12 |
13 | override func setUpWithError() throws {
14 | // Put setup code here. This method is called before the invocation of each test method in the class.
15 | }
16 |
17 | override func tearDownWithError() throws {
18 | // Put teardown code here. This method is called after the invocation of each test method in the class.
19 | }
20 |
21 | func testExample() throws {
22 | // This is an example of a functional test case.
23 | // Use XCTAssert and related functions to verify your tests produce the correct results.
24 | }
25 |
26 | func testPerformanceExample() throws {
27 | // This is an example of a performance test case.
28 | self.measure {
29 | // Put the code you want to measure the time of here.
30 | }
31 | }
32 |
33 | }
34 |
--------------------------------------------------------------------------------
/iOS_App/KMMT AppUITests/Info.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | CFBundleDevelopmentRegion
6 | $(DEVELOPMENT_LANGUAGE)
7 | CFBundleExecutable
8 | $(EXECUTABLE_NAME)
9 | CFBundleIdentifier
10 | $(PRODUCT_BUNDLE_IDENTIFIER)
11 | CFBundleInfoDictionaryVersion
12 | 6.0
13 | CFBundleName
14 | $(PRODUCT_NAME)
15 | CFBundlePackageType
16 | $(PRODUCT_BUNDLE_PACKAGE_TYPE)
17 | CFBundleShortVersionString
18 | 1.0
19 | CFBundleVersion
20 | 1
21 |
22 |
23 |
--------------------------------------------------------------------------------
/iOS_App/KMMT AppUITests/KMMT_AppUITests.swift:
--------------------------------------------------------------------------------
1 | //
2 | // KMMT_AppUITests.swift
3 | // KMMT AppUITests
4 | //
5 | // Created by Innovateq on 26/04/2021.
6 | //
7 |
8 | import XCTest
9 |
10 | class KMMT_AppUITests: XCTestCase {
11 |
12 | override func setUpWithError() throws {
13 | // Put setup code here. This method is called before the invocation of each test method in the class.
14 |
15 | // In UI tests it is usually best to stop immediately when a failure occurs.
16 | continueAfterFailure = false
17 |
18 | // In UI tests it’s important to set the initial state - such as interface orientation - required for your tests before they run. The setUp method is a good place to do this.
19 | }
20 |
21 | override func tearDownWithError() throws {
22 | // Put teardown code here. This method is called after the invocation of each test method in the class.
23 | }
24 |
25 | func testExample() throws {
26 | // UI tests must launch the application that they test.
27 | let app = XCUIApplication()
28 | app.launch()
29 |
30 | // Use recording to get started writing UI tests.
31 | // Use XCTAssert and related functions to verify your tests produce the correct results.
32 | }
33 |
34 | func testLaunchPerformance() throws {
35 | if #available(macOS 10.15, iOS 13.0, tvOS 13.0, *) {
36 | // This measures how long it takes to launch your application.
37 | measure(metrics: [XCTApplicationLaunchMetric()]) {
38 | XCUIApplication().launch()
39 | }
40 | }
41 | }
42 | }
43 |
--------------------------------------------------------------------------------
/iOS_App/KMMTApp.xcodeproj/project.xcworkspace/contents.xcworkspacedata:
--------------------------------------------------------------------------------
1 |
2 |
4 |
6 |
7 |
8 |
--------------------------------------------------------------------------------
/iOS_App/KMMTApp.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | IDEDidComputeMac32BitWarning
6 |
7 |
8 |
9 |
--------------------------------------------------------------------------------
/iOS_App/KMMTApp.xcodeproj/project.xcworkspace/xcuserdata/innovateq.xcuserdatad/UserInterfaceState.xcuserstate:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jittya/KMMT/2faa5eb1fdd785cc1b07f03b9c186af1a3acfc40/iOS_App/KMMTApp.xcodeproj/project.xcworkspace/xcuserdata/innovateq.xcuserdatad/UserInterfaceState.xcuserstate
--------------------------------------------------------------------------------
/iOS_App/KMMTApp.xcodeproj/xcuserdata/innovateq.xcuserdatad/xcschemes/xcschememanagement.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | SchemeUserState
6 |
7 | KMMT App.xcscheme_^#shared#^_
8 |
9 | orderHint
10 | 4
11 |
12 | KMMTApp.xcscheme_^#shared#^_
13 |
14 | orderHint
15 | 4
16 |
17 |
18 |
19 |
20 |
--------------------------------------------------------------------------------
/iOS_App/KMMTApp.xcodeproj/xcuserdata/jittyandiyan.xcuserdatad/xcschemes/xcschememanagement.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | SchemeUserState
6 |
7 | KMMTApp.xcscheme_^#shared#^_
8 |
9 | orderHint
10 | 4
11 |
12 |
13 |
14 |
15 |
--------------------------------------------------------------------------------
/iOS_App/KMMTApp.xcworkspace/contents.xcworkspacedata:
--------------------------------------------------------------------------------
1 |
2 |
4 |
7 |
9 |
10 |
12 |
13 |
14 |
16 |
17 |
19 |
20 |
21 |
--------------------------------------------------------------------------------
/iOS_App/KMMTApp.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | IDEDidComputeMac32BitWarning
6 |
7 |
8 |
9 |
--------------------------------------------------------------------------------
/iOS_App/KMMTApp.xcworkspace/xcuserdata/jittyandiyan.xcuserdatad/UserInterfaceState.xcuserstate:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jittya/KMMT/2faa5eb1fdd785cc1b07f03b9c186af1a3acfc40/iOS_App/KMMTApp.xcworkspace/xcuserdata/jittyandiyan.xcuserdatad/UserInterfaceState.xcuserstate
--------------------------------------------------------------------------------
/iOS_App/Podfile:
--------------------------------------------------------------------------------
1 | target 'KMMTApp' do
2 | # Comment the next line if you don't want to use dynamic frameworks
3 | use_frameworks!
4 | platform :ios, '14.1'
5 | pod 'kmmtshared', :path => '../kmmtshared'
6 |
7 | end
8 |
--------------------------------------------------------------------------------
/iOS_App/Podfile.lock:
--------------------------------------------------------------------------------
1 | PODS:
2 | - kmmtshared (0.1.1.21.4.26):
3 | - Mixpanel (~> 4.2.0)
4 | - UXCam (~> 3.4.1)
5 | - Mixpanel (4.2.0)
6 | - UXCam (3.4.1)
7 |
8 | DEPENDENCIES:
9 | - kmmtshared (from `../kmmtshared`)
10 |
11 | SPEC REPOS:
12 | trunk:
13 | - Mixpanel
14 | - UXCam
15 |
16 | EXTERNAL SOURCES:
17 | kmmtshared:
18 | :path: "../kmmtshared"
19 |
20 | SPEC CHECKSUMS:
21 | kmmtshared: f69809ba308e96dac6b34bc35fabda1c89853e6d
22 | Mixpanel: 10a8acdddfa4026b51a69c82ed0d573cc1e70120
23 | UXCam: eda9b3c43b59508bbb241d2c0a04e35df6856872
24 |
25 | PODFILE CHECKSUM: 0997650e4f3cf515ad75c7936f38f0e1f17eaf2b
26 |
27 | COCOAPODS: 1.11.3
28 |
--------------------------------------------------------------------------------
/iOS_App/Pods/Local Podspecs/kmmtshared.podspec.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "kmmtshared",
3 | "version": "0.1.1.21.4.26",
4 | "homepage": "https://github.com/jittya/KMMT",
5 | "source": {
6 | "http": ""
7 | },
8 | "authors": "",
9 | "license": "",
10 | "summary": "KMMT shared module. This module is the central module which connect all other kmm submodules",
11 | "vendored_frameworks": "build/cocoapods/framework/shared.framework",
12 | "libraries": "c++",
13 | "platforms": {
14 | "ios": "14.1"
15 | },
16 | "dependencies": {
17 | "Mixpanel": [
18 | "~> 4.2.0"
19 | ],
20 | "UXCam": [
21 | "~> 3.4.1"
22 | ]
23 | },
24 | "pod_target_xcconfig": {
25 | "KOTLIN_PROJECT_PATH": ":kmmtshared",
26 | "PRODUCT_MODULE_NAME": "shared"
27 | },
28 | "script_phases": [
29 | {
30 | "name": "Build kmmtshared",
31 | "execution_position": "before_compile",
32 | "shell_path": "/bin/sh",
33 | "script": " if [ \"YES\" = \"$COCOAPODS_SKIP_KOTLIN_BUILD\" ]; then\n echo \"Skipping Gradle build task invocation due to COCOAPODS_SKIP_KOTLIN_BUILD environment variable set to \"YES\"\"\n exit 0\n fi\n set -ev\n REPO_ROOT=\"$PODS_TARGET_SRCROOT\"\n \"$REPO_ROOT/../gradlew\" -p \"$REPO_ROOT\" $KOTLIN_PROJECT_PATH:syncFramework -Pkotlin.native.cocoapods.platform=$PLATFORM_NAME -Pkotlin.native.cocoapods.archs=\"$ARCHS\" -Pkotlin.native.cocoapods.configuration=\"$CONFIGURATION\"\n"
34 | }
35 | ]
36 | }
37 |
--------------------------------------------------------------------------------
/iOS_App/Pods/Local Podspecs/presenter.podspec.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "presenter",
3 | "version": "0.1.1.21.4.26",
4 | "homepage": "https://github.com/jittya/KMMT",
5 | "source": {
6 | "http": ""
7 | },
8 | "authors": "",
9 | "license": "",
10 | "summary": "KMMT shared module. This module is the central module which connect all other kmm submodules",
11 | "vendored_frameworks": "build/cocoapods/framework/shared.framework",
12 | "libraries": "c++",
13 | "platforms": {
14 | "ios": "14.1"
15 | },
16 | "dependencies": {
17 | "Mixpanel": [
18 | "~> 4.2.0"
19 | ],
20 | "UXCam": [
21 | "~> 3.4.1"
22 | ]
23 | },
24 | "pod_target_xcconfig": {
25 | "KOTLIN_PROJECT_PATH": ":presenter",
26 | "PRODUCT_MODULE_NAME": "shared"
27 | },
28 | "script_phases": [
29 | {
30 | "name": "Build presenter",
31 | "execution_position": "before_compile",
32 | "shell_path": "/bin/sh",
33 | "script": " if [ \"YES\" = \"$COCOAPODS_SKIP_KOTLIN_BUILD\" ]; then\n echo \"Skipping Gradle build task invocation due to COCOAPODS_SKIP_KOTLIN_BUILD environment variable set to \"YES\"\"\n exit 0\n fi\n set -ev\n REPO_ROOT=\"$PODS_TARGET_SRCROOT\"\n \"$REPO_ROOT/../gradlew\" -p \"$REPO_ROOT\" $KOTLIN_PROJECT_PATH:syncFramework -Pkotlin.native.cocoapods.platform=$PLATFORM_NAME -Pkotlin.native.cocoapods.archs=\"$ARCHS\" -Pkotlin.native.cocoapods.configuration=\"$CONFIGURATION\"\n"
34 | }
35 | ]
36 | }
37 |
--------------------------------------------------------------------------------
/iOS_App/Pods/Local Podspecs/shared.podspec.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "shared",
3 | "version": "0.1.1.21.4.26",
4 | "homepage": "https://github.com/jittya/KMMT",
5 | "source": {
6 | "http": ""
7 | },
8 | "authors": "",
9 | "license": "",
10 | "summary": "KMMT shared module. This module is the central module which connect all other kmm submodules",
11 | "vendored_frameworks": "build/cocoapods/framework/shared.framework",
12 | "libraries": "c++",
13 | "platforms": {
14 | "ios": "14.1"
15 | },
16 | "pod_target_xcconfig": {
17 | "KOTLIN_PROJECT_PATH": ":shared",
18 | "PRODUCT_MODULE_NAME": "shared"
19 | },
20 | "script_phases": [
21 | {
22 | "name": "Build shared",
23 | "execution_position": "before_compile",
24 | "shell_path": "/bin/sh",
25 | "script": " if [ \"YES\" = \"$COCOAPODS_SKIP_KOTLIN_BUILD\" ]; then\n echo \"Skipping Gradle build task invocation due to COCOAPODS_SKIP_KOTLIN_BUILD environment variable set to \"YES\"\"\n exit 0\n fi\n set -ev\n REPO_ROOT=\"$PODS_TARGET_SRCROOT\"\n \"$REPO_ROOT/../gradlew\" -p \"$REPO_ROOT\" $KOTLIN_PROJECT_PATH:syncFramework -Pkotlin.native.cocoapods.platform=$PLATFORM_NAME -Pkotlin.native.cocoapods.archs=\"$ARCHS\" -Pkotlin.native.cocoapods.configuration=\"$CONFIGURATION\"\n"
26 | }
27 | ]
28 | }
29 |
--------------------------------------------------------------------------------
/iOS_App/Pods/Manifest.lock:
--------------------------------------------------------------------------------
1 | PODS:
2 | - kmmtshared (0.1.1.21.4.26):
3 | - Mixpanel (~> 4.2.0)
4 | - UXCam (~> 3.4.1)
5 | - Mixpanel (4.2.0)
6 | - UXCam (3.4.1)
7 |
8 | DEPENDENCIES:
9 | - kmmtshared (from `../kmmtshared`)
10 |
11 | SPEC REPOS:
12 | trunk:
13 | - Mixpanel
14 | - UXCam
15 |
16 | EXTERNAL SOURCES:
17 | kmmtshared:
18 | :path: "../kmmtshared"
19 |
20 | SPEC CHECKSUMS:
21 | kmmtshared: f69809ba308e96dac6b34bc35fabda1c89853e6d
22 | Mixpanel: 10a8acdddfa4026b51a69c82ed0d573cc1e70120
23 | UXCam: eda9b3c43b59508bbb241d2c0a04e35df6856872
24 |
25 | PODFILE CHECKSUM: 0997650e4f3cf515ad75c7936f38f0e1f17eaf2b
26 |
27 | COCOAPODS: 1.11.3
28 |
--------------------------------------------------------------------------------
/iOS_App/Pods/Mixpanel/Sources/AutomaticEvents.h:
--------------------------------------------------------------------------------
1 | //
2 | // AutomaticEvents.h
3 | // Mixpanel
4 | //
5 | // Copyright © Mixpanel. All rights reserved.
6 | //
7 |
8 | #if TARGET_OS_IOS
9 | #import
10 | #import "MixpanelPeople.h"
11 |
12 |
13 | @protocol TrackDelegate
14 | - (void)track:(NSString *)event properties:(NSDictionary *)properties;
15 | @end
16 |
17 | @interface AutomaticEvents: NSObject
18 | @property (atomic, weak) id delegate;
19 | @property (atomic, assign) UInt64 minimumSessionDuration;
20 | @property (atomic, assign) UInt64 maximumSessionDuration;
21 | - (void)initializeEvents:(MixpanelPeople *)peopleInstance apiToken:(NSString *)apiToken;
22 |
23 | @end
24 |
25 | #endif
26 |
--------------------------------------------------------------------------------
/iOS_App/Pods/Mixpanel/Sources/MPDB.h:
--------------------------------------------------------------------------------
1 | //
2 | // MPDB.h
3 | // Mixpanel
4 | //
5 | // Copyright © Mixpanel. All rights reserved.
6 | //
7 |
8 | #import
9 |
10 | @interface MPDB : NSObject
11 |
12 | @property (nonatomic, readonly, copy) NSString *apiToken;
13 |
14 | - (instancetype)initWithToken:(NSString *)apiToken;
15 |
16 | - (void)open;
17 | - (void)close;
18 |
19 | - (void)insertRow:(NSString *)persistenceType data:(NSData *)data flag:(BOOL) flag;
20 | - (void)deleteRows:(NSString *)persistenceType ids:(NSArray *)ids isDeleteAll:(BOOL)isDeleteAll;
21 | - (void)updateRowsFlag:(NSString *)persistenceType newFlag:(BOOL)newFlag;
22 | - (NSArray *)readRows:(NSString *)persistenceType numRows:(NSInteger)numRows flag:(BOOL)flag;
23 |
24 | @end
25 |
--------------------------------------------------------------------------------
/iOS_App/Pods/Mixpanel/Sources/MPFoundation.h:
--------------------------------------------------------------------------------
1 | #import
2 |
3 | #if TARGET_OS_IPHONE
4 | #ifndef NSFoundationVersionNumber_iOS_9_0
5 | // support for Xcode 7.*
6 | #define NSFoundationVersionNumber_iOS_8_x_Max 1199
7 | #define NSFoundationVersionNumber_iOS_9_0 1240.1
8 | #define NSFoundationVersionNumber_iOS_9_x_Max 1299
9 | #endif
10 | #endif
11 |
--------------------------------------------------------------------------------
/iOS_App/Pods/Mixpanel/Sources/MPJSONHander.h:
--------------------------------------------------------------------------------
1 | //
2 | // JSONHander.h
3 | // Mixpanel
4 | //
5 | // Copyright © Mixpanel. All rights reserved.
6 | //
7 |
8 | #import
9 |
10 |
11 | @interface MPJSONHandler : NSObject
12 |
13 | + (NSString *)encodedJSONString:(id)data;
14 | + (NSData *)encodedJSONData:(id)data;
15 |
16 | @end
17 |
--------------------------------------------------------------------------------
/iOS_App/Pods/Mixpanel/Sources/MPLogger.m:
--------------------------------------------------------------------------------
1 | //
2 | // MPLogger.m
3 | // Mixpanel
4 | //
5 | // Copyright © Mixpanel. All rights reserved.
6 | //
7 |
8 | #import "MPLogger.h"
9 |
10 |
11 | @implementation MPLogger
12 |
13 | + (MPLogger *)sharedInstance
14 | {
15 | static MPLogger *sharedMPLogger = nil;
16 | static dispatch_once_t onceToken;
17 | dispatch_once(&onceToken, ^{
18 | sharedMPLogger = [[self alloc] init];
19 | sharedMPLogger.loggingEnabled = NO;
20 | });
21 | return sharedMPLogger;
22 | }
23 |
24 |
25 | @end
26 |
--------------------------------------------------------------------------------
/iOS_App/Pods/Mixpanel/Sources/MPNetwork.h:
--------------------------------------------------------------------------------
1 | //
2 | // MPNetwork.h
3 | // Mixpanel
4 | //
5 | // Copyright © Mixpanel. All rights reserved.
6 | //
7 |
8 | #import
9 |
10 | @class Mixpanel;
11 |
12 | typedef NS_ENUM(NSUInteger, MPNetworkEndpoint) {
13 | MPNetworkEndpointTrack,
14 | MPNetworkEndpointEngage,
15 | MPNetworkEndpointDecide,
16 | MPNetworkEndpointGroups
17 | };
18 |
19 | @interface MPNetwork : NSObject
20 |
21 | @property (nonatomic) BOOL shouldManageNetworkActivityIndicator;
22 | @property (nonatomic) BOOL useIPAddressForGeoLocation;
23 |
24 | - (instancetype)initWithServerURL:(NSURL *)serverURL mixpanel:(Mixpanel *)mixpanel;
25 |
26 | - (void)flushEventQueue:(NSArray *)events;
27 | - (void)flushPeopleQueue:(NSArray *)people;
28 | - (void)flushGroupsQueue:(NSArray *)groups;
29 |
30 | - (void)updateNetworkActivityIndicator:(BOOL)enabled;
31 |
32 | - (NSURLRequest *)buildGetRequestForEndpoint:(MPNetworkEndpoint)endpoint
33 | withQueryItems:(NSArray *)queryItems;
34 |
35 | - (NSURLRequest *)buildPostRequestForEndpoint:(MPNetworkEndpoint)endpoint
36 | withQueryItems:(NSArray *)queryItems
37 | andBody:(NSString *)body;
38 |
39 | @end
40 |
--------------------------------------------------------------------------------
/iOS_App/Pods/Mixpanel/Sources/MPNetworkPrivate.h:
--------------------------------------------------------------------------------
1 | //
2 | // MPNetworkPrivate.h
3 | // Mixpanel
4 | //
5 | // Copyright © Mixpanel. All rights reserved.
6 | //
7 |
8 | #import "MPNetwork.h"
9 |
10 | @interface MPNetwork ()
11 |
12 | @property (nonatomic, weak) Mixpanel *mixpanel;
13 | @property (nonatomic, strong) NSURL *serverURL;
14 |
15 | @property (nonatomic) NSTimeInterval requestsDisabledUntilTime;
16 | @property (nonatomic) NSUInteger consecutiveFailures;
17 |
18 | - (BOOL)handleNetworkResponse:(NSHTTPURLResponse *)response withError:(NSError *)error;
19 |
20 | + (NSTimeInterval)calculateBackOffTimeFromFailures:(NSUInteger)failureCount;
21 | + (NSTimeInterval)parseRetryAfterTime:(NSHTTPURLResponse *)response;
22 | + (BOOL)parseHTTPFailure:(NSHTTPURLResponse *)response withError:(NSError *)error;
23 |
24 | + (NSArray *)buildDecideQueryForProperties:(NSDictionary *)properties
25 | withDistinctID:(NSString *)distinctID
26 | andToken:(NSString *)token;
27 |
28 | - (NSURLRequest *)buildRequestForEndpoint:(NSString *)endpoint
29 | byHTTPMethod:(NSString *)method
30 | withQueryItems:(NSArray *)queryItems
31 | andBody:(NSString *)body;
32 |
33 | + (NSURLSession *)sharedURLSession;
34 |
35 | @end
36 |
--------------------------------------------------------------------------------
/iOS_App/Pods/Mixpanel/Sources/MixpanelExceptionHandler.h:
--------------------------------------------------------------------------------
1 | //
2 | // MixpanelExceptionHandler.h
3 | // HelloMixpanel
4 | //
5 | // Copyright (c) Mixpanel. All rights reserved.
6 | //
7 |
8 | #import
9 |
10 | @class Mixpanel;
11 |
12 | @interface MixpanelExceptionHandler : NSObject
13 |
14 | + (instancetype)sharedHandler;
15 | - (void)addMixpanelInstance:(Mixpanel *)instance;
16 | @end
17 |
--------------------------------------------------------------------------------
/iOS_App/Pods/Mixpanel/Sources/MixpanelGroupPrivate.h:
--------------------------------------------------------------------------------
1 | //
2 | // MixpanelGroupPrivate.h
3 | // Mixpanel
4 | //
5 | // Copyright © Mixpanel. All rights reserved.
6 | //
7 | #import "MixpanelType.h"
8 |
9 | @class Mixpanel;
10 |
11 | @interface MixpanelGroup ()
12 |
13 | @property (nonatomic, weak) Mixpanel *mixpanel;
14 | @property (nonatomic, copy) NSString *groupKey;
15 | @property (nonatomic, copy) id groupID;
16 |
17 | - (instancetype)init:(Mixpanel *)mixpanel groupKey:(NSString*)groupKey groupID:(id)groupID;
18 |
19 | @end
20 |
--------------------------------------------------------------------------------
/iOS_App/Pods/Mixpanel/Sources/MixpanelIdentity.h:
--------------------------------------------------------------------------------
1 | //
2 | // MixpanelIdentity.h
3 | // Mixpanel
4 | //
5 | // Copyright © Mixpanel. All rights reserved.
6 | //
7 |
8 | #import
9 |
10 |
11 | @interface MixpanelIdentity : NSObject
12 |
13 | @property (nonatomic, readonly, copy) NSString *distinctId;
14 | @property (nonatomic, readonly, copy) NSString *peopleDistinctId;
15 | @property (nonatomic, readonly, copy) NSString *anonymousId;
16 | @property (nonatomic, readonly, copy) NSString *userId;
17 | @property (nonatomic, readonly, copy) NSString *alias;
18 | @property (nonatomic, assign) BOOL hadPersistedDistinctId;
19 |
20 |
21 | - (instancetype)initWithDistinctId:(NSString *)distinctId
22 | peopleDistinctId:(NSString *)peopleDistinctId
23 | anonymousId:(NSString *)anonymousId
24 | userId:(NSString *)userId
25 | alias:(NSString *)alias
26 | hadPersistedDistinctId:(BOOL)hadPersistedDistinctId;
27 |
28 | @end
29 |
--------------------------------------------------------------------------------
/iOS_App/Pods/Mixpanel/Sources/MixpanelIdentity.m:
--------------------------------------------------------------------------------
1 | //
2 | // MixpanelIdentity.m
3 | // Mixpanel
4 | //
5 | // Copyright © Mixpanel. All rights reserved.
6 | //
7 |
8 | #import "MixpanelIdentity.h"
9 |
10 |
11 | @interface MixpanelIdentity()
12 |
13 | @property (nonatomic, readwrite, copy) NSString *distinctId;
14 | @property (nonatomic, readwrite, copy) NSString *peopleDistinctId;
15 | @property (nonatomic, readwrite, copy) NSString *anonymousId;
16 | @property (nonatomic, readwrite, copy) NSString *userId;
17 | @property (nonatomic, readwrite, copy) NSString *alias;
18 |
19 | @end
20 |
21 | @implementation MixpanelIdentity
22 |
23 | - (instancetype)initWithDistinctId:(NSString *)distinctId
24 | peopleDistinctId:(NSString *)peopleDistinctId
25 | anonymousId:(NSString *)anonymousId
26 | userId:(NSString *)userId
27 | alias:(NSString *)alias
28 | hadPersistedDistinctId:(BOOL)hadPersistedDistinctId
29 | {
30 | self = [super init];
31 | if (self) {
32 | self.distinctId = distinctId;
33 | self.peopleDistinctId = peopleDistinctId;
34 | self.anonymousId = anonymousId;
35 | self.userId = userId;
36 | self.alias = alias;
37 | self.hadPersistedDistinctId = hadPersistedDistinctId;
38 | }
39 | return self;
40 | }
41 |
42 | @end
43 |
--------------------------------------------------------------------------------
/iOS_App/Pods/Mixpanel/Sources/MixpanelPeoplePrivate.h:
--------------------------------------------------------------------------------
1 | //
2 | // MixpanelPeoplePrivate.h
3 | // Mixpanel
4 | //
5 | // Copyright © Mixpanel. All rights reserved.
6 | //
7 | #import
8 |
9 | @class Mixpanel;
10 |
11 | @interface MixpanelPeople ()
12 |
13 | @property (nonatomic, weak) Mixpanel *mixpanel;
14 | @property (nonatomic, copy) NSString *distinctId;
15 | @property (nonatomic, strong) NSDictionary *automaticPeopleProperties;
16 |
17 | - (instancetype)initWithMixpanel:(Mixpanel *)mixpanel;
18 | - (void)merge:(NSDictionary *)properties;
19 |
20 | @end
21 |
--------------------------------------------------------------------------------
/iOS_App/Pods/Mixpanel/Sources/MixpanelType.h:
--------------------------------------------------------------------------------
1 | //
2 | // MixpanelType.h
3 | // Mixpanel
4 | //
5 | // Copyright © Mixpanel. All rights reserved.
6 | //
7 |
8 | #import
9 |
10 | @protocol MixpanelType
11 |
12 | - (BOOL)equalToMixpanelType:(id)rhs;
13 |
14 | @end
15 |
16 | @interface NSString (MixpanelTypeCategory)
17 |
18 | @end
19 |
20 | @interface NSNumber (MixpanelTypeCategory)
21 |
22 | @end
23 |
24 | @interface NSArray (MixpanelTypeCategory)
25 |
26 | @end
27 |
28 | @interface NSDictionary (MixpanelTypeCategory)
29 |
30 | @end
31 |
32 | @interface NSDate (MixpanelTypeCategory)
33 |
34 | @end
35 |
36 | @interface NSURL (MixpanelTypeCategory)
37 |
38 | @end
39 |
--------------------------------------------------------------------------------
/iOS_App/Pods/Mixpanel/Sources/SessionMetadata.h:
--------------------------------------------------------------------------------
1 | //
2 | // SessionMetadata.h
3 | // Mixpanel
4 | //
5 | // Copyright © Mixpanel. All rights reserved.
6 | //
7 |
8 | #import
9 |
10 | @interface SessionMetadata : NSObject
11 |
12 | @property (nonatomic, readonly) uint64_t eventsCounter;
13 | @property (nonatomic, readonly) uint64_t peopleCounter;
14 | @property (nonatomic, readonly, copy) NSString *sessionID;
15 | @property (nonatomic, readonly) uint64_t sessionStartEpoch;
16 |
17 | - (instancetype)init;
18 | - (void)reset;
19 | - (NSDictionary *)toDictionaryForEvent:(BOOL)flag;
20 |
21 | @end
22 |
--------------------------------------------------------------------------------
/iOS_App/Pods/Pods.xcodeproj/xcuserdata/jittyandiyan.xcuserdatad/xcschemes/xcschememanagement.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | SchemeUserState
6 |
7 | Mixpanel.xcscheme
8 |
9 | isShown
10 |
11 | orderHint
12 | 0
13 |
14 | Pods-KMMTApp.xcscheme
15 |
16 | isShown
17 |
18 | orderHint
19 | 1
20 |
21 | UXCam.xcscheme
22 |
23 | isShown
24 |
25 | orderHint
26 | 3
27 |
28 | presenter.xcscheme
29 |
30 | isShown
31 |
32 | orderHint
33 | 2
34 |
35 |
36 | SuppressBuildableAutocreation
37 |
38 |
39 |
40 |
--------------------------------------------------------------------------------
/iOS_App/Pods/Target Support Files/Mixpanel/Mixpanel-Info.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | CFBundleDevelopmentRegion
6 | en
7 | CFBundleExecutable
8 | ${EXECUTABLE_NAME}
9 | CFBundleIdentifier
10 | ${PRODUCT_BUNDLE_IDENTIFIER}
11 | CFBundleInfoDictionaryVersion
12 | 6.0
13 | CFBundleName
14 | ${PRODUCT_NAME}
15 | CFBundlePackageType
16 | FMWK
17 | CFBundleShortVersionString
18 | 4.2.0
19 | CFBundleSignature
20 | ????
21 | CFBundleVersion
22 | ${CURRENT_PROJECT_VERSION}
23 | NSPrincipalClass
24 |
25 |
26 |
27 |
--------------------------------------------------------------------------------
/iOS_App/Pods/Target Support Files/Mixpanel/Mixpanel-dummy.m:
--------------------------------------------------------------------------------
1 | #import
2 | @interface PodsDummy_Mixpanel : NSObject
3 | @end
4 | @implementation PodsDummy_Mixpanel
5 | @end
6 |
--------------------------------------------------------------------------------
/iOS_App/Pods/Target Support Files/Mixpanel/Mixpanel-prefix.pch:
--------------------------------------------------------------------------------
1 | #ifdef __OBJC__
2 | #import
3 | #else
4 | #ifndef FOUNDATION_EXPORT
5 | #if defined(__cplusplus)
6 | #define FOUNDATION_EXPORT extern "C"
7 | #else
8 | #define FOUNDATION_EXPORT extern
9 | #endif
10 | #endif
11 | #endif
12 |
13 |
--------------------------------------------------------------------------------
/iOS_App/Pods/Target Support Files/Mixpanel/Mixpanel-umbrella.h:
--------------------------------------------------------------------------------
1 | #ifdef __OBJC__
2 | #import
3 | #else
4 | #ifndef FOUNDATION_EXPORT
5 | #if defined(__cplusplus)
6 | #define FOUNDATION_EXPORT extern "C"
7 | #else
8 | #define FOUNDATION_EXPORT extern
9 | #endif
10 | #endif
11 | #endif
12 |
13 | #import "Mixpanel.h"
14 | #import "MixpanelType.h"
15 | #import "MixpanelGroup.h"
16 | #import "MixpanelPeople.h"
17 |
18 | FOUNDATION_EXPORT double MixpanelVersionNumber;
19 | FOUNDATION_EXPORT const unsigned char MixpanelVersionString[];
20 |
21 |
--------------------------------------------------------------------------------
/iOS_App/Pods/Target Support Files/Mixpanel/Mixpanel.debug.xcconfig:
--------------------------------------------------------------------------------
1 | CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = NO
2 | CONFIGURATION_BUILD_DIR = ${PODS_CONFIGURATION_BUILD_DIR}/Mixpanel
3 | GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1
4 | OTHER_LDFLAGS = $(inherited) -l"icucore" -framework "Accelerate" -framework "CoreGraphics" -framework "CoreTelephony" -framework "Foundation" -framework "QuartzCore" -framework "StoreKit" -framework "SystemConfiguration" -framework "UIKit"
5 | PODS_BUILD_DIR = ${BUILD_DIR}
6 | PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)
7 | PODS_ROOT = ${SRCROOT}
8 | PODS_TARGET_SRCROOT = ${PODS_ROOT}/Mixpanel
9 | PODS_XCFRAMEWORKS_BUILD_DIR = $(PODS_CONFIGURATION_BUILD_DIR)/XCFrameworkIntermediates
10 | PRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier}
11 | SKIP_INSTALL = YES
12 | USE_RECURSIVE_SCRIPT_INPUTS_IN_SCRIPT_PHASES = YES
13 |
--------------------------------------------------------------------------------
/iOS_App/Pods/Target Support Files/Mixpanel/Mixpanel.modulemap:
--------------------------------------------------------------------------------
1 | framework module Mixpanel {
2 | umbrella header "Mixpanel-umbrella.h"
3 |
4 | export *
5 | module * { export * }
6 | }
7 |
--------------------------------------------------------------------------------
/iOS_App/Pods/Target Support Files/Mixpanel/Mixpanel.release.xcconfig:
--------------------------------------------------------------------------------
1 | CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = NO
2 | CONFIGURATION_BUILD_DIR = ${PODS_CONFIGURATION_BUILD_DIR}/Mixpanel
3 | GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1
4 | OTHER_LDFLAGS = $(inherited) -l"icucore" -framework "Accelerate" -framework "CoreGraphics" -framework "CoreTelephony" -framework "Foundation" -framework "QuartzCore" -framework "StoreKit" -framework "SystemConfiguration" -framework "UIKit"
5 | PODS_BUILD_DIR = ${BUILD_DIR}
6 | PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)
7 | PODS_ROOT = ${SRCROOT}
8 | PODS_TARGET_SRCROOT = ${PODS_ROOT}/Mixpanel
9 | PODS_XCFRAMEWORKS_BUILD_DIR = $(PODS_CONFIGURATION_BUILD_DIR)/XCFrameworkIntermediates
10 | PRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier}
11 | SKIP_INSTALL = YES
12 | USE_RECURSIVE_SCRIPT_INPUTS_IN_SCRIPT_PHASES = YES
13 |
--------------------------------------------------------------------------------
/iOS_App/Pods/Target Support Files/Pods-KMMTApp/Pods-KMMTApp-Info.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | CFBundleDevelopmentRegion
6 | en
7 | CFBundleExecutable
8 | ${EXECUTABLE_NAME}
9 | CFBundleIdentifier
10 | ${PRODUCT_BUNDLE_IDENTIFIER}
11 | CFBundleInfoDictionaryVersion
12 | 6.0
13 | CFBundleName
14 | ${PRODUCT_NAME}
15 | CFBundlePackageType
16 | FMWK
17 | CFBundleShortVersionString
18 | 1.0.0
19 | CFBundleSignature
20 | ????
21 | CFBundleVersion
22 | ${CURRENT_PROJECT_VERSION}
23 | NSPrincipalClass
24 |
25 |
26 |
27 |
--------------------------------------------------------------------------------
/iOS_App/Pods/Target Support Files/Pods-KMMTApp/Pods-KMMTApp-dummy.m:
--------------------------------------------------------------------------------
1 | #import
2 | @interface PodsDummy_Pods_KMMTApp : NSObject
3 | @end
4 | @implementation PodsDummy_Pods_KMMTApp
5 | @end
6 |
--------------------------------------------------------------------------------
/iOS_App/Pods/Target Support Files/Pods-KMMTApp/Pods-KMMTApp-frameworks-Debug-input-files.xcfilelist:
--------------------------------------------------------------------------------
1 | ${PODS_ROOT}/Target Support Files/Pods-KMMTApp/Pods-KMMTApp-frameworks.sh
2 | ${BUILT_PRODUCTS_DIR}/Mixpanel/Mixpanel.framework
--------------------------------------------------------------------------------
/iOS_App/Pods/Target Support Files/Pods-KMMTApp/Pods-KMMTApp-frameworks-Debug-output-files.xcfilelist:
--------------------------------------------------------------------------------
1 | ${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/Mixpanel.framework
--------------------------------------------------------------------------------
/iOS_App/Pods/Target Support Files/Pods-KMMTApp/Pods-KMMTApp-frameworks-Release-input-files.xcfilelist:
--------------------------------------------------------------------------------
1 | ${PODS_ROOT}/Target Support Files/Pods-KMMTApp/Pods-KMMTApp-frameworks.sh
2 | ${BUILT_PRODUCTS_DIR}/Mixpanel/Mixpanel.framework
--------------------------------------------------------------------------------
/iOS_App/Pods/Target Support Files/Pods-KMMTApp/Pods-KMMTApp-frameworks-Release-output-files.xcfilelist:
--------------------------------------------------------------------------------
1 | ${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/Mixpanel.framework
--------------------------------------------------------------------------------
/iOS_App/Pods/Target Support Files/Pods-KMMTApp/Pods-KMMTApp-umbrella.h:
--------------------------------------------------------------------------------
1 | #ifdef __OBJC__
2 | #import
3 | #else
4 | #ifndef FOUNDATION_EXPORT
5 | #if defined(__cplusplus)
6 | #define FOUNDATION_EXPORT extern "C"
7 | #else
8 | #define FOUNDATION_EXPORT extern
9 | #endif
10 | #endif
11 | #endif
12 |
13 |
14 | FOUNDATION_EXPORT double Pods_KMMTAppVersionNumber;
15 | FOUNDATION_EXPORT const unsigned char Pods_KMMTAppVersionString[];
16 |
17 |
--------------------------------------------------------------------------------
/iOS_App/Pods/Target Support Files/Pods-KMMTApp/Pods-KMMTApp.debug.xcconfig:
--------------------------------------------------------------------------------
1 | CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = NO
2 | FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/Mixpanel" "${PODS_ROOT}/../../kmmtshared/build/cocoapods/framework" "${PODS_ROOT}/UXCam" "${PODS_XCFRAMEWORKS_BUILD_DIR}/UXCam" "$(PODS_ROOT)/UXCam"
3 | GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1
4 | HEADER_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/Mixpanel/Mixpanel.framework/Headers"
5 | LD_RUNPATH_SEARCH_PATHS = $(inherited) '@executable_path/Frameworks' '@loader_path/Frameworks'
6 | OTHER_LDFLAGS = $(inherited) -ObjC -l"c++" -l"iconv" -l"icucore" -l"z" -framework "AVFoundation" -framework "Accelerate" -framework "CoreGraphics" -framework "CoreMedia" -framework "CoreTelephony" -framework "CoreVideo" -framework "Foundation" -framework "Mixpanel" -framework "MobileCoreServices" -framework "QuartzCore" -framework "Security" -framework "StoreKit" -framework "SystemConfiguration" -framework "UIKit" -framework "UXCam" -framework "WebKit" -framework "shared"
7 | PODS_BUILD_DIR = ${BUILD_DIR}
8 | PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)
9 | PODS_PODFILE_DIR_PATH = ${SRCROOT}/.
10 | PODS_ROOT = ${SRCROOT}/Pods
11 | PODS_XCFRAMEWORKS_BUILD_DIR = $(PODS_CONFIGURATION_BUILD_DIR)/XCFrameworkIntermediates
12 | USE_RECURSIVE_SCRIPT_INPUTS_IN_SCRIPT_PHASES = YES
13 |
--------------------------------------------------------------------------------
/iOS_App/Pods/Target Support Files/Pods-KMMTApp/Pods-KMMTApp.modulemap:
--------------------------------------------------------------------------------
1 | framework module Pods_KMMTApp {
2 | umbrella header "Pods-KMMTApp-umbrella.h"
3 |
4 | export *
5 | module * { export * }
6 | }
7 |
--------------------------------------------------------------------------------
/iOS_App/Pods/Target Support Files/Pods-KMMTApp/Pods-KMMTApp.release.xcconfig:
--------------------------------------------------------------------------------
1 | CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = NO
2 | FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/Mixpanel" "${PODS_ROOT}/../../kmmtshared/build/cocoapods/framework" "${PODS_ROOT}/UXCam" "${PODS_XCFRAMEWORKS_BUILD_DIR}/UXCam" "$(PODS_ROOT)/UXCam"
3 | GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1
4 | HEADER_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/Mixpanel/Mixpanel.framework/Headers"
5 | LD_RUNPATH_SEARCH_PATHS = $(inherited) '@executable_path/Frameworks' '@loader_path/Frameworks'
6 | OTHER_LDFLAGS = $(inherited) -ObjC -l"c++" -l"iconv" -l"icucore" -l"z" -framework "AVFoundation" -framework "Accelerate" -framework "CoreGraphics" -framework "CoreMedia" -framework "CoreTelephony" -framework "CoreVideo" -framework "Foundation" -framework "Mixpanel" -framework "MobileCoreServices" -framework "QuartzCore" -framework "Security" -framework "StoreKit" -framework "SystemConfiguration" -framework "UIKit" -framework "UXCam" -framework "WebKit" -framework "shared"
7 | PODS_BUILD_DIR = ${BUILD_DIR}
8 | PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)
9 | PODS_PODFILE_DIR_PATH = ${SRCROOT}/.
10 | PODS_ROOT = ${SRCROOT}/Pods
11 | PODS_XCFRAMEWORKS_BUILD_DIR = $(PODS_CONFIGURATION_BUILD_DIR)/XCFrameworkIntermediates
12 | USE_RECURSIVE_SCRIPT_INPUTS_IN_SCRIPT_PHASES = YES
13 |
--------------------------------------------------------------------------------
/iOS_App/Pods/Target Support Files/UXCam/UXCam-xcframeworks-input-files.xcfilelist:
--------------------------------------------------------------------------------
1 | ${PODS_ROOT}/Target Support Files/UXCam/UXCam-xcframeworks.sh
2 | ${PODS_ROOT}/UXCam/UXCam.xcframework
--------------------------------------------------------------------------------
/iOS_App/Pods/Target Support Files/UXCam/UXCam-xcframeworks-output-files.xcfilelist:
--------------------------------------------------------------------------------
1 | ${PODS_XCFRAMEWORKS_BUILD_DIR}/UXCam/UXCam.framework
--------------------------------------------------------------------------------
/iOS_App/Pods/Target Support Files/UXCam/UXCam.debug.xcconfig:
--------------------------------------------------------------------------------
1 | CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = NO
2 | CONFIGURATION_BUILD_DIR = ${PODS_CONFIGURATION_BUILD_DIR}/UXCam
3 | FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_ROOT}/UXCam" "${PODS_XCFRAMEWORKS_BUILD_DIR}/UXCam" "$(PODS_ROOT)/UXCam"
4 | GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1
5 | PODS_BUILD_DIR = ${BUILD_DIR}
6 | PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)
7 | PODS_ROOT = ${SRCROOT}
8 | PODS_TARGET_SRCROOT = ${PODS_ROOT}/UXCam
9 | PODS_XCFRAMEWORKS_BUILD_DIR = $(PODS_CONFIGURATION_BUILD_DIR)/XCFrameworkIntermediates
10 | PRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier}
11 | SKIP_INSTALL = YES
12 | USE_RECURSIVE_SCRIPT_INPUTS_IN_SCRIPT_PHASES = YES
13 |
--------------------------------------------------------------------------------
/iOS_App/Pods/Target Support Files/UXCam/UXCam.release.xcconfig:
--------------------------------------------------------------------------------
1 | CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = NO
2 | CONFIGURATION_BUILD_DIR = ${PODS_CONFIGURATION_BUILD_DIR}/UXCam
3 | FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_ROOT}/UXCam" "${PODS_XCFRAMEWORKS_BUILD_DIR}/UXCam" "$(PODS_ROOT)/UXCam"
4 | GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1
5 | PODS_BUILD_DIR = ${BUILD_DIR}
6 | PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)
7 | PODS_ROOT = ${SRCROOT}
8 | PODS_TARGET_SRCROOT = ${PODS_ROOT}/UXCam
9 | PODS_XCFRAMEWORKS_BUILD_DIR = $(PODS_CONFIGURATION_BUILD_DIR)/XCFrameworkIntermediates
10 | PRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier}
11 | SKIP_INSTALL = YES
12 | USE_RECURSIVE_SCRIPT_INPUTS_IN_SCRIPT_PHASES = YES
13 |
--------------------------------------------------------------------------------
/iOS_App/Pods/Target Support Files/kmmtshared/kmmtshared.debug.xcconfig:
--------------------------------------------------------------------------------
1 | CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = NO
2 | CONFIGURATION_BUILD_DIR = ${PODS_CONFIGURATION_BUILD_DIR}/kmmtshared
3 | FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/Mixpanel" "${PODS_ROOT}/../../kmmtshared/build/cocoapods/framework" "${PODS_ROOT}/UXCam" "${PODS_XCFRAMEWORKS_BUILD_DIR}/UXCam"
4 | GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1
5 | KOTLIN_PROJECT_PATH = :kmmtshared
6 | OTHER_LDFLAGS = $(inherited) -l"c++" -framework "AVFoundation" -framework "CoreGraphics" -framework "CoreMedia" -framework "CoreTelephony" -framework "CoreVideo" -framework "MobileCoreServices" -framework "QuartzCore" -framework "Security" -framework "SystemConfiguration" -framework "WebKit"
7 | PODS_BUILD_DIR = ${BUILD_DIR}
8 | PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)
9 | PODS_ROOT = ${SRCROOT}
10 | PODS_TARGET_SRCROOT = ${PODS_ROOT}/../../kmmtshared
11 | PODS_XCFRAMEWORKS_BUILD_DIR = $(PODS_CONFIGURATION_BUILD_DIR)/XCFrameworkIntermediates
12 | PRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier}
13 | PRODUCT_MODULE_NAME = shared
14 | SKIP_INSTALL = YES
15 | USE_RECURSIVE_SCRIPT_INPUTS_IN_SCRIPT_PHASES = YES
16 |
--------------------------------------------------------------------------------
/iOS_App/Pods/Target Support Files/kmmtshared/kmmtshared.release.xcconfig:
--------------------------------------------------------------------------------
1 | CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = NO
2 | CONFIGURATION_BUILD_DIR = ${PODS_CONFIGURATION_BUILD_DIR}/kmmtshared
3 | FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/Mixpanel" "${PODS_ROOT}/../../kmmtshared/build/cocoapods/framework" "${PODS_ROOT}/UXCam" "${PODS_XCFRAMEWORKS_BUILD_DIR}/UXCam"
4 | GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1
5 | KOTLIN_PROJECT_PATH = :kmmtshared
6 | OTHER_LDFLAGS = $(inherited) -l"c++" -framework "AVFoundation" -framework "CoreGraphics" -framework "CoreMedia" -framework "CoreTelephony" -framework "CoreVideo" -framework "MobileCoreServices" -framework "QuartzCore" -framework "Security" -framework "SystemConfiguration" -framework "WebKit"
7 | PODS_BUILD_DIR = ${BUILD_DIR}
8 | PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)
9 | PODS_ROOT = ${SRCROOT}
10 | PODS_TARGET_SRCROOT = ${PODS_ROOT}/../../kmmtshared
11 | PODS_XCFRAMEWORKS_BUILD_DIR = $(PODS_CONFIGURATION_BUILD_DIR)/XCFrameworkIntermediates
12 | PRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier}
13 | PRODUCT_MODULE_NAME = shared
14 | SKIP_INSTALL = YES
15 | USE_RECURSIVE_SCRIPT_INPUTS_IN_SCRIPT_PHASES = YES
16 |
--------------------------------------------------------------------------------
/iOS_App/Pods/UXCam/UXCam.xcframework/Info.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | AvailableLibraries
6 |
7 |
8 | LibraryIdentifier
9 | ios-arm64_i386_x86_64-simulator
10 | LibraryPath
11 | UXCam.framework
12 | SupportedArchitectures
13 |
14 | arm64
15 | i386
16 | x86_64
17 |
18 | SupportedPlatform
19 | ios
20 | SupportedPlatformVariant
21 | simulator
22 |
23 |
24 | LibraryIdentifier
25 | ios-arm64_armv7
26 | LibraryPath
27 | UXCam.framework
28 | SupportedArchitectures
29 |
30 | arm64
31 | armv7
32 |
33 | SupportedPlatform
34 | ios
35 |
36 |
37 | CFBundlePackageType
38 | XFWK
39 | XCFrameworkFormatVersion
40 | 1.0
41 |
42 |
43 |
--------------------------------------------------------------------------------
/iOS_App/Pods/UXCam/UXCam.xcframework/ios-arm64_armv7/UXCam.framework/FileMD5Hash-NOTICE:
--------------------------------------------------------------------------------
1 | FileMD5Hash
2 | Copyright © 2010-2014 Joel Lopes Da Silva. All rights reserved.
3 |
4 | This software has been developed by Joel Lopes Da Silva (http://www.joel.lopes-da-silva.com/).
5 |
--------------------------------------------------------------------------------
/iOS_App/Pods/UXCam/UXCam.xcframework/ios-arm64_armv7/UXCam.framework/Frameworks/module.modulemap:
--------------------------------------------------------------------------------
1 | framework module UXCam {
2 | umbrella header "UXCam-umbrella.h"
3 |
4 | export *
5 | module * { export * }
6 | }
7 |
--------------------------------------------------------------------------------
/iOS_App/Pods/UXCam/UXCam.xcframework/ios-arm64_armv7/UXCam.framework/GZIP-LICENCE.md:
--------------------------------------------------------------------------------
1 | GZIP
2 |
3 | Copyright (C) 2012 Charcoal Design
4 |
5 | This software is provided 'as-is', without any express or implied
6 | warranty. In no event will the authors be held liable for any damages
7 | arising from the use of this software.
8 |
9 | Permission is granted to anyone to use this software for any purpose,
10 | including commercial applications, and to alter it and redistribute it
11 | freely, subject to the following restrictions:
12 |
13 | 1. The origin of this software must not be misrepresented; you must not
14 | claim that you wrote the original software. If you use this software
15 | in a product, an acknowledgment in the product documentation would be
16 | appreciated but is not required.
17 |
18 | 2. Altered source versions must be plainly marked as such, and must not be
19 | misrepresented as being the original software.
20 |
21 | 3. This notice may not be removed or altered from any source distribution.
--------------------------------------------------------------------------------
/iOS_App/Pods/UXCam/UXCam.xcframework/ios-arm64_armv7/UXCam.framework/Headers/UXCam-umbrella.h:
--------------------------------------------------------------------------------
1 | //
2 | // UXCam-umbrella.h
3 | // UXCamFramework
4 | //
5 | // Created by Ankit Karna on 25/08/2021.
6 | // Copyright © 2021 UXCam. All rights reserved.
7 | //
8 |
9 | #import
10 |
11 | //! Project version number for UXCam.
12 | FOUNDATION_EXPORT double UXCamVersionNumber;
13 |
14 | //! Project version string for UXCam.
15 | FOUNDATION_EXPORT const unsigned char UXCamVersionString[];
16 |
17 | // In this header, you should import all the public headers of your framework using statements like #import
18 | #import
19 | #import
20 |
21 | #import
22 |
--------------------------------------------------------------------------------
/iOS_App/Pods/UXCam/UXCam.xcframework/ios-arm64_armv7/UXCam.framework/Headers/UXCamBlurSetting.h:
--------------------------------------------------------------------------------
1 | //
2 | // UXCamBlurSetting.h
3 | // UXCam
4 | //
5 | // Created by Ankit Karna on 19/01/2022.
6 | // Copyright © 2022 UXCam Inc. All rights reserved.
7 | //
8 |
9 | #import
10 | #import
11 |
12 | NS_ASSUME_NONNULL_BEGIN
13 |
14 | typedef NS_ENUM(NSInteger, UXBlurType) {
15 | UXBlurTypeGaussian,
16 | UXBlurTypeBox,
17 | UXBlurTypeBokeh
18 | };
19 |
20 | @interface UXCamBlurSetting : NSObject
21 |
22 | @property (readonly) UXBlurType blurType;
23 | @property (readonly) int radius;
24 | @property (nonatomic) BOOL hideGestures;
25 |
26 | - (instancetype)initWithRadius:(int)radius;
27 | - (instancetype)initWithBlurType:(UXBlurType)type radius:(int)radius;
28 |
29 |
30 | @end
31 |
32 | NS_ASSUME_NONNULL_END
33 |
--------------------------------------------------------------------------------
/iOS_App/Pods/UXCam/UXCam.xcframework/ios-arm64_armv7/UXCam.framework/Headers/UXCamOccludeAllTextFields.h:
--------------------------------------------------------------------------------
1 | //
2 | // UXCamOccludeAllTextFields.h
3 | // UXCam
4 | //
5 | // Created by Ankit Karna on 22/02/2022.
6 | // Copyright © 2022 UXCam. All rights reserved.
7 | //
8 |
9 | #import
10 | #import
11 |
12 | NS_ASSUME_NONNULL_BEGIN
13 |
14 | @interface UXCamOccludeAllTextFields : NSObject
15 |
16 | @end
17 |
18 | NS_ASSUME_NONNULL_END
19 |
--------------------------------------------------------------------------------
/iOS_App/Pods/UXCam/UXCam.xcframework/ios-arm64_armv7/UXCam.framework/Headers/UXCamOcclusion.h:
--------------------------------------------------------------------------------
1 | //
2 | // UXCamOcclusion.h
3 | // UXCam
4 | //
5 | // Created by Ankit Karna on 19/01/2022.
6 | // Copyright © 2022 UXCam Inc. All rights reserved.
7 | //
8 |
9 | #import
10 | #import
11 | #import
12 | #import
13 |
14 | NS_ASSUME_NONNULL_BEGIN
15 |
16 | @interface UXCamOcclusion : NSObject
17 |
18 | @property NSArray *parameters;
19 | @property NSArray *screens;
20 |
21 | - (instancetype)initWithSetting:(id)setting;
22 | - (instancetype)initWithSettings:(NSArray> *)settings;
23 |
24 | + (UXBlurType)getBlurTypeFromName:(NSString *)name;
25 | + (NSString *)systemNameForBlurType:(UXBlurType)type;
26 |
27 | + (nullable id)getSettingFromJson:(NSDictionary *)json;
28 |
29 | - (void)applySetting:(id)setting screens:(NSArray *)screens;
30 | - (void)applySettings:(NSArray> *)settings
31 | screens:(NSArray *)screens excludeMentionedScreens:(BOOL)exclude;
32 |
33 | - (BOOL)containsSettingOfType:(UXOcclusionType)type;
34 |
35 | @end
36 |
37 | NS_ASSUME_NONNULL_END
38 |
--------------------------------------------------------------------------------
/iOS_App/Pods/UXCam/UXCam.xcframework/ios-arm64_armv7/UXCam.framework/Headers/UXCamOcclusionParameter.h:
--------------------------------------------------------------------------------
1 | //
2 | // UXCamOcclusionParameter.h
3 | // UXCam
4 | //
5 | // Created by Ankit Karna on 22/01/2022.
6 | // Copyright © 2022 UXCam Inc. All rights reserved.
7 | //
8 |
9 | #import
10 | #import
11 |
12 | NS_ASSUME_NONNULL_BEGIN
13 |
14 | @interface UXCamOcclusionParameter : NSObject
15 |
16 | @property (readonly) id setting;
17 | @property NSArray *excludedScreens;
18 |
19 | - (instancetype)initWithSetting:(id)setting;
20 | - (instancetype)initWithSetting:(id)setting
21 | excludedScreens: (NSArray *)excludedScreens;
22 |
23 | @end
24 |
25 | NS_ASSUME_NONNULL_END
26 |
--------------------------------------------------------------------------------
/iOS_App/Pods/UXCam/UXCam.xcframework/ios-arm64_armv7/UXCam.framework/Headers/UXCamOcclusionScreen.h:
--------------------------------------------------------------------------------
1 | //
2 | // UXCamOcclusionScreen.h
3 | // UXCam
4 | //
5 | // Created by Ankit Karna on 22/01/2022.
6 | // Copyright © 2022 UXCam Inc. All rights reserved.
7 | //
8 |
9 | #import
10 | #import
11 |
12 | NS_ASSUME_NONNULL_BEGIN
13 |
14 | @interface UXCamOcclusionScreen : NSObject
15 |
16 | @property (readonly) NSString *name;
17 | @property NSMutableArray> *settings;
18 |
19 | - (instancetype)initWithName:(NSString *)name settings:(NSArray> *)settings;
20 |
21 | @end
22 |
23 | NS_ASSUME_NONNULL_END
24 |
--------------------------------------------------------------------------------
/iOS_App/Pods/UXCam/UXCam.xcframework/ios-arm64_armv7/UXCam.framework/Headers/UXCamOcclusionSetting.h:
--------------------------------------------------------------------------------
1 | //
2 | // UXCamOcclusionSetting.h
3 | // UXCam
4 | //
5 | // Created by Ankit Karna on 22/01/2022.
6 | // Copyright © 2022 UXCam Inc. All rights reserved.
7 | //
8 |
9 | #ifndef UXCamOcclusionSetting_h
10 | #define UXCamOcclusionSetting_h
11 |
12 | #import
13 |
14 | typedef NS_ENUM(NSInteger, UXOcclusionType) {
15 | UXOcclusionTypeOccludeAllTextFields = 1,
16 | UXOcclusionTypeOverlay = 2,
17 | UXOcclusionTypeBlur = 3,
18 | UXOcclusionTypeUnknown = 4
19 | };
20 |
21 |
22 | typedef NS_ENUM(NSInteger, UXOcclusionCategory) {
23 | UXOcclusionCategoryTextOnly,
24 | UXOcclusionCategoryScreen
25 | };
26 |
27 | @protocol UXCamOcclusionSetting
28 | @property (readonly) UXOcclusionType type;
29 | @property (readonly) UXOcclusionCategory category;
30 | @end
31 |
32 |
33 | #endif /* UXCamOcclusionSetting_h */
34 |
--------------------------------------------------------------------------------
/iOS_App/Pods/UXCam/UXCam.xcframework/ios-arm64_armv7/UXCam.framework/Headers/UXCamOverlaySetting.h:
--------------------------------------------------------------------------------
1 | //
2 | // UXCamOverlaySetting.h
3 | // UXCam
4 | //
5 | // Created by Ankit Karna on 21/02/2022.
6 | // Copyright © 2022 UXCam. All rights reserved.
7 | //
8 |
9 | #import
10 | #import
11 |
12 | NS_ASSUME_NONNULL_BEGIN
13 |
14 | @interface UXCamOverlaySetting : NSObject
15 |
16 | @property (strong, nonatomic) UIColor *color;
17 | @property (nonatomic) BOOL hideGestures;
18 |
19 | - (instancetype)initWithColor:(UIColor *)color;
20 |
21 | @end
22 |
23 | NS_ASSUME_NONNULL_END
24 |
--------------------------------------------------------------------------------
/iOS_App/Pods/UXCam/UXCam.xcframework/ios-arm64_armv7/UXCam.framework/Headers/UXOcclusionHeaders.h:
--------------------------------------------------------------------------------
1 | //
2 | // UXOcclusionHeaders.h
3 | // UXCam
4 | //
5 | // Created by Ankit Karna on 21/02/2022.
6 | // Copyright © 2022 UXCam. All rights reserved.
7 | //
8 |
9 | #ifndef UXOcclusionHeaders_h
10 | #define UXOcclusionHeaders_h
11 |
12 | #import
13 | #import
14 | #import
15 | #import
16 |
17 | #endif /* UXOcclusionHeaders_h */
18 |
--------------------------------------------------------------------------------
/iOS_App/Pods/UXCam/UXCam.xcframework/ios-arm64_armv7/UXCam.framework/Info.plist:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jittya/KMMT/2faa5eb1fdd785cc1b07f03b9c186af1a3acfc40/iOS_App/Pods/UXCam/UXCam.xcframework/ios-arm64_armv7/UXCam.framework/Info.plist
--------------------------------------------------------------------------------
/iOS_App/Pods/UXCam/UXCam.xcframework/ios-arm64_armv7/UXCam.framework/LICENSE-minizip:
--------------------------------------------------------------------------------
1 | Condition of use and distribution are the same as zlib:
2 |
3 | This software is provided 'as-is', without any express or implied
4 | warranty. In no event will the authors be held liable for any damages
5 | arising from the use of this software.
6 |
7 | Permission is granted to anyone to use this software for any purpose,
8 | including commercial applications, and to alter it and redistribute it
9 | freely, subject to the following restrictions:
10 |
11 | 1. The origin of this software must not be misrepresented; you must not
12 | claim that you wrote the original software. If you use this software
13 | in a product, an acknowledgement in the product documentation would be
14 | appreciated but is not required.
15 | 2. Altered source versions must be plainly marked as such, and must not be
16 | misrepresented as being the original software.
17 | 3. This notice may not be removed or altered from any source distribution.
--------------------------------------------------------------------------------
/iOS_App/Pods/UXCam/UXCam.xcframework/ios-arm64_armv7/UXCam.framework/Modules/module.modulemap:
--------------------------------------------------------------------------------
1 | framework module UXCam {
2 | umbrella header "UXCam-umbrella.h"
3 |
4 | export *
5 | module * { export * }
6 | }
7 |
--------------------------------------------------------------------------------
/iOS_App/Pods/UXCam/UXCam.xcframework/ios-arm64_armv7/UXCam.framework/SSZipArchive-LICENSE.txt:
--------------------------------------------------------------------------------
1 | Copyright (c) 2010-2015, Sam Soffes, https://soff.es
2 |
3 | Permission is hereby granted, free of charge, to any person obtaining
4 | a copy of this software and associated documentation files (the
5 | "Software"), to deal in the Software without restriction, including
6 | without limitation the rights to use, copy, modify, merge, publish,
7 | distribute, sublicense, and/or sell copies of the Software, and to
8 | permit persons to whom the Software is furnished to do so, subject to
9 | the following conditions:
10 |
11 | The above copyright notice and this permission notice shall be
12 | included in all copies or substantial portions of the Software.
13 |
14 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
15 | EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
16 | MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
17 | NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
18 | LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
19 | OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
20 | WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
21 |
--------------------------------------------------------------------------------
/iOS_App/Pods/UXCam/UXCam.xcframework/ios-arm64_armv7/UXCam.framework/UXCam:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jittya/KMMT/2faa5eb1fdd785cc1b07f03b9c186af1a3acfc40/iOS_App/Pods/UXCam/UXCam.xcframework/ios-arm64_armv7/UXCam.framework/UXCam
--------------------------------------------------------------------------------
/iOS_App/Pods/UXCam/UXCam.xcframework/ios-arm64_armv7/UXCam.framework/iOSViewHierarchy-LICENSE.txt:
--------------------------------------------------------------------------------
1 | iOS-Hierarchy-Viewer for iPhone
2 |
3 | Copyright (c) 2011 - Damian Kołakowski, Krzysztof Zabłocki and other contributors
4 |
5 | Permission is hereby granted, free of charge, to any person obtaining a copy
6 | of this software and associated documentation files (the "Software"), to deal
7 | in the Software without restriction, including without limitation the rights
8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9 | copies of the Software, and to permit persons to whom the Software is
10 | furnished to do so, subject to the following conditions:
11 |
12 | The above copyright notice and this permission notice shall be included in
13 | all copies or substantial portions of the Software.
14 |
15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
21 | THE SOFTWARE.
22 |
--------------------------------------------------------------------------------
/iOS_App/Pods/UXCam/UXCam.xcframework/ios-arm64_i386_x86_64-simulator/UXCam.framework/FileMD5Hash-NOTICE:
--------------------------------------------------------------------------------
1 | FileMD5Hash
2 | Copyright © 2010-2014 Joel Lopes Da Silva. All rights reserved.
3 |
4 | This software has been developed by Joel Lopes Da Silva (http://www.joel.lopes-da-silva.com/).
5 |
--------------------------------------------------------------------------------
/iOS_App/Pods/UXCam/UXCam.xcframework/ios-arm64_i386_x86_64-simulator/UXCam.framework/Frameworks/module.modulemap:
--------------------------------------------------------------------------------
1 | framework module UXCam {
2 | umbrella header "UXCam-umbrella.h"
3 |
4 | export *
5 | module * { export * }
6 | }
7 |
--------------------------------------------------------------------------------
/iOS_App/Pods/UXCam/UXCam.xcframework/ios-arm64_i386_x86_64-simulator/UXCam.framework/GZIP-LICENCE.md:
--------------------------------------------------------------------------------
1 | GZIP
2 |
3 | Copyright (C) 2012 Charcoal Design
4 |
5 | This software is provided 'as-is', without any express or implied
6 | warranty. In no event will the authors be held liable for any damages
7 | arising from the use of this software.
8 |
9 | Permission is granted to anyone to use this software for any purpose,
10 | including commercial applications, and to alter it and redistribute it
11 | freely, subject to the following restrictions:
12 |
13 | 1. The origin of this software must not be misrepresented; you must not
14 | claim that you wrote the original software. If you use this software
15 | in a product, an acknowledgment in the product documentation would be
16 | appreciated but is not required.
17 |
18 | 2. Altered source versions must be plainly marked as such, and must not be
19 | misrepresented as being the original software.
20 |
21 | 3. This notice may not be removed or altered from any source distribution.
--------------------------------------------------------------------------------
/iOS_App/Pods/UXCam/UXCam.xcframework/ios-arm64_i386_x86_64-simulator/UXCam.framework/Headers/UXCam-umbrella.h:
--------------------------------------------------------------------------------
1 | //
2 | // UXCam-umbrella.h
3 | // UXCamFramework
4 | //
5 | // Created by Ankit Karna on 25/08/2021.
6 | // Copyright © 2021 UXCam. All rights reserved.
7 | //
8 |
9 | #import
10 |
11 | //! Project version number for UXCam.
12 | FOUNDATION_EXPORT double UXCamVersionNumber;
13 |
14 | //! Project version string for UXCam.
15 | FOUNDATION_EXPORT const unsigned char UXCamVersionString[];
16 |
17 | // In this header, you should import all the public headers of your framework using statements like #import
18 | #import
19 | #import
20 |
21 | #import
22 |
--------------------------------------------------------------------------------
/iOS_App/Pods/UXCam/UXCam.xcframework/ios-arm64_i386_x86_64-simulator/UXCam.framework/Headers/UXCamBlurSetting.h:
--------------------------------------------------------------------------------
1 | //
2 | // UXCamBlurSetting.h
3 | // UXCam
4 | //
5 | // Created by Ankit Karna on 19/01/2022.
6 | // Copyright © 2022 UXCam Inc. All rights reserved.
7 | //
8 |
9 | #import
10 | #import
11 |
12 | NS_ASSUME_NONNULL_BEGIN
13 |
14 | typedef NS_ENUM(NSInteger, UXBlurType) {
15 | UXBlurTypeGaussian,
16 | UXBlurTypeBox,
17 | UXBlurTypeBokeh
18 | };
19 |
20 | @interface UXCamBlurSetting : NSObject
21 |
22 | @property (readonly) UXBlurType blurType;
23 | @property (readonly) int radius;
24 | @property (nonatomic) BOOL hideGestures;
25 |
26 | - (instancetype)initWithRadius:(int)radius;
27 | - (instancetype)initWithBlurType:(UXBlurType)type radius:(int)radius;
28 |
29 |
30 | @end
31 |
32 | NS_ASSUME_NONNULL_END
33 |
--------------------------------------------------------------------------------
/iOS_App/Pods/UXCam/UXCam.xcframework/ios-arm64_i386_x86_64-simulator/UXCam.framework/Headers/UXCamOccludeAllTextFields.h:
--------------------------------------------------------------------------------
1 | //
2 | // UXCamOccludeAllTextFields.h
3 | // UXCam
4 | //
5 | // Created by Ankit Karna on 22/02/2022.
6 | // Copyright © 2022 UXCam. All rights reserved.
7 | //
8 |
9 | #import
10 | #import
11 |
12 | NS_ASSUME_NONNULL_BEGIN
13 |
14 | @interface UXCamOccludeAllTextFields : NSObject
15 |
16 | @end
17 |
18 | NS_ASSUME_NONNULL_END
19 |
--------------------------------------------------------------------------------
/iOS_App/Pods/UXCam/UXCam.xcframework/ios-arm64_i386_x86_64-simulator/UXCam.framework/Headers/UXCamOcclusion.h:
--------------------------------------------------------------------------------
1 | //
2 | // UXCamOcclusion.h
3 | // UXCam
4 | //
5 | // Created by Ankit Karna on 19/01/2022.
6 | // Copyright © 2022 UXCam Inc. All rights reserved.
7 | //
8 |
9 | #import
10 | #import
11 | #import
12 | #import
13 |
14 | NS_ASSUME_NONNULL_BEGIN
15 |
16 | @interface UXCamOcclusion : NSObject
17 |
18 | @property NSArray *parameters;
19 | @property NSArray *screens;
20 |
21 | - (instancetype)initWithSetting:(id)setting;
22 | - (instancetype)initWithSettings:(NSArray> *)settings;
23 |
24 | + (UXBlurType)getBlurTypeFromName:(NSString *)name;
25 | + (NSString *)systemNameForBlurType:(UXBlurType)type;
26 |
27 | + (nullable id)getSettingFromJson:(NSDictionary *)json;
28 |
29 | - (void)applySetting:(id)setting screens:(NSArray *)screens;
30 | - (void)applySettings:(NSArray> *)settings
31 | screens:(NSArray *)screens excludeMentionedScreens:(BOOL)exclude;
32 |
33 | - (BOOL)containsSettingOfType:(UXOcclusionType)type;
34 |
35 | @end
36 |
37 | NS_ASSUME_NONNULL_END
38 |
--------------------------------------------------------------------------------
/iOS_App/Pods/UXCam/UXCam.xcframework/ios-arm64_i386_x86_64-simulator/UXCam.framework/Headers/UXCamOcclusionParameter.h:
--------------------------------------------------------------------------------
1 | //
2 | // UXCamOcclusionParameter.h
3 | // UXCam
4 | //
5 | // Created by Ankit Karna on 22/01/2022.
6 | // Copyright © 2022 UXCam Inc. All rights reserved.
7 | //
8 |
9 | #import
10 | #import
11 |
12 | NS_ASSUME_NONNULL_BEGIN
13 |
14 | @interface UXCamOcclusionParameter : NSObject
15 |
16 | @property (readonly) id setting;
17 | @property NSArray *excludedScreens;
18 |
19 | - (instancetype)initWithSetting:(id)setting;
20 | - (instancetype)initWithSetting:(id)setting
21 | excludedScreens: (NSArray *)excludedScreens;
22 |
23 | @end
24 |
25 | NS_ASSUME_NONNULL_END
26 |
--------------------------------------------------------------------------------
/iOS_App/Pods/UXCam/UXCam.xcframework/ios-arm64_i386_x86_64-simulator/UXCam.framework/Headers/UXCamOcclusionScreen.h:
--------------------------------------------------------------------------------
1 | //
2 | // UXCamOcclusionScreen.h
3 | // UXCam
4 | //
5 | // Created by Ankit Karna on 22/01/2022.
6 | // Copyright © 2022 UXCam Inc. All rights reserved.
7 | //
8 |
9 | #import
10 | #import
11 |
12 | NS_ASSUME_NONNULL_BEGIN
13 |
14 | @interface UXCamOcclusionScreen : NSObject
15 |
16 | @property (readonly) NSString *name;
17 | @property NSMutableArray> *settings;
18 |
19 | - (instancetype)initWithName:(NSString *)name settings:(NSArray> *)settings;
20 |
21 | @end
22 |
23 | NS_ASSUME_NONNULL_END
24 |
--------------------------------------------------------------------------------
/iOS_App/Pods/UXCam/UXCam.xcframework/ios-arm64_i386_x86_64-simulator/UXCam.framework/Headers/UXCamOcclusionSetting.h:
--------------------------------------------------------------------------------
1 | //
2 | // UXCamOcclusionSetting.h
3 | // UXCam
4 | //
5 | // Created by Ankit Karna on 22/01/2022.
6 | // Copyright © 2022 UXCam Inc. All rights reserved.
7 | //
8 |
9 | #ifndef UXCamOcclusionSetting_h
10 | #define UXCamOcclusionSetting_h
11 |
12 | #import
13 |
14 | typedef NS_ENUM(NSInteger, UXOcclusionType) {
15 | UXOcclusionTypeOccludeAllTextFields = 1,
16 | UXOcclusionTypeOverlay = 2,
17 | UXOcclusionTypeBlur = 3,
18 | UXOcclusionTypeUnknown = 4
19 | };
20 |
21 |
22 | typedef NS_ENUM(NSInteger, UXOcclusionCategory) {
23 | UXOcclusionCategoryTextOnly,
24 | UXOcclusionCategoryScreen
25 | };
26 |
27 | @protocol UXCamOcclusionSetting
28 | @property (readonly) UXOcclusionType type;
29 | @property (readonly) UXOcclusionCategory category;
30 | @end
31 |
32 |
33 | #endif /* UXCamOcclusionSetting_h */
34 |
--------------------------------------------------------------------------------
/iOS_App/Pods/UXCam/UXCam.xcframework/ios-arm64_i386_x86_64-simulator/UXCam.framework/Headers/UXCamOverlaySetting.h:
--------------------------------------------------------------------------------
1 | //
2 | // UXCamOverlaySetting.h
3 | // UXCam
4 | //
5 | // Created by Ankit Karna on 21/02/2022.
6 | // Copyright © 2022 UXCam. All rights reserved.
7 | //
8 |
9 | #import
10 | #import
11 |
12 | NS_ASSUME_NONNULL_BEGIN
13 |
14 | @interface UXCamOverlaySetting : NSObject
15 |
16 | @property (strong, nonatomic) UIColor *color;
17 | @property (nonatomic) BOOL hideGestures;
18 |
19 | - (instancetype)initWithColor:(UIColor *)color;
20 |
21 | @end
22 |
23 | NS_ASSUME_NONNULL_END
24 |
--------------------------------------------------------------------------------
/iOS_App/Pods/UXCam/UXCam.xcframework/ios-arm64_i386_x86_64-simulator/UXCam.framework/Headers/UXOcclusionHeaders.h:
--------------------------------------------------------------------------------
1 | //
2 | // UXOcclusionHeaders.h
3 | // UXCam
4 | //
5 | // Created by Ankit Karna on 21/02/2022.
6 | // Copyright © 2022 UXCam. All rights reserved.
7 | //
8 |
9 | #ifndef UXOcclusionHeaders_h
10 | #define UXOcclusionHeaders_h
11 |
12 | #import
13 | #import
14 | #import
15 | #import
16 |
17 | #endif /* UXOcclusionHeaders_h */
18 |
--------------------------------------------------------------------------------
/iOS_App/Pods/UXCam/UXCam.xcframework/ios-arm64_i386_x86_64-simulator/UXCam.framework/Info.plist:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jittya/KMMT/2faa5eb1fdd785cc1b07f03b9c186af1a3acfc40/iOS_App/Pods/UXCam/UXCam.xcframework/ios-arm64_i386_x86_64-simulator/UXCam.framework/Info.plist
--------------------------------------------------------------------------------
/iOS_App/Pods/UXCam/UXCam.xcframework/ios-arm64_i386_x86_64-simulator/UXCam.framework/LICENSE-minizip:
--------------------------------------------------------------------------------
1 | Condition of use and distribution are the same as zlib:
2 |
3 | This software is provided 'as-is', without any express or implied
4 | warranty. In no event will the authors be held liable for any damages
5 | arising from the use of this software.
6 |
7 | Permission is granted to anyone to use this software for any purpose,
8 | including commercial applications, and to alter it and redistribute it
9 | freely, subject to the following restrictions:
10 |
11 | 1. The origin of this software must not be misrepresented; you must not
12 | claim that you wrote the original software. If you use this software
13 | in a product, an acknowledgement in the product documentation would be
14 | appreciated but is not required.
15 | 2. Altered source versions must be plainly marked as such, and must not be
16 | misrepresented as being the original software.
17 | 3. This notice may not be removed or altered from any source distribution.
--------------------------------------------------------------------------------
/iOS_App/Pods/UXCam/UXCam.xcframework/ios-arm64_i386_x86_64-simulator/UXCam.framework/Modules/module.modulemap:
--------------------------------------------------------------------------------
1 | framework module UXCam {
2 | umbrella header "UXCam-umbrella.h"
3 |
4 | export *
5 | module * { export * }
6 | }
7 |
--------------------------------------------------------------------------------
/iOS_App/Pods/UXCam/UXCam.xcframework/ios-arm64_i386_x86_64-simulator/UXCam.framework/SSZipArchive-LICENSE.txt:
--------------------------------------------------------------------------------
1 | Copyright (c) 2010-2015, Sam Soffes, https://soff.es
2 |
3 | Permission is hereby granted, free of charge, to any person obtaining
4 | a copy of this software and associated documentation files (the
5 | "Software"), to deal in the Software without restriction, including
6 | without limitation the rights to use, copy, modify, merge, publish,
7 | distribute, sublicense, and/or sell copies of the Software, and to
8 | permit persons to whom the Software is furnished to do so, subject to
9 | the following conditions:
10 |
11 | The above copyright notice and this permission notice shall be
12 | included in all copies or substantial portions of the Software.
13 |
14 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
15 | EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
16 | MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
17 | NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
18 | LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
19 | OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
20 | WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
21 |
--------------------------------------------------------------------------------
/iOS_App/Pods/UXCam/UXCam.xcframework/ios-arm64_i386_x86_64-simulator/UXCam.framework/UXCam:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jittya/KMMT/2faa5eb1fdd785cc1b07f03b9c186af1a3acfc40/iOS_App/Pods/UXCam/UXCam.xcframework/ios-arm64_i386_x86_64-simulator/UXCam.framework/UXCam
--------------------------------------------------------------------------------
/iOS_App/Pods/UXCam/UXCam.xcframework/ios-arm64_i386_x86_64-simulator/UXCam.framework/_CodeSignature/CodeDirectory:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jittya/KMMT/2faa5eb1fdd785cc1b07f03b9c186af1a3acfc40/iOS_App/Pods/UXCam/UXCam.xcframework/ios-arm64_i386_x86_64-simulator/UXCam.framework/_CodeSignature/CodeDirectory
--------------------------------------------------------------------------------
/iOS_App/Pods/UXCam/UXCam.xcframework/ios-arm64_i386_x86_64-simulator/UXCam.framework/_CodeSignature/CodeRequirements:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jittya/KMMT/2faa5eb1fdd785cc1b07f03b9c186af1a3acfc40/iOS_App/Pods/UXCam/UXCam.xcframework/ios-arm64_i386_x86_64-simulator/UXCam.framework/_CodeSignature/CodeRequirements
--------------------------------------------------------------------------------
/iOS_App/Pods/UXCam/UXCam.xcframework/ios-arm64_i386_x86_64-simulator/UXCam.framework/_CodeSignature/CodeRequirements-1:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jittya/KMMT/2faa5eb1fdd785cc1b07f03b9c186af1a3acfc40/iOS_App/Pods/UXCam/UXCam.xcframework/ios-arm64_i386_x86_64-simulator/UXCam.framework/_CodeSignature/CodeRequirements-1
--------------------------------------------------------------------------------
/iOS_App/Pods/UXCam/UXCam.xcframework/ios-arm64_i386_x86_64-simulator/UXCam.framework/_CodeSignature/CodeSignature:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jittya/KMMT/2faa5eb1fdd785cc1b07f03b9c186af1a3acfc40/iOS_App/Pods/UXCam/UXCam.xcframework/ios-arm64_i386_x86_64-simulator/UXCam.framework/_CodeSignature/CodeSignature
--------------------------------------------------------------------------------
/iOS_App/Pods/UXCam/UXCam.xcframework/ios-arm64_i386_x86_64-simulator/UXCam.framework/iOSViewHierarchy-LICENSE.txt:
--------------------------------------------------------------------------------
1 | iOS-Hierarchy-Viewer for iPhone
2 |
3 | Copyright (c) 2011 - Damian Kołakowski, Krzysztof Zabłocki and other contributors
4 |
5 | Permission is hereby granted, free of charge, to any person obtaining a copy
6 | of this software and associated documentation files (the "Software"), to deal
7 | in the Software without restriction, including without limitation the rights
8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9 | copies of the Software, and to permit persons to whom the Software is
10 | furnished to do so, subject to the following conditions:
11 |
12 | The above copyright notice and this permission notice shall be included in
13 | all copies or substantial portions of the Software.
14 |
15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
21 | THE SOFTWARE.
22 |
--------------------------------------------------------------------------------
/img.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jittya/KMMT/2faa5eb1fdd785cc1b07f03b9c186af1a3acfc40/img.png
--------------------------------------------------------------------------------
/img_1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jittya/KMMT/2faa5eb1fdd785cc1b07f03b9c186af1a3acfc40/img_1.png
--------------------------------------------------------------------------------
/kmmtshared/analytics/src/androidMain/AndroidManifest.xml:
--------------------------------------------------------------------------------
1 |
2 |
--------------------------------------------------------------------------------
/kmmtshared/analytics/src/androidMain/kotlin/com/kmmt/analytics/expectations/AnalyticsContext.kt:
--------------------------------------------------------------------------------
1 | package com.kmmt.analytics.expectations
2 |
3 | actual class AnalyticsContext(val apiToken: String,val context: android.content.Context)
--------------------------------------------------------------------------------
/kmmtshared/analytics/src/androidMain/kotlin/com/kmmt/analytics/platforms/mixpanel/ExpectationsMixpanel.kt:
--------------------------------------------------------------------------------
1 | package com.kmmt.analytics.platforms.mixpanel
2 |
3 | import com.kmmt.analytics.expectations.AnalyticsContext
4 | import org.koin.core.module.KoinDefinition
5 | import org.koin.core.module.Module
6 |
7 |
8 | actual fun analyticsMixpanelModule(module: Module, key: String): KoinDefinition
9 | {
10 | return module.single { AnalyticsMixpanel(
11 | AnalyticsContext(
12 | key,
13 | get()
14 | )
15 | ) }
16 | }
--------------------------------------------------------------------------------
/kmmtshared/analytics/src/androidMain/kotlin/com/kmmt/analytics/platforms/uxcam/ExpectationsMixpanel.kt:
--------------------------------------------------------------------------------
1 | package com.kmmt.analytics.platforms.uxcam
2 |
3 | import com.kmmt.analytics.expectations.AnalyticsContext
4 | import org.koin.core.module.KoinDefinition
5 | import org.koin.core.module.Module
6 |
7 |
8 | actual fun analyticsUXCamModule(module: Module, key: String): KoinDefinition {
9 | return module.single {
10 | AnalyticsUXCam(
11 | AnalyticsContext(
12 | key, get()
13 | )
14 | )
15 | }
16 | }
17 |
--------------------------------------------------------------------------------
/kmmtshared/analytics/src/commonMain/kotlin/com/kmmt/analytics/core/AnalyticsEvent.kt:
--------------------------------------------------------------------------------
1 | package com.kmmt.analytics.core
2 |
3 | import com.kmmt.analytics.event.log.LogCategory
4 | import com.kmmt.analytics.event.log.events.BaseLogEvent
5 | import com.kmmt.analytics.platforms.mixpanel.AnalyticsMixpanel
6 | import com.kmmt.analytics.platforms.uxcam.AnalyticsUXCam
7 | import kotlinx.datetime.Clock
8 | import kotlinx.datetime.TimeZone
9 | import kotlinx.datetime.toLocalDateTime
10 | import org.koin.core.component.KoinComponent
11 | import org.koin.core.component.inject
12 |
13 |
14 | data class AnalyticsEvent(
15 | var eventType: String,
16 | val eventProperties: AnalyticsEventProperties = AnalyticsEventProperties(),
17 | val eventTime: String = Clock.System.now().toLocalDateTime(TimeZone.currentSystemDefault()).toString(),
18 | var eventDesc: String,
19 | val eventLog: BaseLogEvent,
20 | var eventCategory: LogCategory
21 | ) : KoinComponent {
22 |
23 | val appInfo: AppInfo by inject()
24 | val mixpanel: AnalyticsMixpanel by inject()
25 | val uxCam: AnalyticsUXCam by inject()
26 |
27 | fun add(key: String, value: String): AnalyticsEvent {
28 | eventProperties.getProperties()[key] = value
29 | return this
30 | }
31 |
32 | fun add(properties: Map): AnalyticsEvent {
33 | eventProperties.getProperties().putAll(properties)
34 | return this
35 | }
36 |
37 | fun logAnalyticsEvent() {
38 | println("logAnalyticsEvent > $this")
39 | if (appInfo.isRelease()) {
40 | mixpanel.track(this)
41 | uxCam.track(this)
42 | }
43 | }
44 | }
45 |
46 |
--------------------------------------------------------------------------------
/kmmtshared/analytics/src/commonMain/kotlin/com/kmmt/analytics/core/AnalyticsEventProperties.kt:
--------------------------------------------------------------------------------
1 | package com.kmmt.analytics.core
2 |
3 |
4 | class AnalyticsEventProperties {
5 | private var properties = mutableMapOf()
6 |
7 | fun add(key: String, value: String): AnalyticsEventProperties {
8 | properties[key] = value
9 | return this
10 | }
11 |
12 | fun getProperties(): MutableMap {
13 | return properties
14 | }
15 | }
16 |
17 |
18 |
19 |
--------------------------------------------------------------------------------
/kmmtshared/analytics/src/commonMain/kotlin/com/kmmt/analytics/core/AppInfo.kt:
--------------------------------------------------------------------------------
1 | package com.kmmt.analytics.core
2 |
3 |
4 | data class AppInfo(
5 | val deviceID: String,
6 | val deviceName: String,
7 | val deviceModel: String,
8 | val IP: String,
9 | val OS: String,
10 | val OSVersion: String,
11 | val appID: String,
12 | val appVersion: String,
13 | val appVersionCode: String,
14 | val appBuildType: BuildType,
15 | val appBuildFlavor: String
16 | ) {
17 | fun isRelease(): Boolean {
18 | return appBuildType == BuildType.RELEASE
19 | }
20 | }
21 |
22 | enum class BuildType(buildType:String){
23 | DEBUG("debug"),
24 | RELEASE("release")
25 | }
--------------------------------------------------------------------------------
/kmmtshared/analytics/src/commonMain/kotlin/com/kmmt/analytics/event/log/EventExtensions.kt:
--------------------------------------------------------------------------------
1 | package com.kmmt.analytics.event.log
2 |
3 | import com.kmmt.analytics.event.log.events.BaseLogEvent
4 |
5 | fun BaseLogEvent.logEvent() {
6 | this.getEvent().logAnalyticsEvent()
7 | }
8 |
9 | fun BaseLogEvent.logEvent(data: Map) {
10 | var analyticsEvent = this.getEvent()
11 | data.forEach {
12 | analyticsEvent.eventProperties.add(it.key, it.value)
13 | }
14 | analyticsEvent.logAnalyticsEvent()
15 | }
--------------------------------------------------------------------------------
/kmmtshared/analytics/src/commonMain/kotlin/com/kmmt/analytics/event/log/LogCategory.kt:
--------------------------------------------------------------------------------
1 | package com.kmmt.analytics.event.log
2 |
3 | enum class LogCategory() {
4 | Critical,
5 | Error,
6 | Warning,
7 | Information,
8 | Debug
9 | }
--------------------------------------------------------------------------------
/kmmtshared/analytics/src/commonMain/kotlin/com/kmmt/analytics/event/log/events/BaseLogEvent.kt:
--------------------------------------------------------------------------------
1 | package com.kmmt.analytics.event.log.events
2 |
3 |
4 | import com.kmmt.analytics.core.AnalyticsEvent
5 | import com.kmmt.analytics.core.hash256
6 | import com.kmmt.analytics.event.log.LogCategory
7 | import kotlinx.datetime.Clock
8 | import kotlinx.datetime.TimeZone
9 | import kotlinx.datetime.toLocalDateTime
10 |
11 | sealed class BaseLogEvent(
12 | val eventType: String,
13 | var eventCategory: LogCategory = LogCategory.Information,
14 | val eventTime: String = Clock.System.now().toLocalDateTime(TimeZone.currentSystemDefault())
15 | .toString()
16 | ) {
17 |
18 | abstract fun properties(): Map
19 |
20 | fun getEvent(): AnalyticsEvent {
21 | return defaultEvent().add(properties = properties())
22 | }
23 |
24 | abstract fun getEventDesc(): String
25 |
26 | private fun defaultEvent(): AnalyticsEvent {
27 | return AnalyticsEvent(
28 | eventType,
29 | eventLog = this,
30 | eventDesc = getEventDesc(),
31 | eventTime = eventTime,
32 | eventCategory = eventCategory
33 | )
34 | }
35 |
36 | open fun getHashID(): String {
37 | return getEventDesc().hash256()
38 | }
39 |
40 | }
--------------------------------------------------------------------------------
/kmmtshared/analytics/src/commonMain/kotlin/com/kmmt/analytics/expectations/AnalyticsContext.kt:
--------------------------------------------------------------------------------
1 | package com.kmmt.analytics.expectations
2 |
3 | expect class AnalyticsContext
4 |
--------------------------------------------------------------------------------
/kmmtshared/analytics/src/commonMain/kotlin/com/kmmt/analytics/platforms/mixpanel/AnalyticsMixpanel.kt:
--------------------------------------------------------------------------------
1 | package com.kmmt.analytics.platforms.mixpanel
2 |
3 | import com.kmmt.analytics.core.AnalyticsEvent
4 | import com.kmmt.analytics.expectations.AnalyticsContext
5 |
6 | expect class AnalyticsMixpanel(analyticsContext: AnalyticsContext) {
7 | fun track(analyticsEvent: AnalyticsEvent)
8 | fun track(eventName:String, properties:Map)
9 | fun reset()
10 | fun setPeopleProperties(properties: Map)
11 | }
12 |
--------------------------------------------------------------------------------
/kmmtshared/analytics/src/commonMain/kotlin/com/kmmt/analytics/platforms/mixpanel/ExpectationsMixpanel.kt:
--------------------------------------------------------------------------------
1 | package com.kmmt.analytics.platforms.mixpanel
2 |
3 | import org.koin.core.module.KoinDefinition
4 | import org.koin.core.module.Module
5 |
6 |
7 | expect fun analyticsMixpanelModule(module: Module, key: String): KoinDefinition
8 |
9 |
--------------------------------------------------------------------------------
/kmmtshared/analytics/src/commonMain/kotlin/com/kmmt/analytics/platforms/uxcam/AnalyticsUXcam.kt:
--------------------------------------------------------------------------------
1 | package com.kmmt.analytics.platforms.uxcam
2 |
3 | import com.kmmt.analytics.core.AnalyticsEvent
4 | import com.kmmt.analytics.expectations.AnalyticsContext
5 |
6 | expect class AnalyticsUXCam(analyticsContext: AnalyticsContext) {
7 | fun track(analyticsEvent: AnalyticsEvent)
8 | }
9 |
--------------------------------------------------------------------------------
/kmmtshared/analytics/src/commonMain/kotlin/com/kmmt/analytics/platforms/uxcam/ExpectationsUXCam.kt:
--------------------------------------------------------------------------------
1 | package com.kmmt.analytics.platforms.uxcam
2 |
3 | import org.koin.core.module.KoinDefinition
4 | import org.koin.core.module.Module
5 |
6 |
7 | expect fun analyticsUXCamModule(module: Module, key: String): KoinDefinition
8 |
9 |
--------------------------------------------------------------------------------
/kmmtshared/analytics/src/iosMain/kotlin/com/kmmt/analytics/expectations/AnalyticsContext.kt:
--------------------------------------------------------------------------------
1 | package com.kmmt.analytics.expectations
2 |
3 | actual class AnalyticsContext(val apiToken: String)
--------------------------------------------------------------------------------
/kmmtshared/analytics/src/iosMain/kotlin/com/kmmt/analytics/platforms/mixpanel/AnalyticsMixpanel.kt:
--------------------------------------------------------------------------------
1 | package com.kmmt.analytics.platforms.mixpanel
2 |
3 | import cocoapods.Mixpanel.Mixpanel
4 | import com.kmmt.analytics.core.AnalyticsEvent
5 | import com.kmmt.analytics.expectations.AnalyticsContext
6 |
7 | actual class AnalyticsMixpanel actual constructor(analyticsContext: AnalyticsContext) {
8 |
9 | init {
10 | Mixpanel.sharedInstanceWithToken(analyticsContext.apiToken)
11 | }
12 |
13 | actual fun track(analyticsEvent: AnalyticsEvent) {
14 | Mixpanel.sharedInstance()?.track(
15 | analyticsEvent.eventDesc,
16 | analyticsEvent.eventProperties.getProperties().toMap()
17 | )
18 | }
19 |
20 | actual fun track(eventName:String, properties:Map)
21 | {
22 | Mixpanel.sharedInstance()?.track(eventName,properties.toMap())
23 | }
24 |
25 | actual fun reset() {
26 | Mixpanel.sharedInstance()?.reset()
27 | }
28 |
29 | actual fun setPeopleProperties(properties: Map)
30 | {
31 | Mixpanel.sharedInstance()?.people?.set(properties.toMap())
32 | }
33 |
34 | fun getMixpanel(): Mixpanel? {
35 | return Mixpanel.sharedInstance()
36 | }
37 | }
38 |
--------------------------------------------------------------------------------
/kmmtshared/analytics/src/iosMain/kotlin/com/kmmt/analytics/platforms/mixpanel/ExpectationsMixpanel.kt:
--------------------------------------------------------------------------------
1 | package com.kmmt.analytics.platforms.mixpanel
2 |
3 | import com.kmmt.analytics.expectations.AnalyticsContext
4 | import org.koin.core.module.KoinDefinition
5 | import org.koin.core.module.Module
6 |
7 |
8 | actual fun analyticsMixpanelModule(module: Module, key: String): KoinDefinition
9 | {
10 | return module.single { AnalyticsMixpanel(
11 | AnalyticsContext(
12 | key
13 | )
14 | ) }
15 | }
--------------------------------------------------------------------------------
/kmmtshared/analytics/src/iosMain/kotlin/com/kmmt/analytics/platforms/uxcam/AnalyticsUXcam.kt:
--------------------------------------------------------------------------------
1 | package com.kmmt.analytics.platforms.uxcam
2 |
3 | import cocoapods.UXCam.UXCam
4 | import cocoapods.UXCam.UXCamConfiguration
5 | import com.kmmt.analytics.core.AnalyticsEvent
6 | import com.kmmt.analytics.expectations.AnalyticsContext
7 | import com.kmmt.analytics.platforms.mixpanel.AnalyticsMixpanel
8 | import org.koin.core.component.KoinComponent
9 | import org.koin.core.component.inject
10 |
11 | actual class AnalyticsUXCam actual constructor(analyticsContext: AnalyticsContext):KoinComponent {
12 | private val mixpanel: AnalyticsMixpanel by inject()
13 | init {
14 | val configuration = UXCamConfiguration(appKey = analyticsContext.apiToken)
15 | UXCam.optIntoSchematicRecordings()
16 | UXCam.startWithConfiguration(configuration){ status ->
17 | if (status)
18 | {
19 | UXCam.urlForCurrentSession()?.let { sessionURL->
20 | mixpanel.getMixpanel()?.track("UXCam: Session Recording link", mapOf("session_url" to sessionURL))
21 | }
22 | UXCam.urlForCurrentUser()?.let { userURL->
23 | mixpanel.setPeopleProperties( mapOf("uxcam_user_url" to userURL))
24 | }
25 | }
26 | }
27 | }
28 |
29 | actual fun track(analyticsEvent: AnalyticsEvent) {
30 | UXCam.logEvent(
31 | analyticsEvent.eventDesc,
32 | analyticsEvent.eventProperties.getProperties().toMap()
33 | )
34 | }
35 |
36 | }
37 |
--------------------------------------------------------------------------------
/kmmtshared/analytics/src/iosMain/kotlin/com/kmmt/analytics/platforms/uxcam/ExpectationsMixpanel.kt:
--------------------------------------------------------------------------------
1 | package com.kmmt.analytics.platforms.uxcam
2 |
3 | import com.kmmt.analytics.expectations.AnalyticsContext
4 | import org.koin.core.module.KoinDefinition
5 | import org.koin.core.module.Module
6 |
7 |
8 | actual fun analyticsUXCamModule(module: Module, key: String): KoinDefinition
9 | {
10 | return module.single { AnalyticsUXCam(
11 | AnalyticsContext(
12 | key
13 | )
14 | ) }
15 | }
16 |
--------------------------------------------------------------------------------
/kmmtshared/common/src/androidMain/AndroidManifest.xml:
--------------------------------------------------------------------------------
1 |
2 |
--------------------------------------------------------------------------------
/kmmtshared/common/src/androidMain/kotlin/com/kmmt/common/dependencyInjection/Android.kt:
--------------------------------------------------------------------------------
1 | package com.kmmt.common.dependencyInjection
2 |
3 | import com.kmmt.common.expectations.Application
4 | import org.koin.core.component.KoinComponent
5 | import org.koin.core.component.inject
6 |
7 | object Android : KoinComponent {
8 | val application: Application by inject ()
9 | }
--------------------------------------------------------------------------------
/kmmtshared/common/src/androidMain/kotlin/com/kmmt/common/expectations/Application.kt:
--------------------------------------------------------------------------------
1 | package com.kmmt.common.expectations
2 |
3 | import android.app.Application
4 |
5 | actual open class Application(val application: Application)
--------------------------------------------------------------------------------
/kmmtshared/common/src/androidMain/kotlin/com/kmmt/common/expectations/Dispatchers.kt:
--------------------------------------------------------------------------------
1 | package com.kmmt.common.expectations
2 |
3 | import kotlinx.coroutines.CoroutineDispatcher
4 | import kotlinx.coroutines.Dispatchers
5 |
6 | actual val DispatcherMain: CoroutineDispatcher = Dispatchers.Main
7 |
8 | actual val DispatcherDefault: CoroutineDispatcher=Dispatchers.Default
--------------------------------------------------------------------------------
/kmmtshared/common/src/androidMain/kotlin/com/kmmt/common/expectations/platform.kt:
--------------------------------------------------------------------------------
1 | package com.kmmt.common.expectations
2 |
3 | import android.os.Build
4 | import com.kmmt.common.platforms.AndroidPlatform
5 | import com.kmmt.common.platforms.Platform
6 |
7 | actual val platform: Platform = AndroidPlatform("Android", Build.VERSION.SDK_INT)
8 |
--------------------------------------------------------------------------------
/kmmtshared/common/src/commonMain/kotlin/com/kmmt/common/expectations/Application.kt:
--------------------------------------------------------------------------------
1 | package com.kmmt.common.expectations
2 |
3 | expect open class Application
--------------------------------------------------------------------------------
/kmmtshared/common/src/commonMain/kotlin/com/kmmt/common/expectations/Dispatchers.kt:
--------------------------------------------------------------------------------
1 | package com.kmmt.common.expectations
2 |
3 | import kotlinx.coroutines.CoroutineDispatcher
4 |
5 | expect val DispatcherMain: CoroutineDispatcher
6 |
7 | expect val DispatcherDefault: CoroutineDispatcher
--------------------------------------------------------------------------------
/kmmtshared/common/src/commonMain/kotlin/com/kmmt/common/expectations/platform.kt:
--------------------------------------------------------------------------------
1 | package com.kmmt.common.expectations
2 |
3 | import com.kmmt.common.platforms.Platform
4 |
5 | expect val platform: Platform
--------------------------------------------------------------------------------
/kmmtshared/common/src/commonMain/kotlin/com/kmmt/common/extensions/JsonExtensions.kt:
--------------------------------------------------------------------------------
1 | package com.kmmt.common.extensions
2 |
3 | import com.kmmt.common.serialization.JsonSerializationHelper.Companion.JsonX
4 | import kotlinx.serialization.DeserializationStrategy
5 | import kotlinx.serialization.SerializationStrategy
6 | import kotlinx.serialization.decodeFromString
7 |
8 |
9 | fun T.toJsonString(serializer: SerializationStrategy): String {
10 | return JsonX().encodeToString(serializer, this)
11 | }
12 |
13 | //inline fun T.toJsonString(): String {
14 | // return JsonX().encodeToString(
15 | // this
16 | // )
17 | //}
18 |
19 | fun String.toObject(
20 | deserializer: DeserializationStrategy
21 | ): T {
22 | return JsonX().decodeFromString(
23 | deserializer,
24 | this
25 | )
26 | }
27 |
28 | inline fun String.toObject(): T {
29 | return JsonX().decodeFromString(this)
30 | }
--------------------------------------------------------------------------------
/kmmtshared/common/src/commonMain/kotlin/com/kmmt/common/extensions/StringExtensions.kt:
--------------------------------------------------------------------------------
1 | package com.kmmt.common.extensions
2 |
3 | fun String.toWordCaps(): String {
4 | val words = this.split(" ")
5 |
6 | var newStr = ""
7 |
8 | words.forEach {
9 | newStr += it.replaceFirstChar { if (it.isLowerCase()) it.titlecase() else it.toString() } + " "
10 | }
11 | return newStr.trim()
12 | }
--------------------------------------------------------------------------------
/kmmtshared/common/src/commonMain/kotlin/com/kmmt/common/models/Failure.kt:
--------------------------------------------------------------------------------
1 | package com.kmmt.common.models
2 |
3 | sealed class Failure(val message: String)
4 |
5 | class NetworkFailure(exception: Exception) : Failure(exception.message.toString())
6 | class DataBaseFailure(exception: Exception) : Failure(exception.message.toString())
7 |
--------------------------------------------------------------------------------
/kmmtshared/common/src/commonMain/kotlin/com/kmmt/common/platforms/Platform.kt:
--------------------------------------------------------------------------------
1 | package com.kmmt.common.platforms
2 |
3 | sealed class Platform(val osName: String)
4 | class AndroidPlatform(osName: String, val apiVersion: Int):Platform (osName)
5 | class IOSPlatform(osName: String, val osVersion: Double):Platform (osName)
--------------------------------------------------------------------------------
/kmmtshared/common/src/commonMain/kotlin/com/kmmt/common/platforms/PlatformBlocks.kt:
--------------------------------------------------------------------------------
1 | package com.kmmt.common.platforms
2 |
3 | import com.kmmt.common.expectations.platform
4 |
5 |
6 | fun runOnAndroid(
7 | androidPlatform: AndroidPlatform.() -> Unit
8 | ) {
9 | if (platform is AndroidPlatform) {
10 | androidPlatform.invoke(platform)
11 | }
12 | }
13 |
14 | fun runOniOS(
15 | android: IOSPlatform.() -> Unit
16 | ) {
17 | if (platform is IOSPlatform) {
18 | android.invoke(platform)
19 | }
20 | }
--------------------------------------------------------------------------------
/kmmtshared/common/src/commonMain/kotlin/com/kmmt/common/serialization/JsonSerializationHelper.kt:
--------------------------------------------------------------------------------
1 | package com.kmmt.common.serialization
2 |
3 | import kotlinx.serialization.json.Json
4 |
5 | class JsonSerializationHelper {
6 | companion object {
7 | fun JsonX(): Json {
8 | return Json {
9 | ignoreUnknownKeys = true
10 | isLenient = true
11 | allowSpecialFloatingPointValues = true
12 | encodeDefaults = true
13 | }
14 | }
15 | }
16 | }
--------------------------------------------------------------------------------
/kmmtshared/common/src/iosMain/kotlin/com/kmmt/common/dependencyInjection/IOS.kt:
--------------------------------------------------------------------------------
1 | package com.kmmt.common.dependencyInjection
2 |
3 | import com.kmmt.common.expectations.Application
4 | import org.koin.core.component.KoinComponent
5 | import org.koin.core.component.inject
6 |
7 | object IOS : KoinComponent {
8 | val application: Application by inject ()
9 | }
--------------------------------------------------------------------------------
/kmmtshared/common/src/iosMain/kotlin/com/kmmt/common/expectations/Application.kt:
--------------------------------------------------------------------------------
1 | package com.kmmt.common.expectations
2 |
3 | import platform.UIKit.UIApplication
4 |
5 | actual open class Application(val uiApplication: UIApplication)
--------------------------------------------------------------------------------
/kmmtshared/common/src/iosMain/kotlin/com/kmmt/common/expectations/Dispatchers.kt:
--------------------------------------------------------------------------------
1 | package com.kmmt.common.expectations
2 |
3 | import kotlinx.coroutines.CoroutineDispatcher
4 | import kotlinx.coroutines.Dispatchers
5 | import kotlinx.coroutines.Runnable
6 | import platform.darwin.dispatch_async
7 | import platform.darwin.dispatch_get_main_queue
8 | import platform.darwin.dispatch_queue_t
9 | import kotlin.coroutines.CoroutineContext
10 |
11 | actual val DispatcherMain: CoroutineDispatcher = NsQueueDispatcher(dispatch_get_main_queue())
12 |
13 | internal class NsQueueDispatcher(
14 | private val dispatchQueue: dispatch_queue_t
15 | ) : CoroutineDispatcher() {
16 | override fun dispatch(context: CoroutineContext, block: Runnable) {
17 | try {
18 | dispatch_async(dispatchQueue) {
19 | try {
20 | block.run()
21 | } catch (e: Exception) {
22 | print("ApplicationDispatcher Exception in ios block.run() " + e.message)
23 | }
24 |
25 | }
26 | } catch (e: Exception) {
27 | print("ApplicationDispatcher Exception in ios " + e.message)
28 | }
29 | }
30 | }
31 |
32 | actual val DispatcherDefault: CoroutineDispatcher = Dispatchers.Main
--------------------------------------------------------------------------------
/kmmtshared/common/src/iosMain/kotlin/com/kmmt/common/expectations/platform.kt:
--------------------------------------------------------------------------------
1 | package com.kmmt.common.expectations
2 |
3 | import com.kmmt.common.platforms.IOSPlatform
4 | import com.kmmt.common.platforms.Platform
5 | import platform.UIKit.UIDevice
6 |
7 | actual val platform: Platform = IOSPlatform(UIDevice.currentDevice.systemName(), UIDevice.currentDevice.systemVersion.toDouble())
8 |
--------------------------------------------------------------------------------
/kmmtshared/core/src/androidMain/AndroidManifest.xml:
--------------------------------------------------------------------------------
1 |
2 |
--------------------------------------------------------------------------------
/kmmtshared/core/src/androidMain/kotlin/com/kmmt/core/extensions/ViewExtensions.kt:
--------------------------------------------------------------------------------
1 | package com.kmmt.core.extensions
2 |
3 | import android.view.View
4 |
5 | fun View.setClickAction(onClick: () -> Unit)
6 | {
7 | setOnClickListener {
8 | onClick.invoke()
9 | }
10 | }
--------------------------------------------------------------------------------
/kmmtshared/core/src/androidMain/kotlin/com/kmmt/core/platform/expectations/PlatformExpectations.kt:
--------------------------------------------------------------------------------
1 | package com.kmmt.core.platform.expectations
2 |
3 | import android.os.Bundle
4 | import com.kmmt.core.bundle.BundleValues
5 |
6 |
7 | actual class BundleParcel(val bundle: Bundle) {
8 | actual constructor(extras: BundleValues) : this(Bundle()) {
9 | extras.getKeys().forEach { key ->
10 | extras.getValue(key)?.let { value ->
11 | when (value) {
12 | is String -> {
13 | bundle.putString(key, value)
14 | }
15 | is Boolean -> {
16 | bundle.putBoolean(key, value)
17 | }
18 | is Int -> {
19 | bundle.putInt(key, value)
20 | }
21 | is Long -> {
22 | bundle.putLong(key, value)
23 | }
24 | is Float -> {
25 | bundle.putFloat(key, value)
26 | }
27 | is Double -> {
28 | bundle.putDouble(key, value)
29 | }
30 | }
31 | }
32 | }
33 | }
34 | }
35 |
36 |
37 |
38 |
--------------------------------------------------------------------------------
/kmmtshared/core/src/androidTest/kotlin/com/kmmt/core/androidTest.kt:
--------------------------------------------------------------------------------
1 | package com.kmmt.core
2 |
3 |
4 | class AndroidGreetingTest {
5 |
6 | }
--------------------------------------------------------------------------------
/kmmtshared/core/src/commonMain/kotlin/com/kmmt/core/architecture/presenter/viewState/ViewState.kt:
--------------------------------------------------------------------------------
1 | package com.kmmt.core.architecture.presenter.viewState
2 |
3 | enum class ViewState {
4 | UNKNOWN,
5 | INITIALIZED,
6 | STARTED,
7 | DETACHED
8 | }
--------------------------------------------------------------------------------
/kmmtshared/core/src/commonMain/kotlin/com/kmmt/core/architecture/repository/BaseRepository.kt:
--------------------------------------------------------------------------------
1 | package com.kmmt.core.architecture.repository
2 |
3 | import com.kmmt.common.functional.Either
4 | import com.kmmt.common.models.Failure
5 |
6 | interface BaseRepository {
7 | suspend fun execute(inputParamsType: InputParamsType): Either
8 | }
--------------------------------------------------------------------------------
/kmmtshared/core/src/commonMain/kotlin/com/kmmt/core/architecture/usecase/BaseRepositoryUseCase.kt:
--------------------------------------------------------------------------------
1 | package com.kmmt.core.architecture.usecase
2 |
3 | import com.kmmt.core.architecture.repository.BaseRepository
4 | import com.kmmt.core.architecture.presenter.async.Async
5 | import com.kmmt.common.functional.Either
6 | import com.kmmt.common.models.Failure
7 |
8 | open class BaseRepositoryUseCase(
9 | private val repository: BaseRepository,
10 | taskLimit: TaskLimit = TaskLimit.Single
11 | ) : BaseUseCase(taskLimit) where ReturnType : Any, InputParamsType : Any {
12 | private lateinit var async: Async
13 |
14 | constructor(
15 | async: Async,
16 | repository: BaseRepository,
17 | taskLimit: TaskLimit = TaskLimit.Single
18 | ) : this(repository, taskLimit) {
19 | this.async = async
20 | }
21 |
22 |
23 | override suspend fun run(params: InputParamsType): Either {
24 | return repository.execute(params)
25 | }
26 | }
--------------------------------------------------------------------------------
/kmmtshared/core/src/commonMain/kotlin/com/kmmt/core/architecture/usecase/BaseUseCase.kt:
--------------------------------------------------------------------------------
1 | package com.kmmt.core.architecture.usecase
2 |
3 | import com.kmmt.core.architecture.presenter.async.Async
4 | import com.kmmt.common.functional.Either
5 | import com.kmmt.common.models.Failure
6 | import kotlinx.coroutines.CancellationException
7 | import kotlinx.coroutines.Deferred
8 | import kotlinx.coroutines.async
9 | import kotlinx.coroutines.flow.Flow
10 | import kotlinx.coroutines.flow.flow
11 |
12 | abstract class BaseUseCase(
13 | private val taskLimit: TaskLimit = TaskLimit.Single
14 | ) where ReturnType : Any, InputParamsType : Any {
15 | private lateinit var async: Async
16 |
17 | constructor(async: Async, taskLimit: TaskLimit = TaskLimit.Single) : this(taskLimit) {
18 | this.async = async
19 | }
20 |
21 | fun setAsync(async: Async)
22 | {
23 | this.async = async
24 | }
25 |
26 | private lateinit var taskDeferred: Deferred>
27 |
28 | abstract suspend fun run(params: InputParamsType): Either
29 |
30 | operator fun invoke(params: InputParamsType): Flow> = flow {
31 | if (taskLimit == TaskLimit.Single) {
32 | cancelPendingTasks()
33 | }
34 | taskDeferred = async.getBackgroundCoroutineScope().async {
35 | run(params)
36 | }
37 | emit(taskDeferred.await())
38 | }
39 |
40 | fun cancelPendingTasks() {
41 | if (this@BaseUseCase::taskDeferred.isInitialized) {
42 | taskDeferred.cancel(CancellationException("New Request came"))
43 | }
44 | }
45 |
46 | enum class TaskLimit {
47 | Single,
48 | Multiple
49 | }
50 | }
--------------------------------------------------------------------------------
/kmmtshared/core/src/commonMain/kotlin/com/kmmt/core/architecture/view/BaseView.kt:
--------------------------------------------------------------------------------
1 | package com.kmmt.core.architecture.view
2 |
3 | import dev.icerock.moko.resources.StringResource
4 |
5 |
6 | interface BaseView{
7 | fun showPopUpMessage(message: String)
8 | fun showPopUpMessage(title:String,message: String)
9 | fun showLoading(loadingLabel:String)
10 | fun dismissLoading()
11 | fun setPageTitle(title: String)
12 | }
13 |
--------------------------------------------------------------------------------
/kmmtshared/core/src/commonMain/kotlin/com/kmmt/core/dataFlow/FlowState.kt:
--------------------------------------------------------------------------------
1 | package com.kmmt.core.dataFlow
2 |
3 |
4 | sealed class FlowState {
5 | data class Success(val data: T) : FlowState()
6 | data class Error(val exception: String) : FlowState()
7 | object Empty : FlowState()
8 | object Loading : FlowState()
9 | }
--------------------------------------------------------------------------------
/kmmtshared/core/src/commonMain/kotlin/com/kmmt/core/extensions/FlowExtensions.kt:
--------------------------------------------------------------------------------
1 | package com.kmmt.core.extensions
2 |
3 | import kotlinx.coroutines.flow.Flow
4 | import kotlinx.coroutines.flow.flow
5 |
6 | public fun flowOf(elements: List): Flow = flow {
7 | for (element in elements) {
8 | emit(element)
9 | }
10 | }
--------------------------------------------------------------------------------
/kmmtshared/core/src/commonMain/kotlin/com/kmmt/core/liveData/LiveData.kt:
--------------------------------------------------------------------------------
1 | package com.kmmt.core.liveData
2 |
3 | import com.kmmt.core.liveData.lifecycle.LiveDataLifecycle
4 |
5 | expect open class LiveDataX() {
6 | fun observeForever(block: (T) -> Unit)
7 | open val value : T?
8 |
9 | fun hasObservers() : Boolean
10 |
11 | fun observe(lifecycle: LiveDataLifecycle, block: (T) -> Unit)
12 | }
13 |
14 | expect open class MutableLiveDataX() : LiveDataX {
15 | override var value : T?
16 | }
17 |
18 | expect class MediatorLiveDataX() : MutableLiveDataX {
19 | fun addSource(other: LiveDataX, block: ((S) -> Unit))
20 | fun removeSource(other: LiveDataX<*>)
21 | }
--------------------------------------------------------------------------------
/kmmtshared/core/src/commonMain/kotlin/com/kmmt/core/liveData/LiveDataObservable.kt:
--------------------------------------------------------------------------------
1 | package com.kmmt.core.liveData
2 |
3 | import com.kmmt.core.liveData.lifecycle.LiveDataLifecycle
4 |
5 | open class LiveDataObservable(private val lifeCycle:LiveDataLifecycle) {
6 | private var kMediatorLiveData = MediatorLiveDataX()
7 |
8 | fun setValue(value: T) {
9 | kMediatorLiveData.value = value
10 | }
11 |
12 | fun addSource(liveData: LiveDataX) {
13 | kMediatorLiveData.addSource(liveData) {
14 | kMediatorLiveData.value=it
15 | }
16 | }
17 |
18 | fun addSource(liveData: LiveDataX, converter: ((T1) -> T)) {
19 | kMediatorLiveData.addSource(liveData){
20 | kMediatorLiveData.value=converter.invoke(it)
21 | }
22 | }
23 |
24 | fun observe(result: (T) -> Unit) {
25 | kMediatorLiveData.observe(lifeCycle) {
26 | result.invoke(it)
27 | }
28 | }
29 |
30 | }
--------------------------------------------------------------------------------
/kmmtshared/core/src/commonMain/kotlin/com/kmmt/core/liveData/LiveDataOperators.kt:
--------------------------------------------------------------------------------
1 | package com.kmmt.core.liveData
2 |
3 | fun zip(a: LiveDataX, b: LiveDataX): LiveDataX> {
4 | return MediatorLiveDataX>().apply {
5 | var lastA: A? = null
6 | var lastB: B? = null
7 |
8 | fun update() {
9 | val localLastA = lastA
10 | val localLastB = lastB
11 | if (localLastA != null && localLastB != null)
12 | this.value = Pair(localLastA, localLastB)
13 | }
14 |
15 | addSource(a) {
16 | lastA = it
17 | update()
18 | }
19 | addSource(b) {
20 | lastB = it
21 | update()
22 | }
23 | }
24 | }
25 |
26 | fun zip(a: LiveDataX, b: LiveDataX, c: LiveDataX): LiveDataX> {
27 | return MediatorLiveDataX>().apply {
28 | var lastA: A? = null
29 | var lastB: B? = null
30 | var lastC: C? = null
31 |
32 | fun update() {
33 | val localLastA = lastA
34 | val localLastB = lastB
35 | val localLastC = lastC
36 | if (localLastA != null && localLastB != null && localLastC != null)
37 | this.value = Triple(localLastA, localLastB, localLastC)
38 | }
39 |
40 | addSource(a) {
41 | lastA = it
42 | update()
43 | }
44 | addSource(b) {
45 | lastB = it
46 | update()
47 | }
48 | addSource(c) {
49 | lastC = it
50 | update()
51 | }
52 | }
53 | }
--------------------------------------------------------------------------------
/kmmtshared/core/src/commonMain/kotlin/com/kmmt/core/liveData/LiveDataTransformations.kt:
--------------------------------------------------------------------------------
1 | package com.kmmt.core.liveData
2 |
3 | fun LiveDataX.map(mapFunction: (X) -> Y): LiveDataX {
4 | return Transformations.map(this, mapFunction)
5 | }
6 |
7 | fun LiveDataX.switchMap(switchMapFunction: (X) -> LiveDataX): LiveDataX {
8 | return Transformations.switchMap(this, switchMapFunction)
9 | }
10 |
11 | object Transformations {
12 |
13 | fun map(
14 | source: LiveDataX,
15 | mapFunction: (X) -> Y): LiveDataX {
16 | val result = MediatorLiveDataX()
17 | result.addSource(source) { value ->
18 | result.value = mapFunction.invoke(value)
19 | }
20 | return result
21 | }
22 |
23 | fun switchMap(
24 | source: LiveDataX,
25 | switchMapFunction: (X) -> LiveDataX): LiveDataX {
26 | val result = MediatorLiveDataX()
27 |
28 | var mSource: LiveDataX? = null
29 |
30 | result.addSource(source) { x ->
31 | val newLiveData = switchMapFunction.invoke(x)
32 | if (mSource === newLiveData) {
33 | return@addSource
34 | }
35 | mSource?.let {
36 | result.removeSource(it)
37 | }
38 | mSource = newLiveData
39 | mSource?.let {
40 | result.addSource(it) { y ->
41 | result.value = y
42 | }
43 | }
44 | }
45 | return result
46 | }
47 | }
--------------------------------------------------------------------------------
/kmmtshared/core/src/commonMain/kotlin/com/kmmt/core/liveData/lifecycle/LiveDataLifecycle.kt:
--------------------------------------------------------------------------------
1 | package com.kmmt.core.liveData.lifecycle
2 |
3 | class LiveDataLifecycle {
4 |
5 | private val lifecycleStopObservers = mutableListOf<() -> Unit>()
6 | val tags = mutableMapOf()
7 |
8 | var isStarted : Boolean = false
9 | get
10 | private set
11 |
12 | fun start(){
13 | isStarted = true
14 | }
15 | fun stop() {
16 | isStarted = false
17 |
18 | notifyObserversStop()
19 | }
20 |
21 | fun addStopObserver(block: () -> Unit){
22 | lifecycleStopObservers.add(block)
23 | }
24 |
25 | fun notifyObserversStop(){
26 | lifecycleStopObservers.forEach {
27 | it()
28 | }
29 | lifecycleStopObservers.clear()
30 | }
31 | }
32 |
33 |
--------------------------------------------------------------------------------
/kmmtshared/core/src/commonMain/kotlin/com/kmmt/core/liveData/lifecycle/LiveDataLifecycleAndObserver.kt:
--------------------------------------------------------------------------------
1 | package com.kmmt.core.liveData.lifecycle
2 |
3 | class LiveDataLifecycleAndObserver(val lifecycle: LiveDataLifecycle){
4 |
5 | val observers = mutableListOf<(T) -> Unit>()
6 |
7 | init {
8 | lifecycle.addStopObserver {
9 | observers.clear()
10 | }
11 | }
12 |
13 | }
--------------------------------------------------------------------------------
/kmmtshared/core/src/commonMain/kotlin/com/kmmt/core/platform/expectations/PlatformExpectations.kt:
--------------------------------------------------------------------------------
1 | package com.kmmt.core.platform.expectations
2 |
3 | import com.kmmt.core.bundle.BundleValues
4 |
5 |
6 | expect class BundleParcel(extras: BundleValues)
7 |
8 |
--------------------------------------------------------------------------------
/kmmtshared/core/src/commonTest/kotlin/com/kmmt/core/commonTest.kt:
--------------------------------------------------------------------------------
1 | package com.kmmt.core
2 |
3 | import kotlin.test.Test
4 | import kotlin.test.assertTrue
5 |
6 | class CommonGreetingTest {
7 |
8 | @Test
9 | fun testExample() {
10 | assertTrue(Greeting().greeting().contains("Hello"), "Check 'Hello' is mentioned")
11 | }
12 | }
--------------------------------------------------------------------------------
/kmmtshared/core/src/iosMain/kotlin/com/kmmt/core/platform/expectations/PlatformExpectations.kt:
--------------------------------------------------------------------------------
1 | package com.kmmt.core.platform.expectations
2 |
3 | import com.kmmt.core.bundle.BundleValues
4 |
5 |
6 | actual class BundleParcel actual constructor(var extras: BundleValues)
7 |
8 |
--------------------------------------------------------------------------------
/kmmtshared/core/src/iosTest/kotlin/com/kmmt/core/iosTest.kt:
--------------------------------------------------------------------------------
1 | package com.kmmt.core
2 |
3 | import kotlin.test.Test
4 | import kotlin.test.assertTrue
5 |
6 | class IosGreetingTest {
7 |
8 | }
--------------------------------------------------------------------------------
/kmmtshared/domain/src/androidMain/AndroidManifest.xml:
--------------------------------------------------------------------------------
1 |
2 |
--------------------------------------------------------------------------------
/kmmtshared/domain/src/commonMain/kotlin/com/kmmt/domain/demo/cache/BreedListCache.kt:
--------------------------------------------------------------------------------
1 | package com.kmmt.domain.demo.cache
2 |
3 | import com.kmmt.core.dataSync.BaseDataCache
4 | import com.kmmt.common.functional.Either
5 | import com.kmmt.common.models.DataBaseFailure
6 | import com.kmmt.common.models.Failure
7 | import com.kmmt.models.demo.domain.Breed
8 | import com.kmmt.network.apis.BreedServiceAPI
9 | import com.kmmt.persistance.dataSources.breed.BreedDataSource
10 | import kotlinx.coroutines.CoroutineScope
11 | import org.koin.core.component.KoinComponent
12 |
13 | class BreedListCache(backgroundCoroutineScope: CoroutineScope, private val breedDataSource: BreedDataSource) :
14 | BaseDataCache>(backgroundCoroutineScope, "BREED_SYNC_TIME"),KoinComponent {
15 |
16 | override suspend fun getData(param: Unit): Either, Failure> {
17 | return BreedServiceAPI().getBreeds()
18 | }
19 |
20 | override suspend fun saveData(data: List): Either {
21 | return try {
22 | breedDataSource.insertBreeds(data)
23 | Either.Success(true)
24 | } catch (e: Exception) {
25 | Either.Failure(DataBaseFailure(e))
26 | }
27 | }
28 | }
--------------------------------------------------------------------------------
/kmmtshared/domain/src/commonMain/kotlin/com/kmmt/domain/demotvshowsearch/repository/TVShowSearchRepository.kt:
--------------------------------------------------------------------------------
1 | package com.kmmt.domain.demotvshowsearch.repository
2 |
3 | import com.kmmt.models.demotvshowsearch.domain.TVShowInfo
4 | import com.kmmt.core.architecture.repository.BaseRepository
5 | import com.kmmt.common.functional.Either
6 | import com.kmmt.common.models.Failure
7 | import com.kmmt.network.apis.TVMazeAPI
8 |
9 |
10 | interface ITVShowSearchRepository : BaseRepository>
11 |
12 | class TVShowSearchRepositoryTVMazeAPI : ITVShowSearchRepository {
13 | override suspend fun execute(inputParamsType: String): Either, Failure> {
14 | return TVMazeAPI().getTVShows(inputParamsType)
15 | }
16 | }
17 |
18 | class TVShowSearchRepositoryMock : ITVShowSearchRepository {
19 | override suspend fun execute(inputParamsType: String): Either, Failure> {
20 | return Either.Success(listOf(TVShowInfo(11,"Test","Test","Test","Test")))
21 | }
22 | }
--------------------------------------------------------------------------------
/kmmtshared/domain/src/commonMain/kotlin/com/kmmt/domain/demotvshowsearch/usecase/TVShowSearchUseCase.kt:
--------------------------------------------------------------------------------
1 | package com.kmmt.domain.demotvshowsearch.usecase
2 |
3 | import com.kmmt.domain.demotvshowsearch.repository.ITVShowSearchRepository
4 | import com.kmmt.common.functional.Either
5 | import com.kmmt.common.models.Failure
6 | import com.kmmt.core.architecture.usecase.BaseRepositoryUseCase
7 | import com.kmmt.core.architecture.usecase.BaseUseCase
8 | import com.kmmt.models.demotvshowsearch.domain.TVShowInfo
9 | import com.kmmt.network.apis.TVMazeAPI
10 |
11 | class TVShowSearchUseCase() : BaseUseCase>() {
12 | override suspend fun run(params: String): Either, Failure> {
13 | return TVMazeAPI().getTVShows(params)
14 | }
15 | }
16 |
17 | class TVShowSearchRepoUseCase(
18 | repository: ITVShowSearchRepository
19 | ) : BaseRepositoryUseCase>( repository)
--------------------------------------------------------------------------------
/kmmtshared/injector/src/androidMain/AndroidManifest.xml:
--------------------------------------------------------------------------------
1 |
2 |
--------------------------------------------------------------------------------
/kmmtshared/models/src/androidMain/AndroidManifest.xml:
--------------------------------------------------------------------------------
1 |
2 |
--------------------------------------------------------------------------------
/kmmtshared/models/src/commonMain/kotlin/com/kmmt/models/demo/domain/Breed.kt:
--------------------------------------------------------------------------------
1 | package com.kmmt.models.demo.domain
2 |
3 | data class Breed(
4 | val id: Long,
5 | val name: String,
6 | val favorite: Boolean
7 | )
8 |
--------------------------------------------------------------------------------
/kmmtshared/models/src/commonMain/kotlin/com/kmmt/models/demo/domain/CredentialsModel.kt:
--------------------------------------------------------------------------------
1 | package com.kmmt.models.demo.domain
2 |
3 |
4 | data class CredentialsModel(val username:String, val password:String)
--------------------------------------------------------------------------------
/kmmtshared/models/src/commonMain/kotlin/com/kmmt/models/demo/domain/PostModel.kt:
--------------------------------------------------------------------------------
1 | package com.kmmt.models.demo.domain
2 |
3 | import kotlinx.serialization.SerialName
4 | import kotlinx.serialization.Serializable
5 |
6 |
7 | @Serializable
8 | data class PostModel(
9 | @SerialName("username")
10 | var username: String = "",
11 | @SerialName("body")
12 | var body: String? = null,
13 | @SerialName("email")
14 | var email: String? = null,
15 | @SerialName("id")
16 | var id: Int,
17 | @SerialName("name")
18 | var name: String? = null,
19 | @SerialName("postId")
20 | var postId: Int? = null
21 | )
--------------------------------------------------------------------------------
/kmmtshared/models/src/commonMain/kotlin/com/kmmt/models/demo/domain/UserModel.kt:
--------------------------------------------------------------------------------
1 | package com.kmmt.models.demo.domain
2 |
3 | import kotlinx.serialization.SerialName
4 | import kotlinx.serialization.Serializable
5 |
6 |
7 | @Serializable
8 | data class UserModel(
9 | @SerialName("email")
10 | var email: String = "",
11 | @SerialName("firstname")
12 | var firstname: String = "",
13 | @SerialName("lastname")
14 | var lastname: String = "",
15 | @SerialName("password")
16 | var password: String = "",
17 | @SerialName("username")
18 | var username: String = ""
19 | )
--------------------------------------------------------------------------------
/kmmtshared/models/src/commonMain/kotlin/com/kmmt/models/demo/dto/BreedResult.kt:
--------------------------------------------------------------------------------
1 | package com.kmmt.models.demo.dto
2 |
3 | import kotlinx.serialization.Serializable
4 |
5 | @Serializable
6 | data class BreedResult(
7 | val message: Map>,
8 | var status: String
9 | )
10 |
11 |
--------------------------------------------------------------------------------
/kmmtshared/models/src/commonMain/kotlin/com/kmmt/models/demotvshowsearch/domain/TVShowInfo.kt:
--------------------------------------------------------------------------------
1 | package com.kmmt.models.demotvshowsearch.domain
2 |
3 | data class TVShowInfo(
4 | val id:Long,
5 | var name:String?,
6 | val language: String?,
7 | val image:String?,
8 | val summary:String?
9 | )
--------------------------------------------------------------------------------
/kmmtshared/models/src/commonMain/kotlin/com/kmmt/models/demotvshowsearch/dto/TMDBTVSearchDTO.kt:
--------------------------------------------------------------------------------
1 | package com.kmmt.models.demotvshowsearch.dto
2 | import kotlinx.serialization.Serializable
3 |
4 | import kotlinx.serialization.SerialName
5 |
6 |
7 | @Serializable
8 | data class TMDBResult(
9 | @SerialName("page")
10 | val page: Int?,
11 | @SerialName("results")
12 | val results: List,
13 | @SerialName("total_pages")
14 | val totalPages: Int?,
15 | @SerialName("total_results")
16 | val totalResults: Int?
17 | )
18 |
19 | @Serializable
20 | data class Result(
21 | @SerialName("backdrop_path")
22 | val backdropPath: String?,
23 | @SerialName("first_air_date")
24 | val firstAirDate: String?=null,
25 | @SerialName("genre_ids")
26 | val genreIds: List?,
27 | @SerialName("id")
28 | val id: Int,
29 | @SerialName("name")
30 | val name: String?,
31 | @SerialName("origin_country")
32 | val originCountry: List?,
33 | @SerialName("original_language")
34 | val originalLanguage: String?,
35 | @SerialName("original_name")
36 | val originalName: String?,
37 | @SerialName("overview")
38 | val overview: String?,
39 | @SerialName("popularity")
40 | val popularity: Double?,
41 | @SerialName("poster_path")
42 | val posterPath: String?,
43 | @SerialName("vote_average")
44 | val voteAverage: Double?,
45 | @SerialName("vote_count")
46 | val voteCount: Int?
47 | )
--------------------------------------------------------------------------------
/kmmtshared/network/src/androidMain/AndroidManifest.xml:
--------------------------------------------------------------------------------
1 |
2 |
--------------------------------------------------------------------------------
/kmmtshared/network/src/commonMain/kotlin/com/kmmt/network/apis/BreedServiceAPI.kt:
--------------------------------------------------------------------------------
1 | package com.kmmt.network.apis
2 |
3 | import com.kmmt.common.extensions.toWordCaps
4 | import com.kmmt.common.functional.Either
5 | import com.kmmt.common.functional.flatMap
6 | import com.kmmt.common.models.NetworkFailure
7 | import com.kmmt.models.demo.domain.Breed
8 | import com.kmmt.models.demo.dto.BreedResult
9 | import com.kmmt.network.core.BaseAPI
10 |
11 | class BreedServiceAPI : BaseAPI() {
12 | override val baseUrl: String
13 | get() = "https://dog.ceo/"
14 |
15 | suspend fun getBreeds(): Either, NetworkFailure> {
16 | return doGet("api/breeds/list/all").flatMap { breedResult ->
17 | //Converting BreedResult to List
18 | Either.Success(
19 | breedResult.message.keys
20 | .sorted().toList()
21 | .map { Breed(0L, name = it.toWordCaps(), false) }
22 | )
23 | }
24 | }
25 | }
26 |
27 |
28 |
--------------------------------------------------------------------------------
/kmmtshared/network/src/commonMain/kotlin/com/kmmt/network/apis/JsonPlaceHolderServiceAPI.kt:
--------------------------------------------------------------------------------
1 | package com.kmmt.network.apis
2 |
3 | import com.kmmt.common.functional.Either
4 | import com.kmmt.common.functional.flatMap
5 | import com.kmmt.common.models.NetworkFailure
6 | import com.kmmt.models.demo.domain.CredentialsModel
7 | import com.kmmt.models.demo.domain.PostModel
8 | import com.kmmt.models.demo.domain.UserModel
9 | import com.kmmt.network.core.BaseAPI
10 |
11 | class JsonPlaceHolderServiceAPI : BaseAPI() {
12 | override val baseUrl: String
13 | get() = "https://my-json-server.typicode.com/"
14 |
15 | suspend fun authenticate(credentails: CredentialsModel): Either {
16 | var result =
17 | doGet>("jittya/jsonserver/users?username=${credentails.username}&password=${credentails.password}")
18 |
19 | return result.flatMap {
20 | Either.Success(it.any { it.username == credentails.username && it.password == credentails.password })
21 | }
22 |
23 | }
24 |
25 | suspend fun getPosts(username: String): Either, NetworkFailure> {
26 | return doGet("jittya/jsonserver/post?username=$username")
27 | }
28 |
29 | //Example POST Method
30 | private suspend fun setPost(post: PostModel): Either {
31 | return doPost("comments", post)
32 | }
33 | }
--------------------------------------------------------------------------------
/kmmtshared/network/src/commonMain/kotlin/com/kmmt/network/apis/TVMazeAPI.kt:
--------------------------------------------------------------------------------
1 | package com.kmmt.network.apis
2 |
3 | import com.kmmt.common.functional.Either
4 | import com.kmmt.common.functional.map
5 | import com.kmmt.common.models.NetworkFailure
6 | import com.kmmt.models.demotvshowsearch.dto.TMDBResult
7 | import com.kmmt.models.demotvshowsearch.domain.TVShowInfo
8 | import com.kmmt.network.core.BaseAPI
9 | import io.ktor.http.*
10 |
11 | class TVMazeAPI : BaseAPI() {
12 | override val baseUrl: String
13 | get() = "https://api.themoviedb.org/"
14 | // https://api.themoviedb.org/3/search/tv?api_key=2b24827469d6d5b0fd06aed8a5e2d358&query=money
15 |
16 | suspend fun getTVShows(query: String): Either, NetworkFailure> {
17 | //Converting DTO to Application Domain Object
18 |
19 | return doGet(
20 | "3/search/tv?query=${query.encodeURLPath()}&api_key=2b24827469d6d5b0fd06aed8a5e2d358"
21 | ).map { tvShowDTOItem ->
22 | println("Size : "+tvShowDTOItem.results.size)
23 | tvShowDTOItem.results.map {
24 | TVShowInfo(
25 | it.id.toLong(),
26 | it.name,
27 | it.originalLanguage,
28 | it.posterPath,
29 | it.overview
30 | )
31 | }
32 | }
33 | }
34 | }
--------------------------------------------------------------------------------
/kmmtshared/network/src/commonMain/kotlin/com/kmmt/network/core/BaseAPI.kt:
--------------------------------------------------------------------------------
1 | package com.kmmt.network.core
2 |
3 | import com.kmmt.common.functional.Either
4 | import com.kmmt.common.models.NetworkFailure
5 | import io.ktor.client.utils.*
6 | import io.ktor.http.*
7 |
8 | abstract class BaseAPI {
9 | abstract val baseUrl: String
10 | val httpHelper = HTTPHelper()
11 |
12 | fun URLBuilder.apiPath(endPoint: String, urlBuilder: URLBuilder.() -> Unit) {
13 | takeFrom(baseUrl)
14 | encodedPath = endPoint
15 | apply(urlBuilder)
16 | }
17 |
18 | suspend inline fun doGet(
19 | endPoint: String,
20 | noinline urlBuilder: URLBuilder.() -> Unit = {}
21 | ): Either {
22 | return try {
23 | val result = httpHelper.doGet {
24 | apply {
25 | apiPath(endPoint,urlBuilder)
26 | }
27 | }
28 | Either.Success(result)
29 | } catch (e: Exception) {
30 | Either.Failure(NetworkFailure(e))
31 | }
32 | }
33 |
34 | suspend inline fun doPost(
35 | endPoint: String,
36 | requestBody: Any = EmptyContent,
37 | noinline urlBuilder: URLBuilder.() -> Unit ={}
38 | ): Either {
39 | return try {
40 | val result = httpHelper.doPost(requestBody) {
41 | apply {
42 | apiPath(endPoint,urlBuilder)
43 | }
44 | }
45 | Either.Success(result)
46 | } catch (e: Exception) {
47 | Either.Failure(NetworkFailure(e))
48 | }
49 | }
50 | }
--------------------------------------------------------------------------------
/kmmtshared/network/src/commonMain/kotlin/com/kmmt/network/core/HTTPHelper.kt:
--------------------------------------------------------------------------------
1 | package com.kmmt.network.core
2 |
3 | import com.kmmt.common.serialization.JsonSerializationHelper
4 | import io.ktor.client.*
5 | import io.ktor.client.call.*
6 | import io.ktor.client.plugins.contentnegotiation.*
7 | import io.ktor.client.plugins.logging.*
8 | import io.ktor.client.request.*
9 | import io.ktor.client.utils.*
10 | import io.ktor.http.*
11 | import io.ktor.serialization.kotlinx.json.*
12 |
13 | class HTTPHelper {
14 |
15 | val client = HttpClient {
16 | install(ContentNegotiation) {
17 | json(JsonSerializationHelper.JsonX())
18 | }
19 | install(Logging) {
20 | logger = object : Logger {
21 | override fun log(message: String) {
22 | println("HTTPHelper Network > $message")
23 | }
24 | }
25 | level = LogLevel.INFO
26 | }
27 | }
28 |
29 | suspend inline fun doGet(
30 | urlBuilder: URLBuilder.()-> Unit
31 | ): T {
32 | return client.get {
33 | url.apply(urlBuilder)
34 | }.body()
35 | }
36 |
37 | suspend inline fun doPost(
38 | requestBody: Any = EmptyContent,
39 | urlBuilder: URLBuilder.()-> Unit
40 | ): T {
41 | return client.post {
42 | setBody(requestBody)
43 | url.apply(urlBuilder)
44 | contentType(ContentType.Application.Json)
45 | }.body()
46 | }
47 | }
--------------------------------------------------------------------------------
/kmmtshared/persistence/src/androidMain/AndroidManifest.xml:
--------------------------------------------------------------------------------
1 |
2 |
--------------------------------------------------------------------------------
/kmmtshared/persistence/src/androidMain/kotlin/com/kmmt/persistance/keyValueStore/settings/expectations/settings.kt:
--------------------------------------------------------------------------------
1 | package com.kmmt.persistance.keyValueStore.settings.expectations
2 |
3 | import android.content.Context
4 | import com.kmmt.common.dependencyInjection.Android
5 | import com.russhwolf.settings.AndroidSettings
6 | import com.russhwolf.settings.Settings
7 |
8 | actual val settings: Settings
9 | get() = AndroidSettings(Android.application.application.getSharedPreferences("KeyValueStore", Context.MODE_PRIVATE))
--------------------------------------------------------------------------------
/kmmtshared/persistence/src/androidMain/kotlin/com/kmmt/persistance/storage/sqlite/expectations/sqliteDriver.kt:
--------------------------------------------------------------------------------
1 | package com.kmmt.persistance.storage.sqlite.expectations
2 |
3 | import com.jittyandiyan.mobile.KMMTDB
4 | import com.kmmt.common.dependencyInjection.Android
5 | import com.squareup.sqldelight.android.AndroidSqliteDriver
6 | import com.squareup.sqldelight.db.SqlDriver
7 |
8 | actual val sqliteDriver: SqlDriver
9 | get() = AndroidSqliteDriver(KMMTDB.Schema, Android.application.application, "KMMTB.db")
--------------------------------------------------------------------------------
/kmmtshared/persistence/src/commonMain/kotlin/com/kmmt/persistance/dataSources/breed/BreedDataSource.kt:
--------------------------------------------------------------------------------
1 | package com.kmmt.persistance.dataSources.breed
2 |
3 | import com.kmmt.models.demo.domain.Breed
4 | import kotlinx.coroutines.flow.Flow
5 |
6 | interface BreedDataSource {
7 | fun getAllBreeds(): Flow>
8 | suspend fun insertBreeds(breeds: List)
9 | fun selectById(id: Long): Flow>
10 | suspend fun deleteAll()
11 | suspend fun updateFavorite(breedId: Long, favorite: Boolean)
12 | }
--------------------------------------------------------------------------------
/kmmtshared/persistence/src/commonMain/kotlin/com/kmmt/persistance/keyValueStore/settings/KeyValueStore.kt:
--------------------------------------------------------------------------------
1 | package com.kmmt.persistance.keyValueStore.settings
2 |
3 |
4 | import com.kmmt.persistance.keyValueStore.settings.dependencyInjection.Store
5 | import com.russhwolf.settings.Settings
6 | import com.russhwolf.settings.contains
7 | import com.russhwolf.settings.get
8 | import kotlinx.serialization.KSerializer
9 |
10 | fun storeValue(
11 | keyValueStore: Settings.() -> Unit
12 | ) {
13 | keyValueStore.invoke(Store.settings)
14 | }
15 |
16 | inline fun getStoreValue(key:String):T?
17 | {
18 | try {
19 | return Store.settings[key]
20 | } catch (e: IllegalArgumentException) {
21 | if (Store.settings.contains(key)) {
22 | throw IllegalArgumentException("KSerializer expected!. Use getStoreValue(key,KSerializer)")
23 | }
24 | throw e
25 | }
26 | }
27 |
28 | inline fun getStoreValue(key: String, serializer: KSerializer):T?
29 | {
30 | return Store.settings.getSerializable(key, serializer)
31 | }
--------------------------------------------------------------------------------
/kmmtshared/persistence/src/commonMain/kotlin/com/kmmt/persistance/keyValueStore/settings/SettingsExtensions.kt:
--------------------------------------------------------------------------------
1 | package com.kmmt.persistance.keyValueStore.settings
2 |
3 | import com.kmmt.common.extensions.toJsonString
4 | import com.kmmt.common.extensions.toObject
5 | import com.russhwolf.settings.Settings
6 | import kotlinx.serialization.KSerializer
7 |
8 |
9 | fun Settings.putSerializable(key: String, value: T, serializer: KSerializer