From c2d94633a86346a167b5545f65260f29e0b3c4cf Mon Sep 17 00:00:00 2001 From: Kacper Kafara Date: Mon, 11 Sep 2023 16:15:33 +0200 Subject: [PATCH 001/307] TOREVERT: App.js & Test1649 temp changes --- TestsExample/App.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/TestsExample/App.js b/TestsExample/App.js index e1020e9e5b..95ea0f3c1e 100644 --- a/TestsExample/App.js +++ b/TestsExample/App.js @@ -94,5 +94,5 @@ import Test1864 from './src/Test1864'; enableFreeze(true); export default function App() { - return ; + return ; } From 9b3c90c55b162a334dfc13f47a9c5e8c19863ab9 Mon Sep 17 00:00:00 2001 From: Kacper Kafara Date: Mon, 11 Sep 2023 16:39:07 +0200 Subject: [PATCH 002/307] Add stub ScreenModalFragment --- .../rnscreens/ScreenModalFragment.kt | 100 ++++++++++++++++++ 1 file changed, 100 insertions(+) create mode 100644 android/src/main/java/com/swmansion/rnscreens/ScreenModalFragment.kt diff --git a/android/src/main/java/com/swmansion/rnscreens/ScreenModalFragment.kt b/android/src/main/java/com/swmansion/rnscreens/ScreenModalFragment.kt new file mode 100644 index 0000000000..8bbd8bcc36 --- /dev/null +++ b/android/src/main/java/com/swmansion/rnscreens/ScreenModalFragment.kt @@ -0,0 +1,100 @@ +package com.swmansion.rnscreens + +import android.app.Activity +import androidx.appcompat.widget.Toolbar +import androidx.fragment.app.Fragment +import com.facebook.react.bridge.ReactContext +import com.google.android.material.bottomsheet.BottomSheetDialogFragment + +class ScreenModalFragment : BottomSheetDialogFragment, ScreenStackFragmentWrapper { + override lateinit var screen: Screen + + constructor() { + throw IllegalStateException("TODO: Better error message") + } + + constructor(screen: Screen) : super() { + this.screen = screen + } + + override fun removeToolbar() { + TODO("Not yet implemented") + } + + override fun setToolbar(toolbar: Toolbar) { + TODO("Not yet implemented") + } + + override fun setToolbarShadowHidden(hidden: Boolean) { + TODO("Not yet implemented") + } + + override fun setToolbarTranslucent(translucent: Boolean) { + TODO("Not yet implemented") + } + + override fun canNavigateBack(): Boolean { + TODO("Not yet implemented") + } + + override val childScreenContainers: List + get() = TODO("Not yet implemented") + + override fun addChildContainer(container: ScreenContainer) { + TODO("Not yet implemented") + } + + override fun removeChildContainer(container: ScreenContainer) { + TODO("Not yet implemented") + } + + override fun onContainerUpdate() { + TODO("Not yet implemented") + } + + override fun onViewAnimationStart() { + TODO("Not yet implemented") + } + + override fun onViewAnimationEnd() { + TODO("Not yet implemented") + } + + override fun tryGetActivity(): Activity? { + TODO("Not yet implemented") + } + + override fun tryGetContext(): ReactContext? { + TODO("Not yet implemented") + } + + override val fragment: Fragment + get() = TODO("Not yet implemented") + + override fun canDispatchLifecycleEvent(event: ScreenFragment.ScreenLifecycleEvent): Boolean { + TODO("Not yet implemented") + } + + override fun updateLastEventDispatched(event: ScreenFragment.ScreenLifecycleEvent) { + TODO("Not yet implemented") + } + + override fun dispatchLifecycleEvent( + event: ScreenFragment.ScreenLifecycleEvent, + fragmentWrapper: ScreenFragmentWrapper + ) { + TODO("Not yet implemented") + } + + override fun dispatchLifecycleEventInChildContainers(event: ScreenFragment.ScreenLifecycleEvent) { + TODO("Not yet implemented") + } + + override fun dispatchHeaderBackButtonClickedEvent() { + TODO("Not yet implemented") + } + + override fun dispatchTransitionProgressEvent(alpha: Float, closing: Boolean) { + TODO("Not yet implemented") + } +} From dcd4373b70e3f32d555cc7b8c61c97ce37666de8 Mon Sep 17 00:00:00 2001 From: Kacper Kafara Date: Mon, 11 Sep 2023 16:43:38 +0200 Subject: [PATCH 003/307] Implement ScreenModalFragment.fragment --- .../java/com/swmansion/rnscreens/ScreenModalFragment.kt | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/android/src/main/java/com/swmansion/rnscreens/ScreenModalFragment.kt b/android/src/main/java/com/swmansion/rnscreens/ScreenModalFragment.kt index 8bbd8bcc36..bb1e5bc9d5 100644 --- a/android/src/main/java/com/swmansion/rnscreens/ScreenModalFragment.kt +++ b/android/src/main/java/com/swmansion/rnscreens/ScreenModalFragment.kt @@ -9,6 +9,9 @@ import com.google.android.material.bottomsheet.BottomSheetDialogFragment class ScreenModalFragment : BottomSheetDialogFragment, ScreenStackFragmentWrapper { override lateinit var screen: Screen + override val fragment: Fragment + get() = this + constructor() { throw IllegalStateException("TODO: Better error message") } @@ -68,9 +71,6 @@ class ScreenModalFragment : BottomSheetDialogFragment, ScreenStackFragmentWrappe TODO("Not yet implemented") } - override val fragment: Fragment - get() = TODO("Not yet implemented") - override fun canDispatchLifecycleEvent(event: ScreenFragment.ScreenLifecycleEvent): Boolean { TODO("Not yet implemented") } From 007b19ae5056f9f81982f71f034a7e0301fcd063 Mon Sep 17 00:00:00 2001 From: Kacper Kafara Date: Mon, 11 Sep 2023 17:30:13 +0200 Subject: [PATCH 004/307] TOREVERT: change stackPresentation in JS example --- TestsExample/src/Test1649.tsx | 1 + 1 file changed, 1 insertion(+) diff --git a/TestsExample/src/Test1649.tsx b/TestsExample/src/Test1649.tsx index 2822c809ee..423b2b21fe 100644 --- a/TestsExample/src/Test1649.tsx +++ b/TestsExample/src/Test1649.tsx @@ -36,6 +36,7 @@ export default function App(): JSX.Element { name="Second" component={Second} options={{ + stackPresentation: 'modal', fullScreenSwipeEnabled: true, }} /> From 5a690fcb6bc219cb4f67eabd7ed709a5449078eb Mon Sep 17 00:00:00 2001 From: Kacper Kafara Date: Mon, 11 Sep 2023 17:30:55 +0200 Subject: [PATCH 005/307] Use ScreenModalFragment wheen screen has modal stack presentation set --- .../src/main/java/com/swmansion/rnscreens/ScreenStack.kt | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/android/src/main/java/com/swmansion/rnscreens/ScreenStack.kt b/android/src/main/java/com/swmansion/rnscreens/ScreenStack.kt index b1815e5bb3..4f2e9293e7 100644 --- a/android/src/main/java/com/swmansion/rnscreens/ScreenStack.kt +++ b/android/src/main/java/com/swmansion/rnscreens/ScreenStack.kt @@ -42,7 +42,13 @@ class ScreenStack(context: Context?) : ScreenContainer(context) { throw IllegalStateException("Stack has no root screen set") } - override fun adapt(screen: Screen) = ScreenStackFragment(screen) + override fun adapt(screen: Screen): ScreenStackFragmentWrapper { + if (screen.stackPresentation != Screen.StackPresentation.MODAL) { + return ScreenStackFragment(screen) + } else { + return ScreenModalFragment(screen) + } + } override fun startViewTransition(view: View) { super.startViewTransition(view) From a6ffed8a34d1fd42994d63aae3716dc675353f85 Mon Sep 17 00:00:00 2001 From: Kacper Kafara Date: Mon, 11 Sep 2023 17:39:10 +0200 Subject: [PATCH 006/307] Add dependency on material theme 3 and use it in TestExample (potentially TO REVERT) --- TestsExample/android/app/build.gradle | 2 ++ TestsExample/android/app/src/main/res/values/styles.xml | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/TestsExample/android/app/build.gradle b/TestsExample/android/app/build.gradle index 6005bca090..13c23e596e 100644 --- a/TestsExample/android/app/build.gradle +++ b/TestsExample/android/app/build.gradle @@ -118,6 +118,8 @@ dependencies { } else { implementation jscFlavor } + + implementation("com.google.android.material:material:1.9.0") } apply from: file("../../node_modules/@react-native-community/cli-platform-android/native_modules.gradle"); applyNativeModulesAppBuildGradle(project) diff --git a/TestsExample/android/app/src/main/res/values/styles.xml b/TestsExample/android/app/src/main/res/values/styles.xml index 7ba83a2ad5..617a309ae2 100644 --- a/TestsExample/android/app/src/main/res/values/styles.xml +++ b/TestsExample/android/app/src/main/res/values/styles.xml @@ -1,7 +1,7 @@ - From 7ff64ccbdfa2462c508b6bf4ffc252f04de2d846 Mon Sep 17 00:00:00 2001 From: Kacper Kafara Date: Mon, 11 Sep 2023 17:41:33 +0200 Subject: [PATCH 007/307] linter --- TestsExample/android/app/src/main/res/values/styles.xml | 1 - 1 file changed, 1 deletion(-) diff --git a/TestsExample/android/app/src/main/res/values/styles.xml b/TestsExample/android/app/src/main/res/values/styles.xml index 617a309ae2..49ce01d350 100644 --- a/TestsExample/android/app/src/main/res/values/styles.xml +++ b/TestsExample/android/app/src/main/res/values/styles.xml @@ -5,5 +5,4 @@ @drawable/rn_edit_text_material - From 449b2b965f6093bb2ce4c9419cb05e02462406c3 Mon Sep 17 00:00:00 2001 From: Kacper Kafara Date: Mon, 11 Sep 2023 21:37:24 +0200 Subject: [PATCH 008/307] TOREVERT: Bump native deps & kotlin version in TestsExample & lib --- TestsExample/android/build.gradle | 2 +- android/build.gradle | 12 ++++++------ 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/TestsExample/android/build.gradle b/TestsExample/android/build.gradle index 88a3ddd91d..cc3af357af 100644 --- a/TestsExample/android/build.gradle +++ b/TestsExample/android/build.gradle @@ -9,7 +9,7 @@ buildscript { // We use NDK 23 which has both M1 support and is the side-by-side NDK version from AGP. ndkVersion = "23.1.7779620" - kotlinVersion = "1.6.21" + kotlinVersion = "1.8.0" } repositories { google() diff --git a/android/build.gradle b/android/build.gradle index 056a698ede..80a9dee03c 100644 --- a/android/build.gradle +++ b/android/build.gradle @@ -3,7 +3,7 @@ buildscript { rnsDefaultTargetSdkVersion = 31 rnsDefaultCompileSdkVersion = 31 rnsDefaultMinSdkVersion = 21 - rnsDefaultKotlinVersion = '1.6.21' + rnsDefaultKotlinVersion = '1.8.0' } ext.safeExtGet = {prop, fallback -> rootProject.ext.has(prop) ? rootProject.ext.get(prop) : fallback @@ -122,10 +122,10 @@ repositories { dependencies { implementation 'com.facebook.react:react-native:+' - implementation 'androidx.appcompat:appcompat:1.1.0' - implementation 'androidx.fragment:fragment:1.2.1' - implementation 'androidx.coordinatorlayout:coordinatorlayout:1.1.0' - implementation 'androidx.swiperefreshlayout:swiperefreshlayout:1.0.0' - implementation 'com.google.android.material:material:1.1.0' + implementation 'androidx.appcompat:appcompat:1.6.1' + implementation 'androidx.fragment:fragment-ktx:1.6.1' + implementation 'androidx.coordinatorlayout:coordinatorlayout:1.2.0' + implementation 'androidx.swiperefreshlayout:swiperefreshlayout:1.1.0' + implementation 'com.google.android.material:material:1.9.0' implementation "androidx.core:core-ktx:1.5.0" } From 8554c4171e9435adf508b6e293be15a03b155096 Mon Sep 17 00:00:00 2001 From: Kacper Kafara Date: Tue, 12 Sep 2023 10:39:57 +0200 Subject: [PATCH 009/307] Display modal --- .../rnscreens/ScreenModalFragment.kt | 61 ++++++++++++++++++- 1 file changed, 60 insertions(+), 1 deletion(-) diff --git a/android/src/main/java/com/swmansion/rnscreens/ScreenModalFragment.kt b/android/src/main/java/com/swmansion/rnscreens/ScreenModalFragment.kt index bb1e5bc9d5..4ec3865302 100644 --- a/android/src/main/java/com/swmansion/rnscreens/ScreenModalFragment.kt +++ b/android/src/main/java/com/swmansion/rnscreens/ScreenModalFragment.kt @@ -1,9 +1,18 @@ package com.swmansion.rnscreens import android.app.Activity +import android.graphics.Color +import android.os.Bundle +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.FrameLayout import androidx.appcompat.widget.Toolbar +import androidx.coordinatorlayout.widget.CoordinatorLayout +import androidx.core.view.children import androidx.fragment.app.Fragment import com.facebook.react.bridge.ReactContext +import com.google.android.material.bottomsheet.BottomSheetBehavior import com.google.android.material.bottomsheet.BottomSheetDialogFragment class ScreenModalFragment : BottomSheetDialogFragment, ScreenStackFragmentWrapper { @@ -20,6 +29,56 @@ class ScreenModalFragment : BottomSheetDialogFragment, ScreenStackFragmentWrappe this.screen = screen } + override fun onCreateView( + inflater: LayoutInflater, + container: ViewGroup?, + savedInstanceState: Bundle? + ): View? { + val mockCoordinatorLayout = CoordinatorLayout(requireContext()) + mockCoordinatorLayout.layoutParams = CoordinatorLayout.LayoutParams( + CoordinatorLayout.LayoutParams.WRAP_CONTENT, + CoordinatorLayout.LayoutParams.WRAP_CONTENT + ) + mockCoordinatorLayout.addView(screen) +// return screen + +// screen + + return mockCoordinatorLayout + } + + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + + val callback = object : BottomSheetBehavior.BottomSheetCallback() { + override fun onStateChanged(bottomSheet: View, newState: Int) { + println("STATE CHANGED TO $newState") + } + + override fun onSlide(bottomSheet: View, slideOffset: Float) = Unit + } + + val screen = (view as ViewGroup).children.first() as Screen + screen.layoutParams = CoordinatorLayout.LayoutParams( + FrameLayout.LayoutParams.MATCH_PARENT, + FrameLayout.LayoutParams.MATCH_PARENT + ).apply { + behavior = BottomSheetBehavior().apply { + isHideable = true + peekHeight = BottomSheetBehavior.PEEK_HEIGHT_AUTO + addBottomSheetCallback(callback) + } + } + +// view.setBackgroundColor(Color.BLUE) + view.setBackgroundColor(Color.TRANSPARENT) + screen.setBackgroundColor(Color.GREEN) + val behavior: BottomSheetBehavior = BottomSheetBehavior.from(screen) + println("maxHeight ${behavior.maxHeight} peekHeight ${behavior.peekHeight} state ${behavior.state}") + +// println(((screen.layoutParams as CoordinatorLayout.LayoutParams).behavior as BottomSheetBehavior).state) + } + override fun removeToolbar() { TODO("Not yet implemented") } @@ -52,7 +111,7 @@ class ScreenModalFragment : BottomSheetDialogFragment, ScreenStackFragmentWrappe } override fun onContainerUpdate() { - TODO("Not yet implemented") +// TODO("Not yet implemented") } override fun onViewAnimationStart() { From 47b1bcf63f27136baf32857995c76740e3e94b8e Mon Sep 17 00:00:00 2001 From: Kacper Kafara Date: Tue, 12 Sep 2023 12:44:37 +0200 Subject: [PATCH 010/307] Make StackPresentation.MODAL temporarily transparent to make sure the fragment underneath is not removed --- android/src/main/java/com/swmansion/rnscreens/ScreenStack.kt | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/android/src/main/java/com/swmansion/rnscreens/ScreenStack.kt b/android/src/main/java/com/swmansion/rnscreens/ScreenStack.kt index 4f2e9293e7..6790cf4213 100644 --- a/android/src/main/java/com/swmansion/rnscreens/ScreenStack.kt +++ b/android/src/main/java/com/swmansion/rnscreens/ScreenStack.kt @@ -333,7 +333,8 @@ class ScreenStack(context: Context?) : ScreenContainer(context) { companion object { private fun isTransparent(fragmentWrapper: ScreenFragmentWrapper): Boolean = - fragmentWrapper.screen.stackPresentation === Screen.StackPresentation.TRANSPARENT_MODAL + fragmentWrapper.screen.stackPresentation === Screen.StackPresentation.TRANSPARENT_MODAL || + fragmentWrapper.screen.stackPresentation === Screen.StackPresentation.MODAL private fun needsDrawReordering(fragmentWrapper: ScreenFragmentWrapper): Boolean = fragmentWrapper.screen.stackAnimation === StackAnimation.SLIDE_FROM_BOTTOM || From 55d57cb596e08e59f88f7e9babb275f58ac8ffa7 Mon Sep 17 00:00:00 2001 From: Kacper Kafara Date: Tue, 12 Sep 2023 14:30:37 +0200 Subject: [PATCH 011/307] Allow for dismissal --- .../com/swmansion/rnscreens/ScreenModalFragment.kt | 14 +++----------- 1 file changed, 3 insertions(+), 11 deletions(-) diff --git a/android/src/main/java/com/swmansion/rnscreens/ScreenModalFragment.kt b/android/src/main/java/com/swmansion/rnscreens/ScreenModalFragment.kt index 4ec3865302..a8e0ed824c 100644 --- a/android/src/main/java/com/swmansion/rnscreens/ScreenModalFragment.kt +++ b/android/src/main/java/com/swmansion/rnscreens/ScreenModalFragment.kt @@ -1,7 +1,6 @@ package com.swmansion.rnscreens import android.app.Activity -import android.graphics.Color import android.os.Bundle import android.view.LayoutInflater import android.view.View @@ -40,10 +39,6 @@ class ScreenModalFragment : BottomSheetDialogFragment, ScreenStackFragmentWrappe CoordinatorLayout.LayoutParams.WRAP_CONTENT ) mockCoordinatorLayout.addView(screen) -// return screen - -// screen - return mockCoordinatorLayout } @@ -52,9 +47,11 @@ class ScreenModalFragment : BottomSheetDialogFragment, ScreenStackFragmentWrappe val callback = object : BottomSheetBehavior.BottomSheetCallback() { override fun onStateChanged(bottomSheet: View, newState: Int) { + if (newState == BottomSheetBehavior.STATE_HIDDEN) { + dismiss() + } println("STATE CHANGED TO $newState") } - override fun onSlide(bottomSheet: View, slideOffset: Float) = Unit } @@ -70,13 +67,8 @@ class ScreenModalFragment : BottomSheetDialogFragment, ScreenStackFragmentWrappe } } -// view.setBackgroundColor(Color.BLUE) - view.setBackgroundColor(Color.TRANSPARENT) - screen.setBackgroundColor(Color.GREEN) val behavior: BottomSheetBehavior = BottomSheetBehavior.from(screen) println("maxHeight ${behavior.maxHeight} peekHeight ${behavior.peekHeight} state ${behavior.state}") - -// println(((screen.layoutParams as CoordinatorLayout.LayoutParams).behavior as BottomSheetBehavior).state) } override fun removeToolbar() { From 9d320c94fd7a9e4530fd7a05b4036ae147164c48 Mon Sep 17 00:00:00 2001 From: Kacper Kafara Date: Wed, 13 Sep 2023 15:18:00 +0200 Subject: [PATCH 012/307] Refactor ScreenStack.rootScreen property impl --- .../main/java/com/swmansion/rnscreens/ScreenStack.kt | 11 ++--------- 1 file changed, 2 insertions(+), 9 deletions(-) diff --git a/android/src/main/java/com/swmansion/rnscreens/ScreenStack.kt b/android/src/main/java/com/swmansion/rnscreens/ScreenStack.kt index 6790cf4213..4defdaaf55 100644 --- a/android/src/main/java/com/swmansion/rnscreens/ScreenStack.kt +++ b/android/src/main/java/com/swmansion/rnscreens/ScreenStack.kt @@ -32,15 +32,8 @@ class ScreenStack(context: Context?) : ScreenContainer(context) { get() = mTopScreen?.screen val rootScreen: Screen - get() { - for (i in 0 until screenCount) { - val screenWrapper = getScreenFragmentWrapperAt(i) - if (!mDismissed.contains(screenWrapper)) { - return screenWrapper.screen - } - } - throw IllegalStateException("Stack has no root screen set") - } + get() = mScreenFragments.firstOrNull { !mDismissed.contains(it) }?.screen + ?: throw IllegalStateException("Stack has no root screen set") override fun adapt(screen: Screen): ScreenStackFragmentWrapper { if (screen.stackPresentation != Screen.StackPresentation.MODAL) { From 81d67445e2417d35143aa290c0712a3ba09e43c2 Mon Sep 17 00:00:00 2001 From: Kacper Kafara Date: Wed, 13 Sep 2023 16:01:21 +0200 Subject: [PATCH 013/307] Go back button on Second screen in Test1649 (in TE) --- TestsExample/src/Test1649.tsx | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/TestsExample/src/Test1649.tsx b/TestsExample/src/Test1649.tsx index 423b2b21fe..4da900c40a 100644 --- a/TestsExample/src/Test1649.tsx +++ b/TestsExample/src/Test1649.tsx @@ -78,7 +78,7 @@ function Second({ navigation: NativeStackNavigationProp; }) { return ( - <> +