├── .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 | 9 | 10 | 14 | 15 | 19 | 20 | 24 | 25 | 29 | 30 | 34 | 35 | 39 | 40 | -------------------------------------------------------------------------------- /.idea/kotlinc.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 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 | 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) { 10 | this.putString(key, value.toJsonString(serializer)) 11 | } 12 | 13 | fun Settings.getSerializable(key: String, serializer: KSerializer): T? { 14 | return getStringOrNull(key)?.toObject(serializer) 15 | } -------------------------------------------------------------------------------- /kmmtshared/persistence/src/commonMain/kotlin/com/kmmt/persistance/keyValueStore/settings/dependencyInjection/Store.kt: -------------------------------------------------------------------------------- 1 | package com.kmmt.persistance.keyValueStore.settings.dependencyInjection 2 | 3 | import com.russhwolf.settings.Settings 4 | import org.koin.core.component.KoinComponent 5 | import org.koin.core.component.inject 6 | 7 | object Store : KoinComponent { 8 | val settings: Settings by inject () 9 | } -------------------------------------------------------------------------------- /kmmtshared/persistence/src/commonMain/kotlin/com/kmmt/persistance/keyValueStore/settings/expectations/settings.kt: -------------------------------------------------------------------------------- 1 | package com.kmmt.persistance.keyValueStore.settings.expectations 2 | 3 | import com.russhwolf.settings.Settings 4 | 5 | expect val settings: Settings -------------------------------------------------------------------------------- /kmmtshared/persistence/src/commonMain/kotlin/com/kmmt/persistance/storage/realm/RealmHelper.kt: -------------------------------------------------------------------------------- 1 | package com.kmmt.persistance.storage.realm 2 | 3 | import com.kmmt.common.expectations.DispatcherDefault 4 | import io.realm.kotlin.Realm 5 | import io.realm.kotlin.RealmConfiguration 6 | import io.realm.kotlin.notifications.ResultsChange 7 | import io.realm.kotlin.types.BaseRealmObject 8 | import io.realm.kotlin.types.RealmObject 9 | import kotlinx.coroutines.flow.Flow 10 | import kotlinx.coroutines.flow.map 11 | import kotlinx.coroutines.withContext 12 | import kotlin.coroutines.CoroutineContext 13 | import kotlin.jvm.JvmOverloads 14 | 15 | open class RealmHelper { 16 | val realm: Realm 17 | 18 | constructor(realmObject: RealmObject) { 19 | val config = RealmConfiguration.Builder(schema = setOf(realmObject::class)) 20 | .build() 21 | realm = Realm.open(config) 22 | } 23 | 24 | @JvmOverloads 25 | fun Flow>.mapToList( 26 | context: CoroutineContext = DispatcherDefault 27 | ): Flow> = map { 28 | withContext(context) { 29 | it.list 30 | } 31 | } 32 | } -------------------------------------------------------------------------------- /kmmtshared/persistence/src/commonMain/kotlin/com/kmmt/persistance/storage/realm/TBreed.kt: -------------------------------------------------------------------------------- 1 | package com.kmmt.persistance.storage.realm 2 | 3 | import com.kmmt.models.demo.domain.Breed 4 | import io.realm.kotlin.Realm 5 | import io.realm.kotlin.ext.query 6 | import io.realm.kotlin.types.RealmObject 7 | import io.realm.kotlin.types.annotations.PrimaryKey 8 | 9 | class BreedR : RealmObject { 10 | @PrimaryKey 11 | var id: Long = 0 12 | var name: String = "" 13 | var favorite: Boolean = false 14 | } 15 | 16 | fun BreedR.mapToBreed(): Breed { 17 | return Breed(id, name, favorite) 18 | } 19 | 20 | 21 | fun List.mapToBreed(): List { 22 | return map { 23 | it.mapToBreed() 24 | } 25 | } 26 | 27 | fun Realm.nextBreedID():Int{ 28 | val currentIdNum: Long? = this.query().max("id",Long::class).find() 29 | val nextId: Int = if (currentIdNum == null) { 30 | 1 31 | } else { 32 | currentIdNum.toInt() + 1 33 | } 34 | 35 | return nextId 36 | } -------------------------------------------------------------------------------- /kmmtshared/persistence/src/commonMain/kotlin/com/kmmt/persistance/storage/sqlite/ModelMapper.kt: -------------------------------------------------------------------------------- 1 | package com.kmmt.persistance.storage.sqlite 2 | 3 | import com.jittyandiyan.mobile.TBreed 4 | import com.kmmt.models.demo.domain.Breed 5 | 6 | fun TBreed.mapToBreed(): Breed { 7 | return Breed(id, name, favorite) 8 | } 9 | 10 | fun List.mapToBreed(): List { 11 | return map { 12 | it.mapToBreed() 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /kmmtshared/persistence/src/commonMain/kotlin/com/kmmt/persistance/storage/sqlite/expectations/sqliteDriver.kt: -------------------------------------------------------------------------------- 1 | package com.kmmt.persistance.storage.sqlite.expectations 2 | 3 | import com.squareup.sqldelight.db.SqlDriver 4 | 5 | expect val sqliteDriver : SqlDriver -------------------------------------------------------------------------------- /kmmtshared/persistence/src/commonMain/kotlin/com/kmmt/persistance/storage/sqlite/extensions/SQLDelightExtensions.kt: -------------------------------------------------------------------------------- 1 | package com.kmmt.persistance.storage.sqlite.extensions 2 | 3 | import com.squareup.sqldelight.Transacter 4 | import com.squareup.sqldelight.TransactionWithoutReturn 5 | import kotlinx.coroutines.withContext 6 | import kotlin.coroutines.CoroutineContext 7 | 8 | suspend fun Transacter.transactionWithContext( 9 | coroutineContext: CoroutineContext, 10 | noEnclosing: Boolean = false, 11 | body: TransactionWithoutReturn.() -> Unit 12 | ) { 13 | withContext(coroutineContext) { 14 | this@transactionWithContext.transaction(noEnclosing) { 15 | body() 16 | } 17 | } 18 | } -------------------------------------------------------------------------------- /kmmtshared/persistence/src/commonMain/sqldelight/com/jittyandiyan/mobile/TBreed.sq: -------------------------------------------------------------------------------- 1 | 2 | 3 | CREATE TABLE TBreed ( 4 | id INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, 5 | name TEXT NOT NULL UNIQUE, 6 | favorite INTEGER AS Boolean DEFAULT 0 NOT NULL 7 | ); 8 | 9 | selectAll: 10 | SELECT * FROM TBreed; 11 | 12 | selectById: 13 | SELECT * FROM TBreed WHERE id = ?; 14 | 15 | selectByName: 16 | SELECT * FROM TBreed WHERE name = ?; 17 | 18 | insertBreed: 19 | INSERT OR IGNORE INTO TBreed(id, name) 20 | VALUES (?,?); 21 | 22 | deleteAll: 23 | DELETE FROM TBreed; 24 | 25 | updateFavorite: 26 | UPDATE TBreed SET favorite = ? WHERE id = ?; -------------------------------------------------------------------------------- /kmmtshared/persistence/src/iosMain/kotlin/com/kmmt/persistance/keyValueStore/settings/expectations/settings.kt: -------------------------------------------------------------------------------- 1 | package com.kmmt.persistance.keyValueStore.settings.expectations 2 | 3 | import com.russhwolf.settings.AppleSettings 4 | import com.russhwolf.settings.Settings 5 | import platform.Foundation.NSUserDefaults 6 | 7 | actual val settings: Settings 8 | get() = AppleSettings(NSUserDefaults.standardUserDefaults()) -------------------------------------------------------------------------------- /kmmtshared/persistence/src/iosMain/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.squareup.sqldelight.db.SqlDriver 5 | import com.squareup.sqldelight.drivers.native.NativeSqliteDriver 6 | 7 | actual val sqliteDriver: SqlDriver 8 | get() = NativeSqliteDriver(KMMTDB.Schema, "KMMTB.db") -------------------------------------------------------------------------------- /kmmtshared/presenter/src/androidMain/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /kmmtshared/presenter/src/androidMain/kotlin/com/jittyandiyan/shared/Platform.kt: -------------------------------------------------------------------------------- 1 | package com.jittyandiyan.shared 2 | 3 | actual class Platform actual constructor() { 4 | actual val platform: String = "Android ${android.os.Build.VERSION.SDK_INT}" 5 | } -------------------------------------------------------------------------------- /kmmtshared/presenter/src/androidTest/kotlin/com/jittyandiyan/shared/androidTest.kt: -------------------------------------------------------------------------------- 1 | package com.jittyandiyan.shared 2 | 3 | import org.junit.Assert.assertTrue 4 | import org.junit.Test 5 | 6 | class AndroidGreetingTest { 7 | 8 | @Test 9 | fun testExample() { 10 | // assertTrue("Check Android is mentioned", Greeting().greeting().contains("Android")) 11 | } 12 | } -------------------------------------------------------------------------------- /kmmtshared/presenter/src/commonMain/kotlin/com/jittyandiyan/shared/Greeting.kt: -------------------------------------------------------------------------------- 1 | package com.jittyandiyan.shared 2 | 3 | 4 | class Greeting { 5 | fun greeting(): String { 6 | return "Hello, ${Platform().platform}!" 7 | } 8 | } 9 | -------------------------------------------------------------------------------- /kmmtshared/presenter/src/commonMain/kotlin/com/jittyandiyan/shared/Platform.kt: -------------------------------------------------------------------------------- 1 | package com.jittyandiyan.shared 2 | 3 | expect class Platform() { 4 | val platform: String 5 | } -------------------------------------------------------------------------------- /kmmtshared/presenter/src/commonMain/kotlin/com/jittyandiyan/shared/demo/features/home/HomePresenter.kt: -------------------------------------------------------------------------------- 1 | package com.jittyandiyan.shared.demo.features.home 2 | 3 | import com.kmmt.core.architecture.presenter.BasePresenter 4 | import com.kmmt.models.demo.domain.UserModel 5 | import com.kmmt.common.platforms.runOnAndroid 6 | import com.kmmt.network.apis.JsonPlaceHolderServiceAPI 7 | import com.kmmt.resources.Resources 8 | import com.kmmt.resources.expectations.localized 9 | 10 | class HomePresenter(view: HomeView) : BasePresenter(view) { 11 | 12 | companion object BundleKeys { 13 | const val USER_NAME = "USERNAME" 14 | const val USER_OBJECT = "USEROBJ" 15 | } 16 | 17 | override fun onStartPresenter() { 18 | runOnAndroid { 19 | getView()?.setPageTitle(Resources.strings.kmmHome.localized()) 20 | } 21 | getView()?.setKampKitPageButtonLabel(Resources.strings.kampKitDemo.localized()) 22 | getView()?.setKampKitBtnClickAction(this::kampKitDemoBtnClicked) 23 | getBundleValue(USER_NAME)?.let { username -> 24 | getBundleValue(USER_OBJECT)?.let { userModel -> 25 | getView()?.showUsername(" ${Resources.strings.user.localized()} : " + userModel.firstname + " " + userModel.lastname) 26 | } 27 | runOnBackgroundWithResult { 28 | JsonPlaceHolderServiceAPI().getPosts(username) 29 | }.resultOnUI { 30 | it.either({ 31 | getView()?.showPopUpMessage(it.message) 32 | }, { 33 | getView()?.showPostList(it) 34 | }) 35 | 36 | } 37 | } 38 | } 39 | 40 | fun kampKitDemoBtnClicked() { 41 | getView()?.navigateToKampKitDemoPage() 42 | } 43 | } -------------------------------------------------------------------------------- /kmmtshared/presenter/src/commonMain/kotlin/com/jittyandiyan/shared/demo/features/home/HomeView.kt: -------------------------------------------------------------------------------- 1 | package com.jittyandiyan.shared.demo.features.home 2 | 3 | import com.kmmt.core.architecture.view.BaseView 4 | import com.kmmt.models.demo.domain.PostModel 5 | import kotlin.reflect.KFunction0 6 | 7 | interface HomeView:BaseView { 8 | fun showPostList(postList:List) 9 | fun showUsername(username: String) 10 | fun setKampKitPageButtonLabel(btnLabel: String) 11 | fun navigateToKampKitDemoPage() 12 | fun setKampKitBtnClickAction(btnClickAction: KFunction0) 13 | 14 | } -------------------------------------------------------------------------------- /kmmtshared/presenter/src/commonMain/kotlin/com/jittyandiyan/shared/demo/features/kampkit/BreedView.kt: -------------------------------------------------------------------------------- 1 | package com.jittyandiyan.shared.demo.features.kampkit 2 | 3 | import com.kmmt.core.architecture.view.BaseView 4 | import com.kmmt.models.demo.domain.Breed 5 | import kotlin.reflect.KFunction1 6 | 7 | interface BreedView:BaseView { 8 | fun refreshBreedList(breedList: List) 9 | fun setBreedRefreshAction(refresh: KFunction1) 10 | fun stopRefreshing() 11 | fun setBreedFavouriteClickAction(invertBreedFavouriteState: KFunction1) 12 | } -------------------------------------------------------------------------------- /kmmtshared/presenter/src/commonMain/kotlin/com/jittyandiyan/shared/demo/features/login/LoginView.kt: -------------------------------------------------------------------------------- 1 | package com.jittyandiyan.shared.demo.features.login 2 | 3 | import com.kmmt.core.architecture.view.BaseView 4 | import com.kmmt.core.platform.expectations.BundleParcel 5 | import kotlin.reflect.KFunction0 6 | 7 | interface LoginView : BaseView { 8 | 9 | fun setLoginPageLabel(msg:String) 10 | 11 | fun setUsernameLabel(usernameLabel:String) 12 | fun setPasswordLabel(passwordLabel:String) 13 | 14 | fun getEnteredUsername():String 15 | fun getEnteredPassword():String 16 | 17 | fun setLoginButtonClickAction(onLoginClick: KFunction0) 18 | fun setLoginButtonLabel(loginLabel: String) 19 | 20 | fun showErrorMessageOnUsername(errorMsg: String) 21 | 22 | fun navigateToHomePage(bundleParcel: BundleParcel) 23 | } -------------------------------------------------------------------------------- /kmmtshared/presenter/src/commonMain/kotlin/com/jittyandiyan/shared/demoTVMazeShowSearch/features/tvshows/TVShowsSearchView.kt: -------------------------------------------------------------------------------- 1 | package com.jittyandiyan.shared.demoTVMazeShowSearch.features.tvshows 2 | 3 | import com.kmmt.core.architecture.view.BaseView 4 | import com.kmmt.models.demotvshowsearch.domain.TVShowInfo 5 | import kotlin.reflect.KFunction1 6 | 7 | interface TVShowsSearchView:BaseView { 8 | fun showTVShowsList(tvShowList: List) 9 | 10 | fun setSearchQueryChangeListener(onSearchQueryStringChanged: KFunction1) 11 | } -------------------------------------------------------------------------------- /kmmtshared/presenter/src/commonMain/kotlin/com/jittyandiyan/shared/demoTVMazeShowSearch/features/welcome/WelcomePresenter.kt: -------------------------------------------------------------------------------- 1 | package com.jittyandiyan.shared.demoTVMazeShowSearch.features.welcome 2 | 3 | import com.kmmt.core.architecture.presenter.BasePresenter 4 | import com.kmmt.resources.Resources 5 | import com.kmmt.resources.expectations.localized 6 | 7 | 8 | class WelcomePresenter(view: WelcomeView) : BasePresenter(view) { 9 | override fun onStartPresenter() { 10 | 11 | getView()?.setPageTitle(Resources.strings.codeChallenge.localized()) 12 | getView()?.setWelcomePageLabel(Resources.strings.codeChallengeTVShowSearch.localized()) 13 | getView()?.setTVShowsButtonLabel(Resources.strings.searchTVShows.localized()) 14 | getView()?.setTVShowsButtonClickAction(this::onLoginButtonClick) 15 | } 16 | 17 | private fun onLoginButtonClick() { 18 | getView()?.navigateToTVShowsPage() 19 | } 20 | 21 | } -------------------------------------------------------------------------------- /kmmtshared/presenter/src/commonMain/kotlin/com/jittyandiyan/shared/demoTVMazeShowSearch/features/welcome/WelcomeView.kt: -------------------------------------------------------------------------------- 1 | package com.jittyandiyan.shared.demoTVMazeShowSearch.features.welcome 2 | 3 | import com.kmmt.core.architecture.view.BaseView 4 | import kotlin.reflect.KFunction0 5 | 6 | interface WelcomeView : BaseView { 7 | 8 | fun setWelcomePageLabel(msg:String) 9 | 10 | fun setTVShowsButtonClickAction(onLoginClick: KFunction0) 11 | fun setTVShowsButtonLabel(tvShowsBtnLbl: String) 12 | 13 | fun navigateToTVShowsPage() 14 | } -------------------------------------------------------------------------------- /kmmtshared/presenter/src/iosMain/kotlin/com/jittyandiyan/shared/Platform.kt: -------------------------------------------------------------------------------- 1 | package com.jittyandiyan.shared 2 | 3 | 4 | import platform.UIKit.UIDevice 5 | 6 | actual class Platform actual constructor() { 7 | actual val platform: String = UIDevice.currentDevice.systemName() + " " + UIDevice.currentDevice.systemVersion 8 | } -------------------------------------------------------------------------------- /kmmtshared/presenter/src/iosTest/kotlin/com/jittyandiyan/shared/iosTest.kt: -------------------------------------------------------------------------------- 1 | package com.jittyandiyan.shared 2 | 3 | import kotlin.test.Test 4 | import kotlin.test.assertTrue 5 | 6 | class IosGreetingTest { 7 | 8 | @Test 9 | fun testExample() { 10 | assertTrue(Greeting().greeting().contains("iOS"), "Check iOS is mentioned") 11 | } 12 | } -------------------------------------------------------------------------------- /kmmtshared/resources/src/androidMain/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /kmmtshared/resources/src/androidMain/kotlin/com/kmmt/resources/Utils.kt: -------------------------------------------------------------------------------- 1 | package com.kmmt.resources 2 | 3 | import android.content.Context 4 | import android.content.res.Configuration 5 | import androidx.compose.runtime.Composable 6 | import androidx.compose.ui.graphics.Color 7 | import androidx.compose.ui.res.stringResource 8 | import dev.icerock.moko.resources.ColorResource 9 | import dev.icerock.moko.resources.StringResource 10 | 11 | @Composable 12 | fun stringResource(stringResource: StringResource): String = 13 | stringResource(stringResource.resourceId) 14 | 15 | inline fun ColorResource.getColor(context: Context): Color { 16 | return when (this) { 17 | is ColorResource.Single -> Color(color.argb) 18 | is ColorResource.Themed -> { 19 | val configuration = context.resources.configuration 20 | when (configuration.uiMode and Configuration.UI_MODE_NIGHT_MASK) { 21 | Configuration.UI_MODE_NIGHT_NO -> Color(light.argb) // Night mode is not active, we're using the light theme 22 | Configuration.UI_MODE_NIGHT_YES -> Color(dark.argb) // Night mode is active, we're using dark theme 23 | else -> Color(light.argb) // No mode type has been set 24 | } 25 | } 26 | } 27 | } 28 | 29 | -------------------------------------------------------------------------------- /kmmtshared/resources/src/androidMain/kotlin/com/kmmt/resources/expectations/localized.kt: -------------------------------------------------------------------------------- 1 | package com.kmmt.resources.expectations 2 | 3 | import com.kmmt.common.dependencyInjection.Android 4 | import dev.icerock.moko.resources.StringResource 5 | 6 | actual fun StringResource.localized():String { 7 | return Android.application.application.getString(this.resourceId) 8 | } -------------------------------------------------------------------------------- /kmmtshared/resources/src/commonMain/kotlin/com/kmmt/resources/expectations/localized.kt: -------------------------------------------------------------------------------- 1 | package com.kmmt.resources.expectations 2 | 3 | import dev.icerock.moko.resources.StringResource 4 | 5 | expect fun StringResource.localized():String -------------------------------------------------------------------------------- /kmmtshared/resources/src/commonMain/resources/MR/base/strings.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | Test String 5 | Login 6 | KMM Login 7 | KMM : Home 8 | Breed List 9 | TV Shows 10 | Code Challenge 11 | KampKit Demo 12 | User 13 | Enter Username 14 | Enter Password 15 | Authenticating... 16 | Login Failed 17 | Please enter username 18 | Validation Failed 19 | Username or Password is empty 20 | Code Challenge : Search TV Shows 21 | 22 | by 23 | 24 | Jitty Andiyan 25 | Search TV Shows 26 | 27 | -------------------------------------------------------------------------------- /kmmtshared/resources/src/commonMain/resources/MR/colors/colors.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | #FFFFFF 6 | #111111 7 | 8 | 9 | @color/backgroundLight 10 | @color/backgroundDark 11 | 12 | 13 | -------------------------------------------------------------------------------- /kmmtshared/resources/src/commonMain/resources/MR/de/strings.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | Test Zeichenfolge 5 | Anmeldung 6 | KMM Anmeldung 7 | KMM : Zuhause 8 | Liste der Rassen 9 | TV-Sendungen 10 | Code-Herausforderung 11 | KampKit Demo 12 | Benutzer 13 | Benutzername eingeben 14 | Passwort eingeben 15 | Authentifizierung... 16 | Anmeldung fehlgeschlagen 17 | Bitte Benutzernamen eingeben 18 | Validierung fehlgeschlagen 19 | Benutzername oder Passwort ist leer 20 | Code Challenge: TV-Sendungen suchen 21 | 22 | von 23 | 24 | Jitty Andiyan 25 | TV-Sendungen suchen 26 | 27 | -------------------------------------------------------------------------------- /kmmtshared/resources/src/iosMain/kotlin/com/kmmt/resources/Utils.kt: -------------------------------------------------------------------------------- 1 | package com.kmmt.resources 2 | 3 | import dev.icerock.moko.graphics.toUIColor 4 | import dev.icerock.moko.resources.ColorResource 5 | import dev.icerock.moko.resources.StringResource 6 | import dev.icerock.moko.resources.desc.Resource 7 | import dev.icerock.moko.resources.desc.StringDesc 8 | import platform.UIKit.UIColor 9 | import platform.UIKit.UIScreen 10 | import platform.UIKit.UIUserInterfaceStyle 11 | 12 | 13 | fun ColorResource.getUIColor(): UIColor { 14 | var userInterfaceStyle: UIUserInterfaceStyle = UIScreen.mainScreen.traitCollection.userInterfaceStyle 15 | return when (this) { 16 | is ColorResource.Single -> { 17 | color 18 | } 19 | is ColorResource.Themed -> { 20 | when (userInterfaceStyle) { 21 | UIUserInterfaceStyle.UIUserInterfaceStyleDark -> dark 22 | UIUserInterfaceStyle.UIUserInterfaceStyleLight -> light 23 | UIUserInterfaceStyle.UIUserInterfaceStyleUnspecified -> light 24 | else -> light 25 | } 26 | } 27 | }.toUIColor() 28 | } 29 | -------------------------------------------------------------------------------- /kmmtshared/resources/src/iosMain/kotlin/com/kmmt/resources/expectations/localized.kt: -------------------------------------------------------------------------------- 1 | package com.kmmt.resources.expectations 2 | 3 | import dev.icerock.moko.resources.StringResource 4 | import dev.icerock.moko.resources.desc.Resource 5 | import dev.icerock.moko.resources.desc.StringDesc 6 | 7 | actual fun StringResource.localized():String = StringDesc.Resource(this).localized() -------------------------------------------------------------------------------- /kmmtshared/src/androidMain/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /kmmtshared/src/androidMain/kotlin/com/jitty/kmmtshared/Platform.kt: -------------------------------------------------------------------------------- 1 | package com.jitty.kmmtshared 2 | 3 | actual class Platform actual constructor() { 4 | actual val platform: String = "Android ${android.os.Build.VERSION.SDK_INT}" 5 | } -------------------------------------------------------------------------------- /kmmtshared/src/commonMain/kotlin/com/jitty/kmmtshared/Greeting.kt: -------------------------------------------------------------------------------- 1 | package com.jitty.kmmtshared 2 | 3 | class Greeting { 4 | fun greeting(): String { 5 | return "Hello, ${Platform().platform}!" 6 | } 7 | } -------------------------------------------------------------------------------- /kmmtshared/src/commonMain/kotlin/com/jitty/kmmtshared/Platform.kt: -------------------------------------------------------------------------------- 1 | package com.jitty.kmmtshared 2 | 3 | expect class Platform() { 4 | val platform: String 5 | } -------------------------------------------------------------------------------- /kmmtshared/src/iosMain/kotlin/com/jitty/kmmtshared/Platform.kt: -------------------------------------------------------------------------------- 1 | package com.jitty.kmmtshared 2 | 3 | import platform.UIKit.UIDevice 4 | 5 | actual class Platform actual constructor() { 6 | actual val platform: String = UIDevice.currentDevice.systemName() + " " + UIDevice.currentDevice.systemVersion 7 | } -------------------------------------------------------------------------------- /local.properties: -------------------------------------------------------------------------------- 1 | ## This file must *NOT* be checked into Version Control Systems, 2 | # as it contains information specific to your local configuration. 3 | # 4 | # Location of the SDK. This is only used by Gradle. 5 | # For customization when using a Version Control System, please read the 6 | # header note. 7 | #Sun Jul 03 12:02:11 CEST 2022 8 | sdk.dir=/Users/jittyandiyan/Library/Android/sdk 9 | -------------------------------------------------------------------------------- /settings.gradle.kts: -------------------------------------------------------------------------------- 1 | pluginManagement { 2 | repositories { 3 | google() 4 | gradlePluginPortal() 5 | mavenCentral() 6 | } 7 | 8 | } 9 | rootProject.name = "KMMT" 10 | 11 | 12 | include(":androidApp") 13 | include(":kmmtshared:presenter") 14 | include(":kmmtshared:core") 15 | include(":kmmtshared:persistence") 16 | include(":kmmtshared:injector") 17 | include(":kmmtshared:common") 18 | include(":kmmtshared:network") 19 | include(":kmmtshared:models") 20 | include(":kmmtshared:domain") 21 | include(":kmmtshared:resources") 22 | include(":kmmtshared:analytics") 23 | include(":kmmtshared") 24 | --------------------------------------------------------------------------------