@momo-kits/native-kits 0.162.1-beta.7 → 0.162.1-gif.1-debug

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (140) hide show
  1. package/build.gradle.kts +11 -0
  2. package/compose/build.gradle.kts +190 -0
  3. package/compose/build.gradle.kts.backup +190 -0
  4. package/compose/compose.podspec +47 -0
  5. package/compose/src/androidMain/kotlin/vn/momo/kits/fpsmonitor/FPSGraphView.kt +250 -0
  6. package/compose/src/androidMain/kotlin/vn/momo/kits/fpsmonitor/FPSMonitor.kt +249 -0
  7. package/compose/src/androidMain/kotlin/vn/momo/kits/fpsmonitor/FPSOverlayView.kt +99 -0
  8. package/compose/src/androidMain/kotlin/vn/momo/kits/navigation/ScrollToTop.android.kt +6 -0
  9. package/compose/src/androidMain/kotlin/vn/momo/kits/platform/Platform.android.kt +123 -0
  10. package/compose/src/commonMain/composeResources/font/momosignature.otf +0 -0
  11. package/compose/src/commonMain/composeResources/font/momotrustdisplay.otf +0 -0
  12. package/compose/src/commonMain/composeResources/font/sfprotext_black.otf +0 -0
  13. package/compose/src/commonMain/composeResources/font/sfprotext_black.ttf +0 -0
  14. package/compose/src/commonMain/composeResources/font/sfprotext_bold.ttf +0 -0
  15. package/compose/src/commonMain/composeResources/font/sfprotext_heavy.ttf +0 -0
  16. package/compose/src/commonMain/composeResources/font/sfprotext_light.ttf +0 -0
  17. package/compose/src/commonMain/composeResources/font/sfprotext_medium.ttf +0 -0
  18. package/compose/src/commonMain/composeResources/font/sfprotext_regular.ttf +0 -0
  19. package/compose/src/commonMain/composeResources/font/sfprotext_semibold.ttf +0 -0
  20. package/compose/src/commonMain/composeResources/font/sfprotext_thin.otf +0 -0
  21. package/compose/src/commonMain/composeResources/font/sfprotext_thin.ttf +0 -0
  22. package/compose/src/commonMain/composeResources/font/sfprotext_ultralight.otf +0 -0
  23. package/compose/src/commonMain/composeResources/font/sfprotext_ultralight.ttf +0 -0
  24. package/compose/src/commonMain/kotlin/vn/momo/kits/application/AnimationSearchInput.kt +57 -0
  25. package/compose/src/commonMain/kotlin/vn/momo/kits/application/Context.kt +109 -0
  26. package/compose/src/commonMain/kotlin/vn/momo/kits/application/FloatingButton.kt +201 -0
  27. package/compose/src/commonMain/kotlin/vn/momo/kits/application/Header.kt +222 -0
  28. package/compose/src/commonMain/kotlin/vn/momo/kits/application/HeaderAnimated.kt +48 -0
  29. package/compose/src/commonMain/kotlin/vn/momo/kits/application/HeaderBackground.kt +86 -0
  30. package/compose/src/commonMain/kotlin/vn/momo/kits/application/HeaderDefault.kt +76 -0
  31. package/compose/src/commonMain/kotlin/vn/momo/kits/application/HeaderExtended.kt +76 -0
  32. package/compose/src/commonMain/kotlin/vn/momo/kits/application/HeaderRight.kt +305 -0
  33. package/compose/src/commonMain/kotlin/vn/momo/kits/application/HeaderTitle.kt +33 -0
  34. package/compose/src/commonMain/kotlin/vn/momo/kits/application/LiteScreen.kt +921 -0
  35. package/compose/src/commonMain/kotlin/vn/momo/kits/application/NavigationContainer.kt +121 -0
  36. package/compose/src/commonMain/kotlin/vn/momo/kits/application/Screen.kt +403 -0
  37. package/compose/src/commonMain/kotlin/vn/momo/kits/application/useHeaderSearchAnimation.kt +69 -0
  38. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Avatar.kt +157 -0
  39. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Badge.kt +85 -0
  40. package/compose/src/commonMain/kotlin/vn/momo/kits/components/BadgeDot.kt +32 -0
  41. package/compose/src/commonMain/kotlin/vn/momo/kits/components/BadgeRibbon.kt +340 -0
  42. package/compose/src/commonMain/kotlin/vn/momo/kits/components/BaselineView.kt +198 -0
  43. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Button.kt +357 -0
  44. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Carousel.kt +123 -0
  45. package/compose/src/commonMain/kotlin/vn/momo/kits/components/CheckBox.kt +94 -0
  46. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Chip.kt +136 -0
  47. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Collapse.kt +224 -0
  48. package/compose/src/commonMain/kotlin/vn/momo/kits/components/CupertinoOverscroll.kt +543 -0
  49. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Divider.kt +23 -0
  50. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Icon.kt +76 -0
  51. package/compose/src/commonMain/kotlin/vn/momo/kits/components/IconButton.kt +148 -0
  52. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Image.kt +204 -0
  53. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Information.kt +116 -0
  54. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Input.kt +452 -0
  55. package/compose/src/commonMain/kotlin/vn/momo/kits/components/InputDropDown.kt +172 -0
  56. package/compose/src/commonMain/kotlin/vn/momo/kits/components/InputMoney.kt +255 -0
  57. package/compose/src/commonMain/kotlin/vn/momo/kits/components/InputOTP.kt +235 -0
  58. package/compose/src/commonMain/kotlin/vn/momo/kits/components/InputPhoneNumber.kt +233 -0
  59. package/compose/src/commonMain/kotlin/vn/momo/kits/components/InputSearch.kt +259 -0
  60. package/compose/src/commonMain/kotlin/vn/momo/kits/components/InputTextArea.kt +241 -0
  61. package/compose/src/commonMain/kotlin/vn/momo/kits/components/LazyColumnWithBouncing.kt +364 -0
  62. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Loader.kt +108 -0
  63. package/compose/src/commonMain/kotlin/vn/momo/kits/components/PaginationDot.kt +56 -0
  64. package/compose/src/commonMain/kotlin/vn/momo/kits/components/PaginationNumber.kt +41 -0
  65. package/compose/src/commonMain/kotlin/vn/momo/kits/components/PaginationScroll.kt +92 -0
  66. package/compose/src/commonMain/kotlin/vn/momo/kits/components/PaginationWhiteDot.kt +40 -0
  67. package/compose/src/commonMain/kotlin/vn/momo/kits/components/PopupNotify.kt +352 -0
  68. package/compose/src/commonMain/kotlin/vn/momo/kits/components/PopupPromotion.kt +103 -0
  69. package/compose/src/commonMain/kotlin/vn/momo/kits/components/ProgressInfo.kt +338 -0
  70. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Radio.kt +70 -0
  71. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Rating.kt +87 -0
  72. package/compose/src/commonMain/kotlin/vn/momo/kits/components/ScaleSizeScope.kt +17 -0
  73. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Skeleton.kt +96 -0
  74. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Slider.kt +348 -0
  75. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Stepper.kt +256 -0
  76. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Steps.kt +494 -0
  77. package/compose/src/commonMain/kotlin/vn/momo/kits/components/SuggestAction.kt +131 -0
  78. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Swipe.kt +215 -0
  79. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Switch.kt +96 -0
  80. package/compose/src/commonMain/kotlin/vn/momo/kits/components/TabView.kt +531 -0
  81. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Tag.kt +92 -0
  82. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Text.kt +135 -0
  83. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Title.kt +214 -0
  84. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Tooltip.kt +590 -0
  85. package/compose/src/commonMain/kotlin/vn/momo/kits/components/TrustBanner.kt +177 -0
  86. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Uploader.kt +192 -0
  87. package/compose/src/commonMain/kotlin/vn/momo/kits/components/datetimepicker/DateTimePicker.kt +205 -0
  88. package/compose/src/commonMain/kotlin/vn/momo/kits/components/datetimepicker/DateTimePickerTypes.kt +29 -0
  89. package/compose/src/commonMain/kotlin/vn/momo/kits/components/datetimepicker/DateTimePickerUtils.kt +239 -0
  90. package/compose/src/commonMain/kotlin/vn/momo/kits/components/datetimepicker/WheelPicker.kt +191 -0
  91. package/compose/src/commonMain/kotlin/vn/momo/kits/const/Colors.kt +306 -0
  92. package/compose/src/commonMain/kotlin/vn/momo/kits/const/Radius.kt +12 -0
  93. package/compose/src/commonMain/kotlin/vn/momo/kits/const/Spacing.kt +16 -0
  94. package/compose/src/commonMain/kotlin/vn/momo/kits/const/Theme.kt +188 -0
  95. package/compose/src/commonMain/kotlin/vn/momo/kits/const/Typography.kt +285 -0
  96. package/compose/src/commonMain/kotlin/vn/momo/kits/layout/Card.kt +2 -0
  97. package/compose/src/commonMain/kotlin/vn/momo/kits/layout/Item.kt +35 -0
  98. package/compose/src/commonMain/kotlin/vn/momo/kits/layout/Section.kt +2 -0
  99. package/compose/src/commonMain/kotlin/vn/momo/kits/modifier/AutomationId.kt +57 -0
  100. package/compose/src/commonMain/kotlin/vn/momo/kits/modifier/Clickable.kt +68 -0
  101. package/compose/src/commonMain/kotlin/vn/momo/kits/modifier/Conditional.kt +11 -0
  102. package/compose/src/commonMain/kotlin/vn/momo/kits/modifier/DeprecatedModifier.kt +14 -0
  103. package/compose/src/commonMain/kotlin/vn/momo/kits/modifier/Shadow.kt +50 -0
  104. package/compose/src/commonMain/kotlin/vn/momo/kits/modifier/Size.kt +51 -0
  105. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/BottomSheet.kt +253 -0
  106. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/ModalScreen.kt +133 -0
  107. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/Navigation.kt +104 -0
  108. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/NavigationContainer.kt +145 -0
  109. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/Navigator.kt +345 -0
  110. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/ScrollToTop.kt +8 -0
  111. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/StackScreen.kt +556 -0
  112. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/bottomtab/BottomTab.kt +173 -0
  113. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/bottomtab/BottomTabBar.kt +243 -0
  114. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/bottomtab/CurvedContainer.kt +86 -0
  115. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/component/FloatingButton.kt +187 -0
  116. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/component/Header.kt +315 -0
  117. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/component/HeaderBackground.kt +80 -0
  118. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/component/HeaderRight.kt +306 -0
  119. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/component/HeaderTitle.kt +34 -0
  120. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/component/HeaderUser.kt +370 -0
  121. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/component/SnackBar.kt +131 -0
  122. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/tracking/ScreenTracker.kt +167 -0
  123. package/compose/src/commonMain/kotlin/vn/momo/kits/platform/ComposeLottieAnimation.kt +72 -0
  124. package/compose/src/commonMain/kotlin/vn/momo/kits/platform/Platform.kt +66 -0
  125. package/compose/src/commonMain/kotlin/vn/momo/kits/utils/Icons.kt +1329 -0
  126. package/compose/src/commonMain/kotlin/vn/momo/kits/utils/Resources.kt +70 -0
  127. package/compose/src/commonMain/kotlin/vn/momo/kits/utils/Tracking.kt +15 -0
  128. package/compose/src/commonMain/kotlin/vn/momo/kits/utils/Utils.kt +105 -0
  129. package/compose/src/iosMain/kotlin/vn/momo/kits/navigation/ScrollToTop.ios.kt +33 -0
  130. package/compose/src/iosMain/kotlin/vn/momo/kits/platform/Platform.ios.kt +186 -0
  131. package/gradle/libs.versions.toml +72 -0
  132. package/gradle/wrapper/gradle-wrapper.jar +0 -0
  133. package/gradle/wrapper/gradle-wrapper.properties +8 -0
  134. package/gradle.properties +26 -0
  135. package/gradlew +252 -0
  136. package/gradlew.bat +94 -0
  137. package/ios/FPSMonitor/FPSMonitor.swift +562 -0
  138. package/package.json +1 -1
  139. package/settings.gradle.kts +64 -0
  140. package/.claude/settings.local.json +0 -36
