Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

style: improve Kotlin code #1558

Merged
merged 65 commits into from
Sep 16, 2022
Merged
Show file tree
Hide file tree
Changes from 63 commits
Commits
Show all changes
65 commits
Select commit Hold shift + click to select a range
3d497f8
chore: add method for resolving appropriate fragment manager
kkafar Aug 11, 2022
843877a
fix: resolve appropriate fragment manager
kkafar Aug 11, 2022
caa9bc8
refact: change method name
kkafar Aug 11, 2022
14447e8
chore: make return type non nullable
kkafar Aug 11, 2022
b8067da
chore: clarify comments & simplify logic
kkafar Aug 11, 2022
94ff164
chore: refactor code & add checks
kkafar Aug 12, 2022
085358b
fix: typo
kkafar Aug 12, 2022
20ca3fe
refact: another typo
kkafar Aug 13, 2022
67c1220
chore: take advantage of FragmentManager#findFragment method
kkafar Aug 13, 2022
986b65c
chore: add link to the issue
kkafar Aug 13, 2022
fa9a43f
refact: use checkNotNull in place of explicit comparision against null
kkafar Aug 13, 2022
8c8429d
style: Kotlin
kkafar Aug 13, 2022
539ad64
refact: ScreenContainer#createTransaction
kkafar Aug 13, 2022
256721b
refact: ScreenContainer#{getActivityState,hasScreen}
kkafar Aug 13, 2022
07c6674
refact: ScreenContainer#getScreenAt
kkafar Aug 13, 2022
a4e52b8
refact: ScreenContainer#removeMyFragments
kkafar Aug 13, 2022
37bdbd8
refact: ScreenContainer#topScreen
kkafar Aug 13, 2022
ed743e8
refact: ScreenContainer#onMeasure
kkafar Aug 13, 2022
8861605
refact: ScreenContainer#onUpdate
kkafar Aug 13, 2022
42abad1
refact: ScreenStackViewManager#getName
kkafar Aug 13, 2022
a03b6ce
refact: ScreenStackViewManager#createViewInstance
kkafar Aug 13, 2022
6329a62
refact: ScreenStackViewManager#startTransitionRecursive
kkafar Aug 13, 2022
b301661
refact: ScreenStackViewManager#(series of getters)
kkafar Aug 13, 2022
b8ce077
refact: ScreenStackFragment#setToolbar
kkafar Aug 13, 2022
fcd88b8
refact: ScreenStackFragment#onContainerUpdate
kkafar Aug 13, 2022
71f5de7
refact: ScreenStackFragment#onCreateView
kkafar Aug 13, 2022
8b77b28
refact: ScreenStackFragment#updateToolbarMenu
kkafar Aug 14, 2022
33116c5
refact: ScreenStackFragment#startAnimation
kkafar Aug 14, 2022
076bac8
refact: CustomSearchView
kkafar Aug 14, 2022
9219570
refact: LifecycleHelper#unregister
kkafar Aug 14, 2022
251f1a8
refact: RNSScreenPackage#createNativeModules
kkafar Aug 14, 2022
51427f3
refact: Screen#headerConfig
kkafar Aug 14, 2022
3c1d887
refact: ScreenContainerViewManager
kkafar Aug 14, 2022
0da9a3d
refact: ScreenFragment#onCreateView
kkafar Aug 14, 2022
b00faad
refact: ScreenFragment#canDispatchEvent
kkafar Aug 14, 2022
614ab52
refact: ScreenFragment#dispatchEventInChildContainers
kkafar Aug 14, 2022
bd95c10
refact: ScreenFragment#dispatchHeaderBackButtonClickedEvent
kkafar Aug 14, 2022
15c4fb8
refact: ScreenFragment#dispatchTransitionProgress
kkafar Aug 14, 2022
52693ec
refact: ScreenFragment#onDestroy
kkafar Aug 14, 2022
a719766
refact: ScreenStack#rootScreen
kkafar Aug 14, 2022
13824db
refact: ScreenStack#adapt
kkafar Aug 14, 2022
9dc50f9
refact: ScreenStack#dispatchonfinishTransitioning
kkafar Aug 14, 2022
25db443
refact: ScreenStack#removeScreenAt
kkafar Aug 14, 2022
96c9ae0
refact: ScreenStack#hasScreen
kkafar Aug 14, 2022
de32e7d
refact: spotless for ScreenContainer
kkafar Aug 14, 2022
5298956
chore: add RNSUtil with forEachSatisfying method
kkafar Aug 14, 2022
527575c
refact: ScreenStack#notifyContainerUpdate
kkafar Aug 14, 2022
78a9646
refact: ScreenStack#obtainDrawingOp
kkafar Aug 14, 2022
4a38f22
refact: ScreenStack#companion
kkafar Aug 14, 2022
eac18b7
refact: ScreenStackHeaderConfig#screen
kkafar Aug 14, 2022
10bcf89
refact: ScreenStackHeaderConfig#screenStack
kkafar Aug 14, 2022
3744c35
refact: ScreenStackHeaderConfig#onUpdate
kkafar Aug 14, 2022
abd434f
refact: ScreenStackHeaderConfig#getConfigSubview
kkafar Aug 14, 2022
fc2cc56
refact: ScreenStackHeaderConfig#titleTextView
kkafar Aug 14, 2022
97e4f5f
refact: ScreenStackHeaderConfigViewManager
kkafar Aug 14, 2022
c7cc6ac
refact: ScreenStackHeaderSubview
kkafar Aug 14, 2022
ad82b8a
refact: ScreenStackHeaderSubview
kkafar Aug 14, 2022
e43d03a
refact: ScreenStackheaderConfig#getName v2
kkafar Aug 14, 2022
55bfaf8
refact: ScreenViewManager
kkafar Aug 14, 2022
6011a75
refact: ScreenWindowTraits
kkafar Aug 14, 2022
088f25b
fix: ScreenStackHeaderSubview#config
kkafar Aug 15, 2022
c370c24
fix: restore initial logic in ScreenFragment#onCreateView
kkafar Aug 19, 2022
7ab0d70
Merge branch 'main' into @kkafar/improve-kotlin
kkafar Aug 19, 2022
7aad6e6
style: apply review suggestions
kkafar Aug 23, 2022
c8543d7
chore: merge in main
kkafar Sep 15, 2022
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,9 @@ class CustomSearchView(context: Context, fragment: Fragment) : SearchView(contex
isIconified = true
}
}

