Skip to content

Commit 5f2f1ab

Browse files
authored
Merge pull request #50 from Trendyol/ObserveDestinationChangesClearGroupBug
Observe destination changes clear group bug
2 parents df747da + e50a9d2 commit 5f2f1ab

File tree

5 files changed

+121
-6
lines changed

5 files changed

+121
-6
lines changed

app/src/main/java/com/trendyol/medusa/MainActivity.kt

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -66,19 +66,27 @@ class MainActivity : AppCompatActivity(), Navigator.NavigatorListener {
6666

6767
multipleStackNavigator.initialize(savedInstanceState)
6868
val restartRootFragmentCheckBox = findViewById<View>(R.id.restartSwitch) as SwitchCompat
69-
findViewById<Button>(R.id.resetCurrentTab).setOnClickListener { multipleStackNavigator.resetCurrentTab(restartRootFragmentCheckBox.isChecked) }
70-
findViewById<Button>(R.id.resetXTab).setOnClickListener { multipleStackNavigator.reset(1, restartRootFragmentCheckBox.isChecked) }
69+
findViewById<Button>(R.id.resetCurrentTab).setOnClickListener {
70+
multipleStackNavigator.resetCurrentTab(restartRootFragmentCheckBox.isChecked)
71+
}
72+
findViewById<Button>(R.id.resetXTab).setOnClickListener {
73+
multipleStackNavigator.reset(1, restartRootFragmentCheckBox.isChecked)
74+
}
7175

7276
navigation.setOnNavigationItemSelectedListener(mOnNavigationItemSelectedListener)
7377
findViewById<Button>(R.id.reset).setOnClickListener { multipleStackNavigator.reset() }
7478
findViewById<Button>(R.id.resetWithNewSet).setOnClickListener {
7579
multipleStackNavigator.resetWithFragmentProvider(newListOfFragments)
7680
}
77-
81+
findViewById<Button>(R.id.startWithGroup).setOnClickListener {
82+
multipleStackNavigator.start(FragmentGenerator.generateNewFragment(), "group1")
83+
}
84+
findViewById<Button>(R.id.resetGroup).setOnClickListener {
85+
multipleStackNavigator.clearGroup("group1")
86+
}
7887
multipleStackNavigator.observeDestinationChanges(this) {
7988
Log.d("Destination Changed", "${it.javaClass.name} - ${it.tag}")
8089
}
81-
8290
}
8391

