Skip to content

Commit cc3087d

Browse files
committed
Merge remote-tracking branch 'origin/master'
# Conflicts: # frag-nav/pom.xml
2 parents 63d71d2 + ac95f92 commit cc3087d

File tree

7 files changed

+42
-50
lines changed

7 files changed

+42
-50
lines changed

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,3 +7,4 @@
77
/build
88
/captures
99
.idea
10+
/.idea/

.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.

README.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -313,6 +313,8 @@ Feel free to send me a pull request with your app and I'll link you here:
313313

314314
| Logo | Name | Play Store |
315315
| ---------------------------------------- | ---------- | ---------------------------------------- |
316+
| <img alt='RockbotDJ' src='https://lh3.googleusercontent.com/oPIgSrhWuIGUO_UCynx4HHop7s2F90EzuIUY1p4SV1APeUADwX2MNVV6uQ8aAGMAWT0=s360-rw' height='48px'/> | Rockbot DJ | <a href='https://play.google.com/store/apps/details?id=com.roqbot.client&utm_source=Github&utm_campaign=FragNav'><img alt='Get it on Google Play' src='https://play.google.com/intl/en_us/badges/images/generic/en_badge_web_generic.png' height='70px'/></a> |
317+
| <img alt='RockbotRemote' src='https://lh3.googleusercontent.com/y1z-eAO0QiRVCzG4MkrrhNE1qCfjAFK5Pp-5AQ0HjAcXrxa1wiGbGGV68pdbF1B6zQ=s360-rw' height='48px'/> | Rockbot Remote | <a href='https://play.google.com/store/apps/details?id=com.roqbot.player&utm_source=Github&utm_campaign=FragNav'><img alt='Get it on Google Play' src='https://play.google.com/intl/en_us/badges/images/generic/en_badge_web_generic.png' height='70px'/></a> |
316318
| <img alt='Skyscanner' src='https://assets.brandfolder.com/odwv71-9z8zyo-8xj1p3/v/718530/[email protected]' height='48px'/> | Skyscanner | <a href='https://play.google.com/store/apps/details?id=net.skyscanner.android.main&utm_source=Github&utm_campaign=FragNav&pcampaignid=MKT-Other-global-all-co-prtnr-py-PartBadge-Mar2515-1'><img alt='Get it on Google Play' src='https://play.google.com/intl/en_us/badges/images/generic/en_badge_web_generic.png' height='70px'/></a> |
317319
| <img alt='Fonic' src='https://www.fonic.de/assets/images/about/fonic.png' height='48px'/> | Fonic / Fonic Mobile | <a href='https://play.google.com/store/apps/details?id=de.fonic.meinfonic'><img alt='Get it on Google Play' src='https://play.google.com/intl/en_us/badges/images/generic/en_badge_web_generic.png' height='70px'/></a> |
318320

build.gradle

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ buildscript {
66

77
}
88
dependencies {
9-
classpath 'com.android.tools.build:gradle:3.1.1'
9+
classpath 'com.android.tools.build:gradle:3.1.2'
1010
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
1111
}
1212
}

frag-nav/.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1 +1,2 @@
11
/build
2+
pom.xml

frag-nav/pom.xml

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

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

Lines changed: 36 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -175,7 +175,8 @@ class FragNavController constructor(private val fragmentManger: FragmentManager,
175175
throw java.lang.IllegalStateException("Shouldn't have both a rootFragmentListener and rootFragments set, this is clearly a mistsake")
176176
}
177177

178-
val numberOfTabs: Int = rootFragmentListener?.numberOfRootFragments ?: rootFragments?.size ?: 0
178+
val numberOfTabs: Int = rootFragmentListener?.numberOfRootFragments ?: rootFragments?.size
179+
?: 0
179180