private val backPressOverrider = FragmentBackPressOverrider(fragment, mOnBackPressedCallback)

var overrideBackAction: Boolean
set(value) {
backPressOverrider.overrideBackAction = value
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -43,8 +43,7 @@ class LifecycleHelper {
}

fun <T> unregister(view: T) where T : View, T : LifecycleObserver? {
val lifecycle = mViewToLifecycleMap[view]
lifecycle?.removeObserver(view)
mViewToLifecycleMap[view]?.removeObserver(view)
}

companion object {
Expand Down
5 changes: 5 additions & 0 deletions android/src/main/java/com/swmansion/rnscreens/RNSUtil.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
package com.swmansion.rnscreens

public inline fun <T> Iterable<T>.forEachSatisfying(predicate: (T) -> Boolean, action: (T) -> Unit) {
kkafar marked this conversation as resolved.
Show resolved Hide resolved
for (element in this) if (predicate(element)) action(element)
}
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ class RNScreensPackage : ReactPackage {
// This should no longer be needed if RN's autolink mechanism has Fabric support
SoLoader.loadLibrary("rnscreens_modules")
}
return emptyList<NativeModule>()
return emptyList()
}

override fun createViewManagers(reactContext: ReactApplicationContext) =
Expand Down
7 changes: 1 addition & 6 deletions android/src/main/java/com/swmansion/rnscreens/Screen.kt
Original file line number Diff line number Diff line change
Expand Up @@ -84,12 +84,7 @@ class Screen constructor(context: ReactContext?) : FabricEnabledViewGroup(contex
}

val headerConfig: ScreenStackHeaderConfig?
get() {
val child = getChildAt(0)
return if (child is ScreenStackHeaderConfig) {
child
} else null
}
get() = getChildAt(0).takeIf { it is ScreenStackHeaderConfig } as ScreenStackHeaderConfig?
kkafar marked this conversation as resolved.
Show resolved Hide resolved

/**
* While transitioning this property allows to optimize rendering behavior on Android and provide
Expand Down
45 changes: 17 additions & 28 deletions android/src/main/java/com/swmansion/rnscreens/ScreenContainer.kt
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,7 @@ open class ScreenContainer<T : ScreenFragment>(context: Context?) : ViewGroup(co
}
}
private var mParentScreenFragment: ScreenFragment? = null

override fun onLayout(changed: Boolean, l: Int, t: Int, r: Int, b: Int) {
var i = 0
val size = childCount
Expand Down Expand Up @@ -116,19 +117,10 @@ open class ScreenContainer<T : ScreenFragment>(context: Context?) : ViewGroup(co
val screenCount: Int
get() = mScreenFragments.size

fun getScreenAt(index: Int): Screen {
return mScreenFragments[index].screen
}
fun getScreenAt(index: Int): Screen = mScreenFragments[index].screen

open val topScreen: Screen?
get() {
for (screenFragment in mScreenFragments) {
if (getActivityState(screenFragment) === ActivityState.ON_TOP) {
return screenFragment.screen
}
}
return null
}
get() = mScreenFragments.firstOrNull { getActivityState(it) === ActivityState.ON_TOP }?.screen

private fun setFragmentManager(fm: FragmentManager) {
mFragmentManager = fm
Expand Down Expand Up @@ -200,10 +192,9 @@ open class ScreenContainer<T : ScreenFragment>(context: Context?) : ViewGroup(co
}

protected fun createTransaction(): FragmentTransaction {
val fragmentManager = requireNotNull(mFragmentManager, { "mFragmentManager is null when creating transaction" })
val transaction = fragmentManager.beginTransaction()
transaction.setReorderingAllowed(true)
return transaction
return requireNotNull(mFragmentManager) { "mFragmentManager is null when creating transaction" }
.beginTransaction()
.setReorderingAllowed(true)
}

private fun attachScreen(transaction: FragmentTransaction, screenFragment: ScreenFragment) {
Expand All @@ -214,13 +205,11 @@ open class ScreenContainer<T : ScreenFragment>(context: Context?) : ViewGroup(co
transaction.remove(screenFragment)
}

private fun getActivityState(screenFragment: ScreenFragment): ActivityState? {
return screenFragment.screen.activityState
}
private fun getActivityState(screenFragment: ScreenFragment): ActivityState? =
screenFragment.screen.activityState

open fun hasScreen(screenFragment: ScreenFragment?): Boolean {
return mScreenFragments.contains(screenFragment)
}
open fun hasScreen(screenFragment: ScreenFragment?): Boolean =
mScreenFragments.contains(screenFragment)

override fun onAttachedToWindow() {
super.onAttachedToWindow()
Expand All @@ -233,9 +222,7 @@ open class ScreenContainer<T : ScreenFragment>(context: Context?) : ViewGroup(co
val transaction = fragmentManager.beginTransaction()
var hasFragments = false
for (fragment in fragmentManager.fragments) {
if (fragment is ScreenFragment &&
fragment.screen.container === this
) {
if (fragment is ScreenFragment && fragment.screen.container === this) {
transaction.remove(fragment)
hasFragments = true
}
Expand Down Expand Up @@ -284,11 +271,9 @@ open class ScreenContainer<T : ScreenFragment>(context: Context?) : ViewGroup(co

override fun onMeasure(widthMeasureSpec: Int, heightMeasureSpec: Int) {
super.onMeasure(widthMeasureSpec, heightMeasureSpec)
var i = 0
val size = childCount
while (i < size) {
for (i in 0 until size) {
kkafar marked this conversation as resolved.
Show resolved Hide resolved
getChildAt(i).measure(widthMeasureSpec, heightMeasureSpec)
i++
}
}

Expand Down Expand Up @@ -332,7 +317,11 @@ open class ScreenContainer<T : ScreenFragment>(context: Context?) : ViewGroup(co
open fun onUpdate() {
createTransaction().let {
// detach screens that are no longer active
val orphaned: MutableSet<Fragment> = HashSet(requireNotNull(mFragmentManager, { "mFragmentManager is null when performing update in ScreenContainer" }).fragments)
val orphaned: MutableSet<Fragment> = HashSet(
requireNotNull(mFragmentManager) {
"mFragmentManager is null when performing update in ScreenContainer"
}.fragments
)
for (screenFragment in mScreenFragments) {
if (getActivityState(screenFragment) === ActivityState.INACTIVE &&
screenFragment.isAdded
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,13 +9,9 @@ import com.facebook.react.uimanager.ViewGroupManager

@ReactModule(name = ScreenContainerViewManager.REACT_CLASS)
class ScreenContainerViewManager : ViewGroupManager<ScreenContainer<*>>() {
override fun getName(): String {
return REACT_CLASS
}
override fun getName(): String = REACT_CLASS

override fun createViewInstance(reactContext: ThemedReactContext): ScreenContainer<ScreenFragment> {
return ScreenContainer(reactContext)
}
override fun createViewInstance(reactContext: ThemedReactContext): ScreenContainer<ScreenFragment> = ScreenContainer(reactContext)

override fun addView(parent: ScreenContainer<*>, child: View, index: Int) {
require(child is Screen) { "Attempt attach child that is not of type RNScreens" }
Expand All @@ -30,21 +26,13 @@ class ScreenContainerViewManager : ViewGroupManager<ScreenContainer<*>>() {
parent.removeAllScreens()
}

override fun getChildCount(parent: ScreenContainer<*>): Int {
return parent.screenCount
}
override fun getChildCount(parent: ScreenContainer<*>): Int = parent.screenCount

override fun getChildAt(parent: ScreenContainer<*>, index: Int): View {
return parent.getScreenAt(index)
}
override fun getChildAt(parent: ScreenContainer<*>, index: Int): View = parent.getScreenAt(index)

override fun createShadowNodeInstance(context: ReactApplicationContext): LayoutShadowNode {
return ScreensShadowNode(context)
}
override fun createShadowNodeInstance(context: ReactApplicationContext): LayoutShadowNode = ScreensShadowNode(context)

override fun needsCustomLayoutForChildren(): Boolean {
return true
}
override fun needsCustomLayoutForChildren(): Boolean = true

companion object {
const val REACT_CLASS = "RNSScreenContainer"
Expand Down
57 changes: 23 additions & 34 deletions android/src/main/java/com/swmansion/rnscreens/ScreenFragment.kt
Original file line number Diff line number Diff line change
Expand Up @@ -74,13 +74,12 @@ open class ScreenFragment : Fragment {
container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
val wrapper = context?.let { ScreensFrameLayout(it) }

val params = FrameLayout.LayoutParams(
screen.layoutParams = FrameLayout.LayoutParams(
ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT
)
screen.layoutParams = params
wrapper?.addView(recycleView(screen))
val wrapper = context?.let { ScreensFrameLayout(it) }?.apply {
kkafar marked this conversation as resolved.
Show resolved Hide resolved
addView(recycleView(screen))
}
return wrapper
}

Expand Down Expand Up @@ -153,13 +152,11 @@ open class ScreenFragment : Fragment {
val childScreenContainers: List<ScreenContainer<*>>
get() = mChildScreenContainers

private fun canDispatchEvent(event: ScreenLifecycleEvent): Boolean {
return when (event) {
ScreenLifecycleEvent.WillAppear -> canDispatchWillAppear
ScreenLifecycleEvent.Appear -> canDispatchAppear
ScreenLifecycleEvent.WillDisappear -> !canDispatchWillAppear
ScreenLifecycleEvent.Disappear -> !canDispatchAppear
}
private fun canDispatchEvent(event: ScreenLifecycleEvent): Boolean = when (event) {
ScreenLifecycleEvent.WillAppear -> canDispatchWillAppear
ScreenLifecycleEvent.Appear -> canDispatchAppear
ScreenLifecycleEvent.WillDisappear -> !canDispatchWillAppear
ScreenLifecycleEvent.Disappear -> !canDispatchAppear
}

private fun setLastEventDispatched(event: ScreenLifecycleEvent) {
Expand All @@ -173,25 +170,21 @@ open class ScreenFragment : Fragment {

private fun dispatchOnWillAppear() {
dispatchEvent(ScreenLifecycleEvent.WillAppear, this)

dispatchTransitionProgress(0.0f, false)
}

private fun dispatchOnAppear() {
dispatchEvent(ScreenLifecycleEvent.Appear, this)

dispatchTransitionProgress(1.0f, false)
}

private fun dispatchOnWillDisappear() {
dispatchEvent(ScreenLifecycleEvent.WillDisappear, this)

dispatchTransitionProgress(0.0f, true)
}

private fun dispatchOnDisappear() {
dispatchEvent(ScreenLifecycleEvent.Disappear, this)

dispatchTransitionProgress(1.0f, true)
}

Expand All @@ -215,20 +208,16 @@ open class ScreenFragment : Fragment {
}

private fun dispatchEventInChildContainers(event: ScreenLifecycleEvent) {
for (sc in mChildScreenContainers) {
if (sc.screenCount > 0) {
sc.topScreen?.let {
sc.topScreen?.fragment?.let { fragment -> dispatchEvent(event, fragment) }
}
}
mChildScreenContainers.filter { it.screenCount > 0 }.forEach {
it.topScreen?.fragment?.let { fragment -> dispatchEvent(event, fragment) }
}
}

fun dispatchHeaderBackButtonClickedEvent() {
val screenContext = screen.context as ReactContext
val eventDispatcher: EventDispatcher? =
UIManagerHelper.getEventDispatcherForReactTag(screenContext, screen.id)
eventDispatcher?.dispatchEvent(HeaderBackButtonClickedEvent(screen.id))
UIManagerHelper
.getEventDispatcherForReactTag(screenContext, screen.id)
?.dispatchEvent(HeaderBackButtonClickedEvent(screen.id))
}

fun dispatchTransitionProgress(alpha: Float, closing: Boolean) {
Expand All @@ -244,13 +233,13 @@ open class ScreenFragment : Fragment {
val container: ScreenContainer<*>? = screen.container
val goingForward = if (container is ScreenStack) container.goingForward else false
val screenContext = screen.context as ReactContext
val eventDispatcher: EventDispatcher? =
UIManagerHelper.getEventDispatcherForReactTag(screenContext, screen.id)
eventDispatcher?.dispatchEvent(
ScreenTransitionProgressEvent(
screen.id, mProgress, closing, goingForward, coalescingKey
UIManagerHelper
.getEventDispatcherForReactTag(screenContext, screen.id)
?.dispatchEvent(
ScreenTransitionProgressEvent(
screen.id, mProgress, closing, goingForward, coalescingKey
)
)
)
}
}
}
Expand Down Expand Up @@ -305,9 +294,9 @@ open class ScreenFragment : Fragment {
// we only send dismissed even when the screen has been removed from its container
val screenContext = screen.context
if (screenContext is ReactContext) {
val eventDispatcher: EventDispatcher? =
UIManagerHelper.getEventDispatcherForReactTag(screenContext, screen.id)
eventDispatcher?.dispatchEvent(ScreenDismissedEvent(screen.id))
UIManagerHelper
.getEventDispatcherForReactTag(screenContext, screen.id)
?.dispatchEvent(ScreenDismissedEvent(screen.id))
}
}
mChildScreenContainers.clear()
Expand Down
Loading