Skip to content

Commit 80ce1ee

Browse files
committed
Refactoring MvpScreenFactory
1 parent 7477ec9 commit 80ce1ee

File tree

6 files changed

+41
-41
lines changed

6 files changed

+41
-41
lines changed

annotations/src/main/java/com/omega_r/base/annotations/AutoPresenterLauncher.kt

Lines changed: 0 additions & 10 deletions
This file was deleted.

app/src/main/java/com/omega_r/base/simple/MainPresenter.kt

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,15 @@
11
package com.omega_r.base.simple
22

33
import android.os.SystemClock
4-
import com.omega_r.base.annotations.AutoPresenterLauncher
54
import com.omega_r.base.mvp.presenters.OmegaPresenter
5+
import com.omega_r.base.simple.dialog_fragment.DialogScreenFactory
66
import com.omega_r.libs.omegatypes.Text
77
import java.io.Serializable
88

99
/**
1010
* Created by Anton Knyazev on 06.05.19.
1111
*/
1212
typealias TestEntity2 = TestEntity
13-
@AutoPresenterLauncher(MainActivity::class, TestFragment::class)
1413
class MainPresenter(testEntity: TestEntity?, t2: TestEntity2?): OmegaPresenter<MainView>() {
1514

1615
companion object {
@@ -23,8 +22,7 @@ class MainPresenter(testEntity: TestEntity?, t2: TestEntity2?): OmegaPresenter<M
2322
lastTime = SystemClock.elapsedRealtime()
2423

2524
if (testEntity == null) {
26-
// MainActivity::class.createLauncher(testEntity, t2).launch()
27-
MainPresenterFactory.createMainActivityLauncher(TestEntity(), TestEntity()).launch()
25+
MainScreenFactory.createLauncher(TestEntity(), TestEntity()).launch()
2826
} else {
2927
println("TestAnt: $time")
3028
viewState.showToast(Text.from(time.toString()))
@@ -43,8 +41,7 @@ class MainPresenter(testEntity: TestEntity?, t2: TestEntity2?): OmegaPresenter<M
4341
// }
4442
// }
4543

46-
// DialogDialogFragment.createLauncher()
47-
// .launch()
44+
DialogScreenFactory.createLauncher().launch()
4845
// viewState.showMe
4946
// log {
5047
// "Message"

app/src/main/java/com/omega_r/base/simple/dialog_fragment/DialogDialogFragment.kt

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -13,13 +13,8 @@ import com.omegar.libs.omegalaunchers.createDialogFragmentLauncher
1313
@OmegaContentView(R.layout.activity_main)
1414
class DialogDialogFragment : OmegaDialogFragment(), DialogView {
1515

16-
companion object {
17-
fun createLauncher() = createDialogFragmentLauncher()
18-
}
1916

20-
override val presenter: DialogPresenter by providePresenter {
21-
DialogPresenter()
22-
}
17+
override val presenter: DialogPresenter by providePresenter()
2318

2419
override fun onCreate(savedInstanceState: Bundle?) {
2520
super.onCreate(savedInstanceState)

core/src/main/java/com/omega_r/base/mvp/factory/MvpPresentersFactory.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,11 +7,11 @@ import kotlin.reflect.KClass
77

88
object MvpPresentersFactory {
99

10-
private val factoryMap = mutableMapOf<KClass<out MvpPresenter<*>>, MvpPresenterFactory<*>>()
10+
private val factoryMap = mutableMapOf<KClass<out MvpPresenter<*>>, MvpScreenFactory<*>>()
1111

1212
fun hasFactory(presenterClass: KClass<out MvpPresenter<*>>) = factoryMap.containsKey(presenterClass)
1313

14-
fun <P : MvpPresenter<*>> addFactory(presenterClass: KClass<P>, factory: MvpPresenterFactory<P>) {
14+
fun <P : MvpPresenter<*>> addFactory(presenterClass: KClass<P>, factory: MvpScreenFactory<P>) {
1515
factoryMap[presenterClass] = factory
1616
}
1717

core/src/main/java/com/omega_r/base/mvp/factory/MvpPresenterFactory.kt renamed to core/src/main/java/com/omega_r/base/mvp/factory/MvpScreenFactory.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ import com.omegar.mvp.presenter.PresenterType
2121
import java.io.Serializable
2222
import kotlin.reflect.KClass
2323

24-
abstract class MvpPresenterFactory<Presenter : MvpPresenter<*>>(
24+
abstract class MvpScreenFactory<Presenter : MvpPresenter<*>>(
2525
internal val presenterType: PresenterType,
2626
private val presenterClass: KClass<Presenter>,
2727
) {

mvp-processor/src/main/java/com/omegar/mvp_processor/MvpProcessor.kt

Lines changed: 34 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@ package com.omegar.mvp_processor
22

33
import com.google.devtools.ksp.KspExperimental
44
import com.google.devtools.ksp.getAllSuperTypes
5-
import com.google.devtools.ksp.getAnnotationsByType
65
import com.google.devtools.ksp.getClassDeclarationByName
76
import com.google.devtools.ksp.processing.CodeGenerator
87
import com.google.devtools.ksp.processing.KSPLogger
@@ -18,7 +17,7 @@ import com.google.devtools.ksp.symbol.KSTypeReference
1817
import com.google.devtools.ksp.symbol.KSValueParameter
1918
import com.google.devtools.ksp.symbol.KSVisitorVoid
2019
import com.google.devtools.ksp.validate
21-
import com.omega_r.base.annotations.AutoPresenterLauncher
20+
import com.omegar.mvp.MvpPresenter
2221
import com.omegar.mvp.MvpView
2322
import com.squareup.kotlinpoet.ClassName
2423
import com.squareup.kotlinpoet.CodeBlock
@@ -51,7 +50,7 @@ class MvpProcessor(
5150
companion object {
5251

5352
private val PRESENTER_TYPE = ClassName("com.omegar.mvp.presenter", "PresenterType")
54-
private val MVP_PRESENTER_FACTORY = ClassName("com.omega_r.base.mvp.factory", "MvpPresenterFactory")
53+
private val MVP_PRESENTER_FACTORY = ClassName("com.omega_r.base.mvp.factory", "MvpScreenFactory")
5554
private val BUNDLE = ClassName("android.os", "Bundle")
5655
private val PARCELABLE = ClassName("android.os", "Parcelable")
5756
private val SERIALIZABLE = ClassName("java.io", "Serializable")
@@ -73,7 +72,7 @@ class MvpProcessor(
7372
private val delegateLauncherMap = mapOf(
7473
DelegateType.ACTIVITY to ACTIVITY_LAUNCHER_NAME,
7574
DelegateType.FRAGMENT to FRAGMENT_LAUNCHER_NAME,
76-
DelegateType.DIALOG_FRAGMENT to DIALOG_FRAGMENT_NAME,
75+
DelegateType.DIALOG_FRAGMENT to DIALOG_FRAGMENT_LAUNCHER_NAME,
7776
)
7877

7978
private val mvpDelegateLauncherMap = mapOf(
@@ -83,17 +82,25 @@ class MvpProcessor(
8382
)
8483
}
8584

85+
private var isProcessed = false
8686

8787
override fun process(resolver: Resolver): List<KSAnnotated> {
88+
if (isProcessed) {
89+
return emptyList()
90+
}
91+
isProcessed = true
8892
val serializableType = resolver.getClassDeclarationByName(SERIALIZABLE.canonicalName)!!.asType(emptyList())
8993
val parcelableType = resolver.getClassDeclarationByName(PARCELABLE.canonicalName)!!.asType(emptyList())
9094
val activityType = resolver.getClassDeclarationByName(ACTIVITY_NAME.canonicalName)!!.asType(emptyList())
9195
val fragmentType = resolver.getClassDeclarationByName(FRAGMENT_NAME.canonicalName)!!.asType(emptyList())
9296
val dialogFragmentType = resolver.getClassDeclarationByName(DIALOG_FRAGMENT_NAME.canonicalName)!!.asType(emptyList())
9397
val mvpView = resolver.getClassDeclarationByName(MvpView::class.qualifiedName!!)!!.asStarProjectedType()
98+
val mvpPresenter = resolver.getClassDeclarationByName(MvpPresenter::class.qualifiedName!!)!!.asStarProjectedType()
9499

95-
return resolver.getSymbolsWithAnnotation(AutoPresenterLauncher::class.qualifiedName!!)
100+
return resolver.getAllFiles()
101+
.flatMap { it.declarations }
96102
.filterIsInstance<KSClassDeclaration>()
103+
.filter { mvpPresenter.isAssignableFrom(it.asStarProjectedType()) }
97104
.filter {
98105
if (it.validate()) {
99106
it.accept(
@@ -103,7 +110,8 @@ class MvpProcessor(
103110
activityType = activityType,
104111
fragmentType = fragmentType,
105112
dialogFragmentType = dialogFragmentType,
106-
mvpView = mvpView
113+
mvpView = mvpView,
114+
resolver = resolver
107115
),
108116
data = Unit
109117
)
@@ -120,28 +128,38 @@ class MvpProcessor(
120128
private val fragmentType: KSType,
121129
private val dialogFragmentType: KSType,
122130
private val mvpView: KSType,
131+
private val resolver: Resolver,
123132

124133
) : KSVisitorVoid() {
125134

126135
@OptIn(KspExperimental::class)
127136
override fun visitClassDeclaration(classDeclaration: KSClassDeclaration, data: Unit) {
128-
val factoryName = classDeclaration.simpleName.asString() + "Factory"
137+
val factoryName = classDeclaration.simpleName.asString().replace("Presenter", "") + "ScreenFactory"
129138

130-
val annotation = classDeclaration.getAnnotationsByType(AutoPresenterLauncher::class).first()
131-
val ksAnnotation = classDeclaration.annotations.first {
132-
it.annotationType.resolve().declaration.qualifiedName?.asString() == AutoPresenterLauncher::class.qualifiedName
133-
}
134-
val targetClass = ksAnnotation.arguments.first { it.name?.asString() == "delegatedClass" }.value as List<KSType>
139+
val (_, view) = classDeclaration.getSuperPresenterAndView()
135140

136-
val presenterType = if (annotation.localPresenterType) "LOCAL" else "GLOBAL"
141+
val targetClass = resolver.getAllFiles()
142+
.flatMap { it.declarations }
143+
.filterIsInstance<KSClassDeclaration>()
144+
.map { it.asStarProjectedType() }
145+
.filter {
146+
(it.isActivity() || it.isFragment() || it.isDialogFragment()) && (view.isAssignableFrom(it))
147+
}
148+
.toList()
149+
150+
val presenterType = "LOCAL"
137151

138-
val (_, view) = classDeclaration.getSuperPresenterAndView()
139152
val viewStateName = view.toClassName().simpleName.replace("View", "MvpViewState")
140153

141154
val presenterClassName = classDeclaration.toClassName()
142155

143156
val typeSpec = TypeSpec.objectBuilder(factoryName)
144-
.addOriginatingKSFile(classDeclaration.containingFile!!)
157+
.apply {
158+
addOriginatingKSFile(classDeclaration.containingFile!!)
159+
targetClass.forEach {
160+
addOriginatingKSFile(it.declaration.containingFile!!)
161+
}
162+
}
145163
.superclass(MVP_PRESENTER_FACTORY.parameterizedBy(presenterClassName))
146164
.addSuperclassConstructorParameter("%T.$presenterType, %T::class", PRESENTER_TYPE, presenterClassName)
147165
.addInitializerBlock(CodeBlock.of( "$viewStateName.Companion"))
@@ -330,8 +348,8 @@ class MvpProcessor(
330348

331349
private fun KSType.getDelegateType() = when {
332350
isActivity() -> DelegateType.ACTIVITY
333-
isFragment() -> DelegateType.FRAGMENT
334351
isDialogFragment() -> DelegateType.DIALOG_FRAGMENT
352+
isFragment() -> DelegateType.FRAGMENT
335353
else -> throw IllegalArgumentException("Unknown type $this")
336354
}
337355

0 commit comments

Comments
 (0)