8492
override fun onBackPressed() {

app/src/main/res/layout/activity_main.xml

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -86,6 +86,27 @@
8686
android:singleLine="true"
8787
android:text="Reset With New Fragments" />
8888
</LinearLayout>
89+
<LinearLayout
90+
android:layout_width="match_parent"
91+
android:layout_height="wrap_content">
92+
93+
<Button
94+
android:id="@+id/startWithGroup"
95+
android:layout_width="0dp"
96+
android:layout_height="wrap_content"
97+
android:layout_weight="1"
98+
android:singleLine="true"
99+
android:text="Start With Group" />
100+
101+
<Button
102+
android:id="@+id/resetGroup"
103+
android:layout_width="0dp"
104+
android:layout_height="wrap_content"
105+
android:layout_weight="1"
106+
android:singleLine="true"
107+
android:text="Reset Group" />
108+
</LinearLayout>
109+
89110
</LinearLayout>
90111
</RelativeLayout>
91112

app/src/test/java/com/trendyol/medusa/DestinationListenerTest.kt

Lines changed: 81 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -201,6 +201,87 @@ class DestinationListenerTest {
201201
}
202202
}
203203
}
204+
205+
@Test
206+
fun `given four fragment, when clearGroup is called to remove middle fragments, then observeDestinationChanges should not be triggered`() {
207+
val testObserver = TestObserver<Fragment>()
208+
launchActivity<MainActivity>().use { scenario ->
209+
// Given
210+
scenario.moveToState(Lifecycle.State.RESUMED)
211+
scenario.onActivity { activity ->
212+
activity.multipleStackNavigator.observeDestinationChanges(activity, testObserver)
213+
activity.doAndExecuteFragmentTransactions {
214+
start(FragmentGenerator.generateNewFragment())
215+
start(FragmentGenerator.generateNewFragment(), "group-name")
216+
start(FragmentGenerator.generateNewFragment(), "group-name")
217+
start(FragmentGenerator.generateNewFragment())
218+
clearGroup("group-name")
219+
}
220+
activity.supportFragmentManager.executePendingTransactions()
221+
222+
Assert.assertEquals(
223+
"fragment 2",
224+
testObserver.getLastFragmentName(indexFromLast = 3)
225+
)
226+
Assert.assertEquals(
227+
"fragment 3",
228+
testObserver.getLastFragmentName(indexFromLast = 2)
229+
)
230+
Assert.assertEquals(
231+
"fragment 4",
232+
testObserver.getLastFragmentName(indexFromLast = 1)
233+
)
234+
Assert.assertEquals(
235+
"fragment 5",
236+
testObserver.getLastFragmentName(indexFromLast = 0)
237+
)
238+
}
239+
}
240+
}
241+
242+
@Test
243+
fun `given four fragment, when clearGroup is called to last two fragments, then observeDestinationChanges should be triggered`() {
244+
val testObserver = TestObserver<Fragment>()
245+
launchActivity<MainActivity>().use { scenario ->
246+
// Given
247+
scenario.moveToState(Lifecycle.State.RESUMED)
248+
scenario.onActivity { activity ->
249+
activity.multipleStackNavigator.observeDestinationChanges(activity, testObserver)
250+
activity.doAndExecuteFragmentTransactions {
251+
start(FragmentGenerator.generateNewFragment())
252+
start(FragmentGenerator.generateNewFragment())
253+
start(FragmentGenerator.generateNewFragment(), "group-name")
254+
start(FragmentGenerator.generateNewFragment(), "group-name")
255+
}
256+
activity.supportFragmentManager.executePendingTransactions()
257+
activity.doAndExecuteFragmentTransactions {
258+
clearGroup("group-name")
259+
}
260+
activity.supportFragmentManager.executePendingTransactions()
261+
Assert.assertEquals(
262+
"fragment 2",
263+
testObserver.getLastFragmentName(indexFromLast = 4)
264+
)
265+
Assert.assertEquals(
266+
"fragment 3",
267+
testObserver.getLastFragmentName(indexFromLast = 3)
268+
)
269+
Assert.assertEquals(
270+
"fragment 4",
271+
testObserver.getLastFragmentName(indexFromLast = 2)
272+
)
273+
Assert.assertEquals(
274+
"fragment 5",
275+
testObserver.getLastFragmentName(indexFromLast = 1)
276+
)
277+
Assert.assertEquals(
278+
"fragment 3",
279+
testObserver.getLastFragmentName(indexFromLast = 0)
280+
)
281+
}
282+
}
283+
}
284+
204285
private fun MainActivity.doAndExecuteFragmentTransactions(run: MultipleStackNavigator.() -> Unit) =
205286
run.invoke(this.multipleStackNavigator).also { supportFragmentManager.executePendingTransactions() }
206287

medusalib/build.gradle

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ android {
2929

3030
ext {
3131
PUBLISH_GROUP_ID = 'com.trendyol'
32-
PUBLISH_VERSION = '0.10.3'
32+
PUBLISH_VERSION = '0.10.4'
3333
PUBLISH_ARTIFACT_ID = 'medusa'
3434
PUBLISH_DESCRIPTION = "Android Fragment Stack Controller"
3535
PUBLISH_URL = "https://github.com/Trendyol/medusa"

medusalib/src/main/java/com/trendyol/medusalib/navigator/MultipleStackNavigator.kt

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -175,13 +175,18 @@ open class MultipleStackNavigator(
175175
if (fragmentGroupName == DEFAULT_GROUP_NAME) {
176176
throw IllegalArgumentException("Fragment group name can not be empty.")
177177
}
178+
val upperFragmentTag = fragmentStackState.peekItemFromSelectedTab()?.fragmentTag
179+
178180
val poppedFragmentTags = fragmentStackState
179181
.popItems(fragmentGroupName)
180182
.map { it.fragmentTag }
181183

182184
if (poppedFragmentTags.isNotEmpty()) {
183185
fragmentManagerController.removeFragments(poppedFragmentTags)
184-
showUpperFragment()
186+
val poppedUpperFragment = poppedFragmentTags.contains(upperFragmentTag)
187+
if (poppedUpperFragment) {
188+
showUpperFragment()
189+
}
185190
}
186191
}
187192

0 commit comments

Comments
 (0)