180181
//Attempt to restore from bundle, if not, initialize
181182
if (!restoreFromBundle(savedInstanceState)) {
@@ -210,10 +211,10 @@ class FragNavController constructor(private val fragmentManger: FragmentManager,
210211
fragmentStacksTags[currentStackIndex].push(fragmentTag)
211212
ft.add(containerId, fragment, fragmentTag)
212213
if (i != index) {
213-
if (shouldDetachAttachOnSwitch()) {
214-
ft.detach(fragment)
215-
} else {
216-
ft.hide(fragment)
214+
when {
215+
shouldDetachAttachOnSwitch() -> ft.detach(fragment)
216+
shouldRemoveAttachOnSwitch() -> ft.remove(fragment)
217+
else -> ft.hide(fragment)
217218
}
218219
} else {
219220
mCurrentFrag = fragment
@@ -263,20 +264,21 @@ class FragNavController constructor(private val fragmentManger: FragmentManager,
263264

264265
val ft = createTransactionWithOptions(transactionOptions, false)
265266

266-
removeCurrentFragment(ft, shouldDetachAttachOnSwitch())
267+
removeCurrentFragment(ft, shouldDetachAttachOnSwitch(), shouldRemoveAttachOnSwitch())
267268

268269
var fragment: Fragment? = null
269270
if (index == NO_TAB) {
270271
commitTransaction(ft, transactionOptions)
271272
} else {
272273
//Attempt to reattach previous fragment
273-
fragment = addPreviousFragment(ft, shouldDetachAttachOnSwitch())
274+
fragment = addPreviousFragment(ft, shouldDetachAttachOnSwitch() || shouldRemoveAttachOnSwitch())
274275
if (fragment != null) {
275276
commitTransaction(ft, transactionOptions)
276277
} else {
277278
fragment = getRootFragment(currentStackIndex)
278-
var tag = fragment.tag
279-
if (tag.isNullOrEmpty()){
279+
// Handle special case of indexes, restore tag of removed fragment
280+
var tag = fragment.tag ?: fragmentStacksTags[index].peek()
281+
if (tag.isNullOrEmpty()) {
280282
tag = generateTag(fragment)
281283
fragmentStacksTags[currentStackIndex].push(tag)
282284
}
@@ -300,7 +302,7 @@ class FragNavController constructor(private val fragmentManger: FragmentManager,
300302
if (fragment != null && currentStackIndex != NO_TAB) {
301303
val ft = createTransactionWithOptions(transactionOptions, false)
302304

303-
removeCurrentFragment(ft, shouldDetachAttachOnPushPop())
305+
removeCurrentFragment(ft, shouldDetachAttachOnPushPop(), shouldRemoveAttachOnSwitch())
304306

305307
val fragmentTag = generateTag(fragment)
306308
fragmentStacksTags[currentStackIndex].push(fragmentTag)
@@ -375,6 +377,9 @@ class FragNavController constructor(private val fragmentManger: FragmentManager,
375377
if (!fragmentStacksTags[currentStackIndex].isEmpty()) {
376378
val fragmentTag = fragmentStacksTags[currentStackIndex].peek()
377379
fragment = fragmentManger.findFragmentByTag(fragmentTag)
380+
// Fragment destroyed (probably removed from fragment manager)
381+
?: getRootFragment(currentStackIndex)
382+
378383
ft.add(containerId, fragment, fragmentTag)
379384
commitTransaction(ft, transactionOptions)
380385
} else {
@@ -439,6 +444,8 @@ class FragNavController constructor(private val fragmentManger: FragmentManager,
439444
if (fragmentStack.isNotEmpty()) {
440445
val fragmentTag = fragmentStack.peek()
441446
fragment = fragmentManger.findFragmentByTag(fragmentTag)
447+
// Fragment destroyed (probably removed from fragment manager)
448+
?: getRootFragment(currentStackIndex)
442449
ft.add(containerId, fragment, fragmentTag)
443450
commitTransaction(ft, transactionOptions)
444451
} else {
@@ -597,12 +604,12 @@ class FragNavController constructor(private val fragmentManger: FragmentManager,
597604
*
598605
* @param ft the current transaction being performed
599606
*/
600-
private fun removeCurrentFragment(ft: FragmentTransaction, isDetach: Boolean) {
607+
private fun removeCurrentFragment(ft: FragmentTransaction, isDetach: Boolean, isRemove: Boolean) {
601608
currentFrag?.let {
602-
if (isDetach) {
603-
ft.detach(it)
604-
} else {
605-
ft.hide(it)
609+
when {
610+
isDetach -> ft.detach(it)
611+
isRemove -> ft.remove(it)
612+
else -> ft.hide(it)
606613
}
607614
}
608615
}
@@ -696,6 +703,10 @@ class FragNavController constructor(private val fragmentManger: FragmentManager,
696703
return fragmentHideStrategy == DETACH
697704
}
698705

706+
private fun shouldRemoveAttachOnSwitch(): Boolean {
707+
return fragmentHideStrategy == REMOVE
708+
}
709+
699710
/**
700711
* Get a copy of the stack at a given index
701712
*
@@ -810,7 +821,10 @@ class FragNavController constructor(private val fragmentManger: FragmentManager,
810821
// Restore selected tab if we have one
811822
val selectedTabIndex = savedInstanceState.getInt(EXTRA_SELECTED_TAB_INDEX)
812823
if (selectedTabIndex in 0..(MAX_NUM_TABS - 1)) {
813-
switchTab(selectedTabIndex, FragNavTransactionOptions.newBuilder().build())
824+
// Shortcut for switchTab. We already restored fragment, so just notify history controller
825+
// We cannot use switchTab, because switchTab removes fragment, but we don't want it
826+
currentStackIndex = selectedTabIndex
827+
fragNavTabHistoryController.switchTab(selectedTabIndex)
814828
}
815829

816830
//Successfully restored state
@@ -846,7 +860,7 @@ class FragNavController constructor(private val fragmentManger: FragmentManager,
846860
/**
847861
* Define what happens when we try to pop on a tab where root fragment is at the top
848862
*/
849-
@IntDef(DETACH, HIDE, DETACH_ON_NAVIGATE_HIDE_ON_SWITCH)
863+
@IntDef(DETACH, HIDE, REMOVE, DETACH_ON_NAVIGATE_HIDE_ON_SWITCH)
850864
@kotlin.annotation.Retention(AnnotationRetention.SOURCE)
851865
annotation class FragmentHideStrategy
852866

@@ -923,5 +937,10 @@ class FragNavController constructor(private val fragmentManger: FragmentManager,
923937
* using show and hide methods to switch between tabs
924938
*/
925939
const val DETACH_ON_NAVIGATE_HIDE_ON_SWITCH = 2
940+
941+
/**
942+
* Using create + attach and remove methods of Fragment transaction to switch between fragments
943+
*/
944+
const val REMOVE = 3
926945
}
927946
}

0 commit comments

Comments
 (0)