Skip to content

Commit fcf55a3

Browse files
authored
Merge pull request #126 from ncapdevi/reevaluate-tags
- initial attempt at removing the fragment stacks and just maintaining the tags
2 parents c8b34c1 + ac4a616 commit fcf55a3

File tree

9 files changed

+210
-222
lines changed

9 files changed

+210
-222
lines changed

.idea/misc.xml

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

app/src/main/java/com/ncapdevi/sample/activities/BottomTabsActivity.kt

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,6 @@ import com.ncapdevi.sample.fragments.*
1515
import com.roughike.bottombar.BottomBar
1616

1717

18-
1918
class BottomTabsActivity : AppCompatActivity(), BaseFragment.FragmentNavigation, FragNavController.TransactionListener, FragNavController.RootFragmentListener {
2019

2120
private var fragNavController: FragNavController? = null

app/src/main/java/com/ncapdevi/sample/fragments/BaseFragment.kt

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -31,8 +31,9 @@ open class BaseFragment : Fragment() {
3131

3232
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
3333
if (cachedView == null) {
34-
cachedView = inflater.inflate(R.layout.fragment_main, container, false)
35-
btn = cachedView!!.findViewById(R.id.button)
34+
cachedView = inflater.inflate(R.layout.fragment_main, container, false)?.apply {
35+
btn = findViewById(R.id.button)
36+
}
3637
}
3738
return cachedView
3839
}

frag-nav/src/main/java/com/ncapdevi/fragnav/FragNavController.kt

Lines changed: 85 additions & 98 deletions
Large diffs are not rendered by default.

frag-nav/src/test/java/com/ncapdevi/fragnav/FragNavTransactionOptionsTest.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -39,8 +39,8 @@ class FragNavTransactionOptionsTest {
3939
.addSharedElement(Pair(null, "test"))
4040
.addSharedElement(Pair(null, "test2")).build()
4141

42-
assertTrue(breadCrumbShortTitle.equals(fragNavTransactionOptions.breadCrumbShortTitle!!, ignoreCase = true))
43-
assertTrue(breadCrumbTitle.equals(fragNavTransactionOptions.breadCrumbTitle!!, ignoreCase = true))
42+
assertTrue(breadCrumbShortTitle.equals(fragNavTransactionOptions.breadCrumbShortTitle, ignoreCase = true))
43+
assertTrue(breadCrumbTitle.equals(fragNavTransactionOptions.breadCrumbTitle, ignoreCase = true))
4444

4545
assertTrue(transitionStyle == fragNavTransactionOptions.transitionStyle)
4646

frag-nav/src/test/java/com/ncapdevi/fragnav/MockTest.kt

Lines changed: 52 additions & 50 deletions
Original file line numberDiff line numberDiff line change
@@ -20,16 +20,15 @@ import java.util.*
2020
class MockTest : FragNavController.TransactionListener {
2121

2222
@Mock
23-
private val mFragmentManager: FragmentManager? = null
24-
23+
private lateinit var mFragmentManager: FragmentManager
2524
@Mock
26-
private val mBundle: Bundle? = null
27-
25+
private lateinit var mBundle: Bundle
2826
@Mock
29-
private val mFragmentTransaction: FragmentTransaction? = null
27+
private lateinit var mFragmentTransaction: FragmentTransaction
28+
29+
private lateinit var mFragNavController: FragNavController
3030

31-
private val mFragmentList = ArrayList<Fragment>(5)
32-
private var mFragNavController: FragNavController? = null
31+
private val fragmentTagMap: MutableMap<String, Fragment> = mutableMapOf()
3332

3433
@Before
3534
fun initMocks() {
@@ -38,18 +37,21 @@ class MockTest : FragNavController.TransactionListener {
3837
}
3938

4039
private fun mockFragmentTransaction() {
41-
`when`(mFragmentTransaction!!.add(ArgumentMatchers.anyInt(), ArgumentMatchers.any(Fragment::class.java), ArgumentMatchers.anyString())).then { invocation ->
40+
`when`(mFragmentTransaction.add(ArgumentMatchers.anyInt(), ArgumentMatchers.any(Fragment::class.java), ArgumentMatchers.anyString())).then { invocation ->
4241
val args = invocation.arguments
43-
mFragmentList.add(args[1] as Fragment)
42+
fragmentTagMap[args[2] as String] = args[1] as Fragment
4443
mFragmentTransaction
4544
}
4645
}
4746

4847
@SuppressLint("CommitTransaction")
4948
private fun mockFragmentManager() {
50-
`when`(mFragmentManager!!.fragments).thenReturn(mFragmentList)
49+
`when`(mFragmentManager.fragments).thenReturn(fragmentTagMap.values.toMutableList())
5150

5251
`when`(mFragmentManager.beginTransaction()).thenReturn(mFragmentTransaction)
52+
`when`(mFragmentManager.findFragmentByTag(ArgumentMatchers.anyString())).then({ invocation ->
53+
return@then fragmentTagMap[invocation.arguments[0]]
54+
})
5355
}
5456

5557
@Test
@@ -58,12 +60,12 @@ class MockTest : FragNavController.TransactionListener {
5860
rootFragments.add(Fragment())
5961
rootFragments.add(Fragment())
6062

61-
mFragNavController = FragNavController.newBuilder(null, mFragmentManager!!, 1)
63+
mFragNavController = FragNavController.newBuilder(null, mFragmentManager, 1)
6264
.rootFragments(rootFragments)
6365
.build()
6466

65-
assertEquals(FragNavController.TAB1.toLong(), mFragNavController!!.currentStackIndex.toLong())
66-
assertNotNull(mFragNavController!!.currentStack)
67+
assertEquals(FragNavController.TAB1.toLong(), mFragNavController.currentStackIndex.toLong())
68+
assertNotNull(mFragNavController.currentStack)
6769
}
6870

6971
@Test
@@ -72,15 +74,15 @@ class MockTest : FragNavController.TransactionListener {
7274
rootFragments.add(Fragment())
7375
rootFragments.add(Fragment())
7476

75-
mFragNavController = FragNavController.newBuilder(null, mFragmentManager!!, 1)
77+
mFragNavController = FragNavController.newBuilder(null, mFragmentManager, 1)
7678
.rootFragments(rootFragments)
7779
.fragmentHideStrategy(FragNavController.DETACH_ON_NAVIGATE_HIDE_ON_SWITCH)
7880
.eager(true)
7981
.build()
8082

81-
assertEquals(FragNavController.TAB1.toLong(), mFragNavController!!.currentStackIndex.toLong())
82-
assertNotNull(mFragNavController!!.currentStack)
83-
assertEquals(mFragNavController!!.size.toLong(), 2)
83+
assertEquals(FragNavController.TAB1.toLong(), mFragNavController.currentStackIndex.toLong())
84+
assertNotNull(mFragNavController.currentStack)
85+
assertEquals(mFragNavController.size.toLong(), 2)
8486
verify<FragmentTransaction>(mFragmentTransaction, times(2)).add(ArgumentMatchers.anyInt(), ArgumentMatchers.any(Fragment::class.java), ArgumentMatchers.anyString())
8587
}
8688

@@ -92,7 +94,7 @@ class MockTest : FragNavController.TransactionListener {
9294
rootFragments.add(Fragment())
9395
}
9496

95-
mFragNavController = FragNavController.newBuilder(null, mFragmentManager!!, 1)
97+
mFragNavController = FragNavController.newBuilder(null, mFragmentManager, 1)
9698
.rootFragments(rootFragments)
9799
.build()
98100
}
@@ -103,34 +105,34 @@ class MockTest : FragNavController.TransactionListener {
103105
rootFragments.add(Fragment())
104106
rootFragments.add(Fragment())
105107

106-
mFragNavController = FragNavController.newBuilder(null, mFragmentManager!!, 1)
108+
mFragNavController = FragNavController.newBuilder(null, mFragmentManager, 1)
107109
.rootFragments(rootFragments)
108110
.selectedTabIndex(FragNavController.NO_TAB)
109111
.build()
110112

111-
assertEquals(FragNavController.NO_TAB.toLong(), mFragNavController!!.currentStackIndex.toLong())
112-
assertNull(mFragNavController!!.currentStack)
113+
assertEquals(FragNavController.NO_TAB.toLong(), mFragNavController.currentStackIndex.toLong())
114+
assertNull(mFragNavController.currentStack)
113115
}
114116

115117
@Test
116118
fun testConstructionWhenRootFragmentListenerAndTabSelected() {
117119
val rootFragmentListener = mock(FragNavController.RootFragmentListener::class.java)
118120
doReturn(Fragment()).`when`<FragNavController.RootFragmentListener>(rootFragmentListener).getRootFragment(ArgumentMatchers.anyInt())
119121

120-
mFragNavController = FragNavController.newBuilder(null, mFragmentManager!!, 1)
122+
mFragNavController = FragNavController.newBuilder(null, mFragmentManager, 1)
121123
.rootFragmentListener(rootFragmentListener, 5)
122124
.selectedTabIndex(FragNavController.TAB3)
123125
.build()
124126

125-
assertEquals(FragNavController.TAB3.toLong(), mFragNavController!!.currentStackIndex.toLong())
126-
assertNotNull(mFragNavController!!.currentStack)
127+
assertEquals(FragNavController.TAB3.toLong(), mFragNavController.currentStackIndex.toLong())
128+
assertNotNull(mFragNavController.currentStack)
127129
}
128130

129131
@Test(expected = IllegalArgumentException::class)
130132
fun testConstructionWhenRootFragmentListenerAndTooManyTabs() {
131133
val rootFragmentListener = mock(FragNavController.RootFragmentListener::class.java)
132134

133-
mFragNavController = FragNavController.newBuilder(null, mFragmentManager!!, 1)
135+
mFragNavController = FragNavController.newBuilder(null, mFragmentManager, 1)
134136
.rootFragmentListener(rootFragmentListener, 21)
135137
.selectedTabIndex(FragNavController.TAB3)
136138
.build()
@@ -143,59 +145,59 @@ class MockTest : FragNavController.TransactionListener {
143145
rootFragments.add(Fragment())
144146
rootFragments.add(Fragment())
145147

146-
mFragNavController = FragNavController.newBuilder(null, mFragmentManager!!, 1)
148+
mFragNavController = FragNavController.newBuilder(null, mFragmentManager, 1)
147149
.rootFragments(rootFragments)
148150
.selectedTabIndex(FragNavController.TAB1)
149151
.build()
150152

151-
mFragNavController!!.switchTab(FragNavController.TAB2)
152-
mFragNavController!!.pushFragment(Fragment())
153-
mFragNavController!!.pushFragment(Fragment())
154-
mFragNavController!!.pushFragment(Fragment())
153+
mFragNavController.switchTab(FragNavController.TAB2)
154+
mFragNavController.pushFragment(Fragment())
155+
mFragNavController.pushFragment(Fragment())
156+
mFragNavController.pushFragment(Fragment())
155157

156-
val currentFragment = mFragNavController!!.currentFrag
158+
val currentFragment = mFragNavController.currentFrag
157159

158160
val bundle = Bundle()
159161

160-
mFragNavController!!.onSaveInstanceState(bundle)
162+
mFragNavController.onSaveInstanceState(bundle)
161163

162164
mFragNavController = FragNavController.newBuilder(bundle, mFragmentManager, 1)
163165
.rootFragments(rootFragments)
164166
.selectedTabIndex(FragNavController.TAB1)
165167
.build()
166168

167-
assertEquals(FragNavController.TAB2.toLong(), mFragNavController!!.currentStackIndex.toLong())
168-
assertEquals(4, mFragNavController!!.currentStack!!.size.toLong())
169-
assertEquals(currentFragment, mFragNavController!!.currentFrag)
169+
assertEquals(FragNavController.TAB2.toLong(), mFragNavController.currentStackIndex.toLong())
170+
assertEquals(4, mFragNavController.currentStack!!.size.toLong())
171+
assertEquals(currentFragment, mFragNavController.currentFrag)
170172
}
171173

172174
@Test
173175
fun pushPopClear() {
174-
mFragNavController = FragNavController.newBuilder(mBundle, mFragmentManager!!, 1)
176+
mFragNavController = FragNavController.newBuilder(mBundle, mFragmentManager, 1)
175177
.transactionListener(this)
176178
.rootFragment(mock(Fragment::class.java))
177179
.build()
178180

179-
assertEquals(FragNavController.TAB1.toLong(), mFragNavController!!.currentStackIndex.toLong())
180-
assertNotNull(mFragNavController!!.currentStack)
181+
assertEquals(FragNavController.TAB1.toLong(), mFragNavController.currentStackIndex.toLong())
182+
assertNotNull(mFragNavController.currentStack)
181183

182-
var size = mFragNavController!!.currentStack!!.size
184+
var size = mFragNavController.currentStack!!.size
183185

184-
mFragNavController!!.pushFragment(mock(Fragment::class.java))
185-
assertTrue(mFragNavController!!.currentStack!!.size == ++size)
186+
mFragNavController.pushFragment(mock(Fragment::class.java))
187+
assertTrue(mFragNavController.currentStack!!.size == ++size)
186188

187-
mFragNavController!!.pushFragment(mock(Fragment::class.java))
188-
assertTrue(mFragNavController!!.currentStack!!.size == ++size)
189+
mFragNavController.pushFragment(mock(Fragment::class.java))
190+
assertTrue(mFragNavController.currentStack!!.size == ++size)
189191

190-
mFragNavController!!.pushFragment(mock(Fragment::class.java))
191-
assertTrue(mFragNavController!!.currentStack!!.size == ++size)
192+
mFragNavController.pushFragment(mock(Fragment::class.java))
193+
assertTrue(mFragNavController.currentStack!!.size == ++size)
192194

193-
mFragNavController!!.popFragment()
194-
assertTrue(mFragNavController!!.currentStack!!.size == --size)
195+
mFragNavController.popFragment()
196+
assertTrue(mFragNavController.currentStack!!.size == --size)
195197

196-
mFragNavController!!.clearStack()
197-
assertTrue(mFragNavController!!.currentStack!!.size == 1)
198-
assertTrue(mFragNavController!!.isRootFragment)
198+
mFragNavController.clearStack()
199+
assertTrue(mFragNavController.currentStack!!.size == 1)
200+
assertTrue(mFragNavController.isRootFragment)
199201
}
200202

201203
override fun onTabTransaction(fragment: Fragment?, index: Int) {

frag-nav/src/test/java/com/ncapdevi/fragnav/tabhistory/CurrentTabHistoryControllerTest.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,13 +14,13 @@ import org.mockito.junit.MockitoJUnitRunner
1414
@RunWith(MockitoJUnitRunner::class)
1515
class CurrentTabHistoryControllerTest {
1616
@Mock
17-
private val mockFragNavPopController: FragNavPopController? = null
17+
private lateinit var mockFragNavPopController: FragNavPopController
1818

1919
@Test
2020
fun testPopDelegatedWhenPopCalled() {
2121
// Given
2222
val currentTabHistoryController = CurrentTabHistoryController(
23-
mockFragNavPopController!!)
23+
mockFragNavPopController)
2424

2525
// When
2626
currentTabHistoryController.popFragments(1, null)

0 commit comments

Comments
 (0)