@@ -0,0 +1,11 @@
1
+ plugins {
2
+ // this is necessary to avoid the plugins to be loaded multiple times
3
+ // in each subproject's classloader
4
+ alias(libs.plugins.android.application) apply false
5
+ alias(libs.plugins.android.library) apply false
6
+ alias(libs.plugins.compose) apply false
7
+ alias(libs.plugins.kotlin.compose.compiler) apply false
8
+ alias(libs.plugins.jetbrains.kotlin.multiplatform) apply false
9
+ alias(libs.plugins.jetbrains.kotlin.serialization) apply false
10
+ alias(libs.plugins.vanniktech.mavenPublish) apply false
11
+ }
@@ -0,0 +1,190 @@
1
+ // import com.vanniktech.maven.publish.JavadocJar
2
+ // import com.vanniktech.maven.publish.KotlinMultiplatform
3
+ import org.jetbrains.kotlin.gradle.dsl.JvmTarget
4
+
5
+ plugins {
6
+ alias(libs.plugins.jetbrains.kotlin.multiplatform)
7
+ alias(libs.plugins.android.library)
8
+ alias(libs.plugins.compose)
9
+ alias(libs.plugins.kotlin.compose.compiler)
10
+ // alias(libs.plugins.vanniktech.mavenPublish)
11
+ id(libs.plugins.jetbrains.kotlin.cocoapods.get().pluginId)
12
+ kotlin("plugin.serialization")
13
+ }
14
+
15
+ val gitlabName: String? = findProperty("name") as String? ?: ""
16
+ val gitlabRepo: String? = findProperty("repo") as String? ?: ""
17
+ val gitlabUrl: String? = findProperty("url") as String? ?: ""
18
+ val gitlabGroup: String? = findProperty("group") as String? ?: ""
19
+ val gitlabArtifactId: String = findProperty("artifact.id") as String? ?: ""
20
+ val gitlabVersion: String? = findProperty("version") as String? ?: ""
21
+ val gitlabUser: String? = findProperty("gitlab.user") as String? ?: ""
22
+ val gitlabKey: String? = findProperty("gitlab.password") as String? ?: ""
23
+
24
+ kotlin {
25
+ androidTarget {
26
+ compilerOptions {
27
+ jvmTarget.set(JvmTarget.JVM_17)
28
+ }
29
+ publishLibraryVariants("release")
30
+ }
31
+
32
+ val fwName = gitlabArtifactId
33
+ val iosTargets = listOf(iosArm64(), iosSimulatorArm64())
34
+ iosTargets.forEach {
35
+ it.binaries.framework {
36
+ baseName = fwName
37
+ binaryOption("bundleId", "$gitlabGroup.$fwName")
38
+ isStatic = true
39
+ }
40
+ }
41
+
42
+ cocoapods {
43
+ version = "0.162.1-gif.1-debug"
44
+ summary = "IOS Shared module"
45
+ homepage = "https://momo.vn"
46
+ ios.deploymentTarget = "15.0"
47
+
48
+ framework {
49
+ baseName = fwName
50
+ isStatic = true
51
+ }
52
+
53
+ pod("lottie-ios") {
54
+ moduleName = "Lottie"
55
+ version = "4.4.3"
56
+ extraOpts += listOf("-compiler-option", "-fmodules")
57
+ }
58
+ }
59
+
60
+ sourceSets {
61
+ commonMain.dependencies {
62
+ implementation(compose.runtime)
63
+ implementation(compose.material)
64
+ implementation(compose.material3)
65
+ implementation(compose.components.resources)
66
+ implementation(libs.compose.ui.backhandler)
67
+ implementation(libs.ktor.client.core)
68
+ implementation(libs.jetbrains.coroutines.core)
69
+ implementation(libs.navigation.multiplatform)
70
+ implementation(libs.coil.multiplatform.compose)
71
+ implementation(libs.coil.multiplatform.core)
72
+ implementation(libs.coil.multiplatform.network.ktor)
73
+ implementation(libs.jetbrains.serialization.json)
74
+ implementation(libs.kotlinx.datetime)
75
+ api(libs.native.max.api)
76
+ implementation(libs.compottie)
77
+ implementation(libs.sketch.compose)
78
+ implementation(libs.sketch.http)
79
+ implementation(libs.sketch.animated.core)
80
+ implementation(libs.sketch.animated.gif)
81
+ }
82
+ androidMain.dependencies {
83
+ implementation(libs.ktor.client.okhttp)
84
+ implementation(libs.airbnb.lottie)
85
+ }
86
+ iosMain.dependencies {
87
+ implementation(libs.ktor.client.darwin)
88
+ }
89
+ }
90
+ }
91
+
92
+ android {
93
+ namespace = "vn.momo.kits.kits"
94
+ compileSdk = 35
95
+ compileOptions {
96
+ sourceCompatibility = JavaVersion.VERSION_17
97
+ targetCompatibility = JavaVersion.VERSION_17
98
+ }
99
+ defaultConfig {
100
+ minSdk = 24
101
+ }
102
+ }
103
+
104
+ dependencies {
105
+ }
106
+
107
+ repositories {
108
+ google {
109
+ mavenContent {
110
+ includeGroupAndSubgroups("androidx")
111
+ includeGroupAndSubgroups("com.android")
112
+ includeGroupAndSubgroups("com.google")
113
+ }
114
+ }
115
+ mavenCentral()
116
+ maven { url = uri("https://maven.pkg.jetbrains.space/public/p/compose/dev") }
117
+ maven {
118
+ url = uri("https://gitlab.mservice.com.vn/api/v4/projects/5400/packages/maven")
119
+ credentials {username = "download_packages"; password = "gldt-bjDqLpU_sPcHDuXau2ws" }
120
+ }
121
+ maven {
122
+ url = uri("https://artifacts.mservice.com.vn/repository/maven-momo-app/")
123
+ credentials {
124
+ username = "viewer"
125
+ password = "viewer"
126
+ }
127
+ isAllowInsecureProtocol = true
128
+ }
129
+ }
130
+
131
+ compose {
132
+ resources {
133
+ publicResClass = true
134
+ packageOfResClass = "vn.momo.uikits.resources"
135
+ generateResClass = always
136
+ }
137
+ }
138
+
139
+ // publishing {
140
+ // repositories {
141
+ // maven {
142
+ // name = "${gitlabRepo}Packages"
143
+ // credentials {
144
+ // username = gitlabUser
145
+ // password = gitlabKey
146
+ // }
147
+ // url = uri("$gitlabUrl")
148
+ // }
149
+ // }
150
+ // }
151
+
152
+ // mavenPublishing {
153
+ // configure(
154
+ // KotlinMultiplatform(
155
+ // javadocJar = JavadocJar.Empty(),
156
+ // sourcesJar = true,
157
+ // androidVariantsToPublish = listOf("release")
158
+ // )
159
+ // )
160
+ //
161
+ // repositories {
162
+ // maven {
163
+ // name = "${gitlabRepo}Packages"
164
+ // credentials { username = gitlabUser; password = gitlabKey }
165
+ // url = uri("$gitlabUrl")
166
+ // }
167
+ // }
168
+ //
169
+ // coordinates(gitlabGroup.toString(), gitlabArtifactId, gitlabVersion.toString())
170
+ //
171
+ // pom {
172
+ // name = "$gitlabName Klib"
173
+ // description = "$gitlabName"
174
+ // url = "https://gitlab.mservice.com.vn"
175
+ // licenses {
176
+ // license {
177
+ // name = "The Apache License, Version 2.0"
178
+ // url = "https://www.apache.org/licenses/LICENSE-2.0.txt"
179
+ // distribution = "https://www.apache.org/licenses/LICENSE-2.0.txt"
180
+ // }
181
+ // }
182
+ // developers {
183
+ // developer {
184
+ // id = "kotlin-hands-on"
185
+ // name = "Kotlin Developer Advocate"
186
+ // url = "https://github.com/kotlin-hands-on/"
187
+ // }
188
+ // }
189
+ // }
190
+ // }
@@ -0,0 +1,190 @@
1
+ import com.vanniktech.maven.publish.JavadocJar
2
+ import com.vanniktech.maven.publish.KotlinMultiplatform
3
+ import org.jetbrains.kotlin.gradle.dsl.JvmTarget
4
+
5
+ plugins {
6
+ alias(libs.plugins.jetbrains.kotlin.multiplatform)
7
+ alias(libs.plugins.android.library)
8
+ alias(libs.plugins.compose)
9
+ alias(libs.plugins.kotlin.compose.compiler)
10
+ alias(libs.plugins.vanniktech.mavenPublish)
11
+ id(libs.plugins.jetbrains.kotlin.cocoapods.get().pluginId)
12
+ kotlin("plugin.serialization")
13
+ }
14
+
15
+ val gitlabName: String? = findProperty("name") as String? ?: ""
16
+ val gitlabRepo: String? = findProperty("repo") as String? ?: ""
17
+ val gitlabUrl: String? = findProperty("url") as String? ?: ""
18
+ val gitlabGroup: String? = findProperty("group") as String? ?: ""
19
+ val gitlabArtifactId: String = findProperty("artifact.id") as String? ?: ""
20
+ val gitlabVersion: String? = findProperty("version") as String? ?: ""
21
+ val gitlabUser: String? = findProperty("gitlab.user") as String? ?: ""
22
+ val gitlabKey: String? = findProperty("gitlab.password") as String? ?: ""
23
+
24
+ kotlin {
25
+ androidTarget {
26
+ compilerOptions {
27
+ jvmTarget.set(JvmTarget.JVM_17)
28
+ }
29
+ publishLibraryVariants("release")
30
+ }
31
+
32
+ val fwName = gitlabArtifactId
33
+ val iosTargets = listOf(iosArm64(), iosSimulatorArm64())
34
+ iosTargets.forEach {
35
+ it.binaries.framework {
36
+ baseName = fwName
37
+ binaryOption("bundleId", "$gitlabGroup.$fwName")
38
+ isStatic = true
39
+ }
40
+ }
41
+
42
+ cocoapods {
43
+ version = gitlabVersion
44
+ summary = "IOS Shared module"
45
+ homepage = "https://momo.vn"
46
+ ios.deploymentTarget = "15.0"
47
+
48
+ framework {
49
+ baseName = fwName
50
+ isStatic = true
51
+ }
52
+
53
+ pod("lottie-ios") {
54
+ moduleName = "Lottie"
55
+ version = "4.4.3"
56
+ extraOpts += listOf("-compiler-option", "-fmodules")
57
+ }
58
+ }
59
+
60
+ sourceSets {
61
+ commonMain.dependencies {
62
+ implementation(compose.runtime)
63
+ implementation(compose.material)
64
+ implementation(compose.material3)
65
+ implementation(compose.components.resources)
66
+ implementation(libs.compose.ui.backhandler)
67
+ implementation(libs.ktor.client.core)
68
+ implementation(libs.jetbrains.coroutines.core)
69
+ implementation(libs.navigation.multiplatform)
70
+ implementation(libs.coil.multiplatform.compose)
71
+ implementation(libs.coil.multiplatform.core)
72
+ implementation(libs.coil.multiplatform.network.ktor)
73
+ implementation(libs.jetbrains.serialization.json)
74
+ implementation(libs.kotlinx.datetime)
75
+ api(libs.native.max.api)
76
+ implementation(libs.compottie)
77
+ implementation(libs.sketch.compose)
78
+ implementation(libs.sketch.http)
79
+ implementation(libs.sketch.animated.core)
80
+ implementation(libs.sketch.animated.gif)
81
+ }
82
+ androidMain.dependencies {
83
+ implementation(libs.ktor.client.okhttp)
84
+ implementation(libs.airbnb.lottie)
85
+ }
86
+ iosMain.dependencies {
87
+ implementation(libs.ktor.client.darwin)
88
+ }
89
+ }
90
+ }
91
+
92
+ android {
93
+ namespace = "$gitlabGroup.$gitlabArtifactId"
94
+ compileSdk = libs.versions.android.compileSdk.get().toInt()
95
+ compileOptions {
96
+ sourceCompatibility = JavaVersion.VERSION_17
97
+ targetCompatibility = JavaVersion.VERSION_17
98
+ }
99
+ defaultConfig {
100
+ minSdk = libs.versions.android.minSdk.get().toInt()
101
+ }
102
+ }
103
+
104
+ dependencies {
105
+ }
106
+
107
+ repositories {
108
+ google {
109
+ mavenContent {
110
+ includeGroupAndSubgroups("androidx")
111
+ includeGroupAndSubgroups("com.android")
112
+ includeGroupAndSubgroups("com.google")
113
+ }
114
+ }
115
+ mavenCentral()
116
+ maven { url = uri("https://maven.pkg.jetbrains.space/public/p/compose/dev") }
117
+ maven {
118
+ url = uri("https://gitlab.mservice.com.vn/api/v4/projects/5400/packages/maven")
119
+ credentials {username = "download_packages"; password = "gldt-bjDqLpU_sPcHDuXau2ws" }
120
+ }
121
+ maven {
122
+ url = uri("https://artifacts.mservice.com.vn/repository/maven-momo-app/")
123
+ credentials {
124
+ username = "viewer"
125
+ password = "viewer"
126
+ }
127
+ isAllowInsecureProtocol = true
128
+ }
129
+ }
130
+
131
+ compose {
132
+ resources {
133
+ publicResClass = true
134
+ packageOfResClass = "vn.momo.uikits.resources"
135
+ generateResClass = always
136
+ }
137
+ }
138
+
139
+ publishing {
140
+ repositories {
141
+ maven {
142
+ name = "${gitlabRepo}Packages"
143
+ credentials {
144
+ username = gitlabUser
145
+ password = gitlabKey
146
+ }
147
+ url = uri("$gitlabUrl")
148
+ }
149
+ }
150
+ }
151
+
152
+ mavenPublishing {
153
+ configure(
154
+ KotlinMultiplatform(
155
+ javadocJar = JavadocJar.Empty(),
156
+ sourcesJar = true,
157
+ androidVariantsToPublish = listOf("release")
158
+ )
159
+ )
160
+
161
+ repositories {
162
+ maven {
163
+ name = "${gitlabRepo}Packages"
164
+ credentials { username = gitlabUser; password = gitlabKey }
165
+ url = uri("$gitlabUrl")
166
+ }
167
+ }
168
+
169
+ coordinates(gitlabGroup.toString(), gitlabArtifactId, gitlabVersion.toString())
170
+
171
+ pom {
172
+ name = "$gitlabName Klib"
173
+ description = "$gitlabName"
174
+ url = "https://gitlab.mservice.com.vn"
175
+ licenses {
176
+ license {
177
+ name = "The Apache License, Version 2.0"
178
+ url = "https://www.apache.org/licenses/LICENSE-2.0.txt"
179
+ distribution = "https://www.apache.org/licenses/LICENSE-2.0.txt"
180
+ }
181
+ }
182
+ developers {
183
+ developer {
184
+ id = "kotlin-hands-on"
185
+ name = "Kotlin Developer Advocate"
186
+ url = "https://github.com/kotlin-hands-on/"
187
+ }
188
+ }
189
+ }
190
+ }
@@ -0,0 +1,47 @@
1
+ Pod::Spec.new do |spec|
2
+ spec.name = 'compose'
3
+ spec.version = '0.161.2-beta.15'
4
+ spec.homepage = 'https://momo.vn'
5
+ spec.source = { :http=> ''}
6
+ spec.authors = ''
7
+ spec.license = ''
8
+ spec.summary = 'IOS Shared module'
9
+ spec.vendored_frameworks = 'build/cocoapods/framework/kits.framework'
10
+ spec.libraries = 'c++'
11
+ spec.ios.deployment_target = '15.0'
12
+ spec.dependency 'lottie-ios', '4.4.3'
13
+ if !Dir.exist?('build/cocoapods/framework/kits.framework') || Dir.empty?('build/cocoapods/framework/kits.framework')
14
+ raise "
15
+ Kotlin framework 'kits' doesn't exist yet, so a proper Xcode project can't be generated.
16
+ 'pod install' should be executed after running ':generateDummyFramework' Gradle task:
17
+ ./gradlew :compose:generateDummyFramework
18
+ Alternatively, proper pod installation is performed during Gradle sync in the IDE (if Podfile location is set)"
19
+ end
20
+ spec.xcconfig = {
21
+ 'ENABLE_USER_SCRIPT_SANDBOXING' => 'NO',
22
+ }
23
+ spec.pod_target_xcconfig = {
24
+ 'KOTLIN_PROJECT_PATH' => ':compose',
25
+ 'PRODUCT_MODULE_NAME' => 'kits',
26
+ }
27
+ spec.script_phases = [
28
+ {
29
+ :name => 'Build compose',
30
+ :execution_position => :before_compile,
31
+ :shell_path => '/bin/sh',
32
+ :script => <<-SCRIPT
33
+ if [ "YES" = "$OVERRIDE_KOTLIN_BUILD_IDE_SUPPORTED" ]; then
34
+ echo "Skipping Gradle build task invocation due to OVERRIDE_KOTLIN_BUILD_IDE_SUPPORTED environment variable set to \"YES\""
35
+ exit 0
36
+ fi
37
+ set -ev
38
+ REPO_ROOT="$PODS_TARGET_SRCROOT"
39
+ "$REPO_ROOT/../gradlew" -p "$REPO_ROOT" $KOTLIN_PROJECT_PATH:syncFramework \
40
+ -Pkotlin.native.cocoapods.platform=$PLATFORM_NAME \
41
+ -Pkotlin.native.cocoapods.archs="$ARCHS" \
42
+ -Pkotlin.native.cocoapods.configuration="$CONFIGURATION"
43
+ SCRIPT
44
+ }
45
+ ]
46
+ spec.resources = ['build/compose/cocoapods/compose-resources']
47
+ end
@@ -0,0 +1,250 @@
1
+ package vn.momo.kits.fpsmonitor
2
+
3
+ import android.content.Context
4
+ import android.graphics.Canvas
5
+ import android.graphics.Color
6
+ import android.graphics.Paint
7
+ import android.graphics.Rect
8
+ import android.graphics.RectF
9
+ import android.view.View
10
+ import kotlin.math.max
11
+ import kotlin.math.min
12
+
13
+ class FPSGraphView(context: Context) : View(context) {
14
+ private val fpsValues = mutableListOf<Float>()
15
+ private val cpuTimeValues = mutableListOf<Float>()
16
+ private val gpuTimeValues = mutableListOf<Float>()
17
+ private val maxPoints = 100
18
+
19
+ private var currentMetrics: FPSMetrics? = null
20
+ private var collapsed = false
21
+ private val density = resources.displayMetrics.density
22
+ private val scaledDensity = resources.displayMetrics.density * resources.configuration.fontScale
23
+
24
+ private val fpsColor = Color.rgb(0, 255, 0)
25
+ private val cpuColor = Color.rgb(255, 165, 0)
26
+ private val gpuColor = Color.rgb(0, 191, 255)
27
+ private val memColor = Color.rgb(255, 105, 180)
28
+ private val backgroundPaint = Paint(Paint.ANTI_ALIAS_FLAG).apply {
29
+ color = Color.argb(153, 0, 0, 0)
30
+ }
31
+ private val textPaint = Paint(Paint.ANTI_ALIAS_FLAG).apply {
32
+ color = Color.WHITE
33
+ textSize = 12.sp
34
+ }
35
+ private val linePaint = Paint(Paint.ANTI_ALIAS_FLAG).apply {
36
+ strokeWidth = 1.25f.dp
37
+ style = Paint.Style.STROKE
38
+ }
39
+ private val gridPaint = Paint(Paint.ANTI_ALIAS_FLAG).apply {
40
+ color = Color.argb(25, 255, 255, 255)
41
+ strokeWidth = 0.5f.dp
42
+ style = Paint.Style.STROKE
43
+ }
44
+
45
+ init {
46
+ setLayerType(LAYER_TYPE_SOFTWARE, null)
47
+ }
48
+
49
+ fun toggleCollapse() {
50
+ collapsed = !collapsed
51
+ requestLayout()
52
+ invalidate()
53
+ }
54
+
55
+ fun updateMetrics(metrics: FPSMetrics) {
56
+ currentMetrics = metrics
57
+ append(fpsValues, metrics.fps)
58
+ append(cpuTimeValues, metrics.estCPUTimePerFrameMs)
59
+ append(gpuTimeValues, metrics.estGPUTimePerFrameMs)
60
+ requestLayout()
61
+ invalidate()
62
+ }
63
+
64
+ override fun onMeasure(widthMeasureSpec: Int, heightMeasureSpec: Int) {
65
+ if (collapsed) {
66
+ setMeasuredDimension(72.dp.toInt(), 44.dp.toInt())
67
+ return
68
+ }
69
+
70
+ textPaint.textSize = 12.sp
71
+ val metrics = currentMetrics
72
+ val deviceInfo = metrics?.deviceInfo
73
+ val lines = listOf(
74
+ "${deviceInfo?.deviceName ?: "Device"} [${deviceInfo?.resolution ?: "0x0"}]",
75
+ "${String.format("%.1f", deviceInfo?.density ?: 1f)}x ${deviceInfo?.refreshRate?.toInt() ?: 60}Hz",
76
+ "Pre: 99.99ms [99.99 99.99]",
77
+ "GPU: 99.99ms [99.99 99.99]",
78
+ "Mem: 999.9MB",
79
+ "FPS: 99.99 [99.99 99.99]",
80
+ )
81
+ val desiredWidth = max(220.dp, lines.maxOf { textPaint.measureText(it) } + 16.dp).toInt()
82
+ val desiredHeight = 156.dp.toInt()
83
+
84
+ setMeasuredDimension(
85
+ resolveSize(desiredWidth, widthMeasureSpec),
86
+ resolveSize(desiredHeight, heightMeasureSpec),
87
+ )
88
+ }
89
+
90
+ override fun onDraw(canvas: Canvas) {
91
+ super.onDraw(canvas)
92
+ canvas.drawRoundRect(RectF(0f, 0f, width.toFloat(), height.toFloat()), 8.dp, 8.dp, backgroundPaint)
93
+
94
+ if (collapsed) {
95
+ drawCollapsed(canvas)
96
+ } else {
97
+ drawExpanded(canvas)
98
+ }
99
+ }
100
+
101
+ private fun drawCollapsed(canvas: Canvas) {
102
+ val fpsText = String.format("%.0f", currentMetrics?.fps ?: 0f)
103
+ textPaint.color = Color.WHITE
104
+ textPaint.textSize = 18.sp
105
+ val bounds = Rect()
106
+ textPaint.getTextBounds(fpsText, 0, fpsText.length, bounds)
107
+ canvas.drawText(
108
+ fpsText,
109
+ (width - bounds.width()) / 2f,
110
+ (height + bounds.height()) / 2f,
111
+ textPaint,
112
+ )
113
+ }
114
+
115
+ private fun drawExpanded(canvas: Canvas) {
116
+ val metrics = currentMetrics
117
+ val margin = 8.dp
118
+ var y = margin + 12.sp
119
+
120
+ textPaint.textSize = 12.sp
121
+ textPaint.color = Color.WHITE
122
+
123
+ val deviceInfo = metrics?.deviceInfo
124
+ drawSplit(canvas, deviceInfo?.deviceName ?: "Device", "[${deviceInfo?.resolution ?: "0x0"}]", y, Color.WHITE)
125
+ y += 15.sp
126
+ drawSplit(
127
+ canvas,
128
+ "${String.format("%.1f", deviceInfo?.density ?: 1f)}x",
129
+ "${deviceInfo?.refreshRate?.toInt() ?: 60}Hz",
130
+ y,
131
+ Color.WHITE,
132
+ )
133
+ y += 18.sp
134
+
135
+ val cpuMinMax = minMax(cpuTimeValues, metrics?.estCPUTimePerFrameMs ?: 0f)
136
+ val gpuMinMax = minMax(gpuTimeValues, metrics?.estGPUTimePerFrameMs ?: 0f)
137
+ val fpsMinMax = minMax(fpsValues, metrics?.fps ?: 0f)
138
+
139
+ drawSplit(
140
+ canvas,
141
+ "Pre: ${String.format("%.2f", metrics?.estCPUTimePerFrameMs ?: 0f)}ms",
142
+ "[${String.format("%.2f", cpuMinMax.first)} ${String.format("%.2f", cpuMinMax.second)}]",
143
+ y,
144
+ cpuColor,
145
+ )
146
+ y += 15.sp
147
+
148
+ drawSplit(
149
+ canvas,
150
+ "GPU: ${String.format("%.2f", metrics?.estGPUTimePerFrameMs ?: 0f)}ms",
151
+ "[${String.format("%.2f", gpuMinMax.first)} ${String.format("%.2f", gpuMinMax.second)}]",
152
+ y,
153
+ gpuColor,
154
+ )
155
+ y += 15.sp
156
+
157
+ drawText(canvas, "Mem: ${String.format("%.1f", metrics?.appMemoryMB ?: 0f)}MB", margin, y, memColor)
158
+ y += 15.sp
159
+
160
+ drawSplit(
161
+ canvas,
162
+ "FPS: ${String.format("%.2f", metrics?.fps ?: 0f)}",
163
+ "[${String.format("%.2f", fpsMinMax.first)} ${String.format("%.2f", fpsMinMax.second)}]",
164
+ y,
165
+ fpsColor,
166
+ )
167
+ y += 17.sp
168
+
169
+ val graphHeight = height - y - margin
170
+ if (graphHeight > 24.dp) {
171
+ drawGraph(canvas, margin, y, width - margin * 2, graphHeight)
172
+ }
173
+ }
174
+
175
+ private fun drawSplit(canvas: Canvas, left: String, right: String, y: Float, color: Int) {
176
+ val margin = 8.dp
177
+ drawText(canvas, left, margin, y, color)
178
+ textPaint.color = color
179
+ canvas.drawText(right, width - margin - textPaint.measureText(right), y, textPaint)
180
+ }
181
+
182
+ private fun drawText(canvas: Canvas, text: String, x: Float, y: Float, color: Int) {
183
+ textPaint.color = color
184
+ canvas.drawText(text, x, y, textPaint)
185
+ }
186
+
187
+ private fun drawGraph(canvas: Canvas, x: Float, y: Float, graphWidth: Float, graphHeight: Float) {
188
+ canvas.drawRect(x, y, x + graphWidth, y + graphHeight, gridPaint)
189
+ for (index in 1..3) {
190
+ val gridY = y + index * (graphHeight / 4f)
191
+ canvas.drawLine(x + 2.dp, gridY, x + graphWidth - 2.dp, gridY, gridPaint)
192
+ }
193
+
194
+ var gridX = x + 16.dp
195
+ while (gridX < x + graphWidth) {
196
+ canvas.drawLine(gridX, y, gridX, y + graphHeight, gridPaint)
197
+ gridX += 16.dp
198
+ }
199
+
200
+ linePaint.color = fpsColor
201
+ drawDataLine(canvas, fpsValues, x, y, graphWidth, graphHeight, 60f)
202
+ linePaint.color = cpuColor
203
+ drawDataLine(canvas, cpuTimeValues, x, y, graphWidth, graphHeight, 50f)
204
+ }
205
+
206
+ private fun drawDataLine(
207
+ canvas: Canvas,
208
+ values: List<Float>,
209
+ x: Float,
210
+ y: Float,
211
+ graphWidth: Float,
212
+ graphHeight: Float,
213
+ maxScale: Float,
214
+ ) {
215
+ if (values.size < 2) return
216
+ val visibleValues = values.takeLast(max((graphWidth / 2.dp).toInt(), 2))
217
+ val step = (graphWidth - 4.dp) / (visibleValues.size - 1).coerceAtLeast(1)
218
+ var previousX = x + 2.dp
219
+ var previousY = y + graphHeight * (1f - visibleValues.first().coerceIn(0f, maxScale) / maxScale)
220
+
221
+ visibleValues.drop(1).forEachIndexed { index, value ->
222
+ val pointX = x + 2.dp + (index + 1) * step
223
+ val pointY = y + graphHeight * (1f - min(max(value / maxScale, 0f), 1f))
224
+ canvas.drawLine(previousX, previousY, pointX, pointY, linePaint)
225
+ previousX = pointX
226
+ previousY = pointY
227
+ }
228
+ }
229
+
230
+ private fun append(values: MutableList<Float>, value: Float) {
231
+ if (values.size >= maxPoints) values.removeAt(0)
232
+ values.add(value)
233
+ }
234
+
235
+ private fun minMax(values: List<Float>, fallback: Float): Pair<Float, Float> {
236
+ return Pair(values.minOrNull() ?: fallback, values.maxOrNull() ?: fallback)
237
+ }
238
+
239
+ private val Int.dp: Float
240
+ get() = toFloat().dp
241
+
242
+ private val Float.dp: Float
243
+ get() = this * density
244
+
245
+ private val Int.sp: Float
246
+ get() = toFloat().sp
247
+
248
+ private val Float.sp: Float
249
+ get() = this * scaledDensity
250
+ }