Skip to content

Commit 54a368e

Browse files
Reset layouts, set data binding nullable
1 parent 9734f78 commit 54a368e

File tree

251 files changed

+3146
-7977
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

251 files changed

+3146
-7977
lines changed

Tutorial5-3NavigationUI-BottomNavigation-NestedNavigation/src/main/res/values/colors.xml

+8-8
Original file line numberDiff line numberDiff line change
@@ -8,18 +8,18 @@
88
<color name="divider">#BDBDBD</color>
99

1010
<!-- Home Fragments -->
11-
<color name="colorHome1">#E64A19</color>
12-
<color name="colorHome2">#FF5722</color>
13-
<color name="colorHome3">#FF8A65</color>
11+
<color name="colorHome1">#FFB300</color>
12+
<color name="colorHome2">#FFCA28</color>
13+
<color name="colorHome3">#FFD54F</color>
1414

1515
<!-- Dashboard Fragments -->
16-
<color name="colorDashboard1">#1976D2</color>
17-
<color name="colorDashboard2">#2196F3</color>
18-
<color name="colorDashboard3">#64B5F6</color>
16+
<color name="colorDashboard1">#039BE5</color>
17+
<color name="colorDashboard2">#29B6F6</color>
18+
<color name="colorDashboard3">#4FC3F7</color>
1919

2020
<!-- Notification Fragments -->
21-
<color name="colorNotification1">#388E3C</color>
22-
<color name="colorNotification2">#4CAF50</color>
21+
<color name="colorNotification1">#43A047</color>
22+
<color name="colorNotification2">#66BB6A</color>
2323
<color name="colorNotification3">#81C784</color>
2424

2525
<color name="purple_200">#FFBB86FC</color>
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
# Tutorial 6-0

Tutorial6-0NavigationUI-ViewPager2/src/main/AndroidManifest.xml

+2-2
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,8 @@
88
android:label="@string/app_name"
99
android:roundIcon="@mipmap/ic_launcher_round"
1010
android:supportsRtl="true"
11-
android:theme="@style/Theme.NavigationComponentsTutorial" >
12-
<activity android:name=".MainActivity" >
11+
android:theme="@style/Theme.NavigationComponentsTutorial">
12+
<activity android:name=".MainActivity" >
1313
<intent-filter>
1414
<action android:name="android.intent.action.MAIN" />
1515

Tutorial6-0NavigationUI-ViewPager2/src/main/res/navigation/nav_graph.xml

+1-1
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,7 @@
5656
android:label="DashboardFragment3"
5757
tools:layout="@layout/fragment_dashboard3" />
5858

59-
59+
<!-- Notification -->
6060
<fragment
6161
android:id="@+id/notificationFragment2"
6262
android:name="com.smarttoolfactory.tutorial6_0navigationui_viewpager2.blankfragment.NotificationFragment2"

Tutorial6-0NavigationUI-ViewPager2/src/main/res/values/colors.xml

+8-8
Original file line numberDiff line numberDiff line change
@@ -8,18 +8,18 @@
88
<color name="divider">#BDBDBD</color>
99

1010
<!-- Home Fragments -->
11-
<color name="colorHome1">#E64A19</color>
12-
<color name="colorHome2">#FF5722</color>
13-
<color name="colorHome3">#FF8A65</color>
11+
<color name="colorHome1">#FFB300</color>
12+
<color name="colorHome2">#FFCA28</color>
13+
<color name="colorHome3">#FFD54F</color>
1414

1515
<!-- Dashboard Fragments -->
16-
<color name="colorDashboard1">#1976D2</color>
17-
<color name="colorDashboard2">#2196F3</color>
18-
<color name="colorDashboard3">#64B5F6</color>
16+
<color name="colorDashboard1">#039BE5</color>
17+
<color name="colorDashboard2">#29B6F6</color>
18+
<color name="colorDashboard3">#4FC3F7</color>
1919

2020
<!-- Notification Fragments -->
21-
<color name="colorNotification1">#388E3C</color>
22-
<color name="colorNotification2">#4CAF50</color>
21+
<color name="colorNotification1">#43A047</color>
22+
<color name="colorNotification2">#66BB6A</color>
2323
<color name="colorNotification3">#81C784</color>
2424

2525
<color name="purple_200">#FFBB86FC</color>
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
# Tutorial 6-1

Tutorial6-1NavigationUI-ViewPager2/src/main/AndroidManifest.xml

+7-7
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,14 @@
11
<?xml version="1.0" encoding="utf-8"?>
22
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
3-
package="com.smarttoolfactory.tutorial6_1navigationui_viewpager2">
3+
package="com.smarttoolfactory.tutorial6_1navigationui_viewpager2">
44

55
<application
6-
android:allowBackup="true"
7-
android:icon="@mipmap/ic_launcher"
8-
android:label="@string/app_name"
9-
android:roundIcon="@mipmap/ic_launcher_round"
10-
android:supportsRtl="true"
11-
android:theme="@style/AppTheme">
6+
android:allowBackup="true"
7+
android:icon="@mipmap/ic_launcher"
8+
android:label="@string/app_name"
9+
android:roundIcon="@mipmap/ic_launcher_round"
10+
android:supportsRtl="true"
11+
android:theme="@style/Theme.NavigationComponentsTutorial">
1212
<activity android:name=".MainActivity">
1313
<intent-filter>
1414
<action android:name="android.intent.action.MAIN" />

Tutorial6-1NavigationUI-ViewPager2/src/main/java/com/smarttoolfactory/tutorial6_1navigationui_viewpager2/MainActivity.kt

+2
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,8 @@ import androidx.viewpager2.widget.ViewPager2
2727
*
2828
* * In this example navigation is done between main NavHost and main back stack,
2929
* every page/fragment in [ViewPager2] added main back stack.
30+
*
31+
* ## This example is same as Tutorial 6-0, but uses data binding which might be causing MEMORY LEAK, at least Leak Canary says so
3032
*/
3133
class MainActivity : AppCompatActivity() {
3234

Tutorial6-1NavigationUI-ViewPager2/src/main/java/com/smarttoolfactory/tutorial6_1navigationui_viewpager2/adapter/ChildFragmentStateAdapter.kt

+4-2
Original file line numberDiff line numberDiff line change
@@ -4,20 +4,22 @@ import androidx.fragment.app.Fragment
44
import androidx.viewpager2.adapter.FragmentStateAdapter
55
import com.smarttoolfactory.tutorial6_1navigationui_viewpager2.blankfragment.DashboardFragment1
66
import com.smarttoolfactory.tutorial6_1navigationui_viewpager2.blankfragment.HomeFragment1
7+
import com.smarttoolfactory.tutorial6_1navigationui_viewpager2.blankfragment.NotificationFragment1
78

89
/**
910
* Passing [Fragment] as parameter let's this adapter to use childFragmentManager
1011
*/
1112
class ChildFragmentStateAdapter(fragment: Fragment) :
1213
FragmentStateAdapter(fragment) {
1314

14-
override fun getItemCount(): Int = 2
15+
override fun getItemCount(): Int = 3
1516

1617
override fun createFragment(position: Int): Fragment {
1718

1819
return when (position) {
1920
0 -> HomeFragment1()
20-
else -> DashboardFragment1()
21+
1 -> DashboardFragment1()
22+
else -> NotificationFragment1()
2123
}
2224
}
2325

Tutorial6-1NavigationUI-ViewPager2/src/main/java/com/smarttoolfactory/tutorial6_1navigationui_viewpager2/blankfragment/BaseDataBindingFragment.kt

+31-13
Original file line numberDiff line numberDiff line change
@@ -29,58 +29,76 @@ import androidx.fragment.app.Fragment
2929
*/
3030
abstract class BaseDataBindingFragment<ViewBinding : ViewDataBinding> : Fragment() {
3131

32-
var dataBinding: ViewBinding? = null
32+
/**
33+
* * 🔥️ Data binding that is not null(or non-nullable) after [Fragment.onDestroyView]
34+
* causing leak canary to show data binding related **MEMORY LEAK**
35+
* for this fragment when used in [ViewPager2]
36+
*
37+
* * Even with null data binding [ViewPager2] still leaks with FragmentMaxLifecycleEnforcer
38+
* or it's false positive, not confirmed
39+
*/
40+
var dataBinding: ViewBinding? = null
3341

3442
@LayoutRes
3543
abstract fun getLayoutRes(): Int
3644

3745
override fun onAttach(context: Context) {
3846
super.onAttach(context)
39-
// println("🥰 BaseDataBindingFragment onAttach() $this")
47+
// println("🥰 ${this.javaClass.simpleName} #${this.hashCode()} onAttach()")
4048
}
4149

4250
override fun onCreate(savedInstanceState: Bundle?) {
4351
super.onCreate(savedInstanceState)
44-
println("😀 BaseDataBindingFragment onCreate() $this")
52+
println("😀 ${this.javaClass.simpleName} #${this.hashCode()} onCreate()")
4553
}
4654

4755
override fun onCreateView(
4856
inflater: LayoutInflater, container: ViewGroup?,
4957
savedInstanceState: Bundle?
5058
): View? {
5159

52-
println("🤣 BaseDataBindingFragment onCreateView() ${this.javaClass.simpleName} #${this.hashCode()}")
60+
println("🤣 ${this.javaClass.simpleName} #${this.hashCode()} onCreateView()")
5361
// Inflate the layout for this fragment
5462
dataBinding = DataBindingUtil.inflate(inflater, getLayoutRes(), container, false)
55-
dataBinding?.lifecycleOwner = viewLifecycleOwner
63+
dataBinding!!.lifecycleOwner = viewLifecycleOwner
64+
5665
return dataBinding!!.root
5766
}
5867

5968
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
6069
super.onViewCreated(view, savedInstanceState)
61-
// println("🤩 BaseDataBindingFragment onViewCreated() view: $view, $this")
70+
// println("🤩 ${this.javaClass.simpleName} #${this.hashCode()} onViewCreated() view: $view")
6271
}
6372

6473

65-
override fun onAttachFragment(childFragment: Fragment) {
66-
super.onAttachFragment(childFragment)
67-
// println("😱 BaseDataBindingFragment onAttachFragment() $this, CHILD: $childFragment")
68-
}
69-
7074
override fun onDestroyView() {
7175
super.onDestroyView()
72-
// println("🥵 BaseDataBindingFragment onDestroyView() $this")
76+
println("🥵 ${this.javaClass.simpleName} #${this.hashCode()} onDestroyView()")
77+
78+
/*
79+
🔥 Without nullifying dataBinding ViewPager2 gets data binding related MEMORY LEAKS
80+
*/
7381
dataBinding = null
7482
}
7583

7684
override fun onDestroy() {
7785
super.onDestroy()
78-
// println("🥶 BaseDataBindingFragment onDestroy() $this")
86+
println("🥶 ${this.javaClass.simpleName} #${this.hashCode()} onDestroy()")
7987
}
8088

8189
override fun onDetach() {
8290
super.onDetach()
8391
// println("💀 BaseDataBindingFragment onDetach() $this")
8492
}
8593

94+
override fun onResume() {
95+
super.onResume()
96+
// println("🎃 ${this.javaClass.simpleName} #${this.hashCode()} onResume()")
97+
}
98+
99+
override fun onPause() {
100+
super.onPause()
101+
// println("😱 ${this.javaClass.simpleName} #${this.hashCode()} onPause()")
102+
}
103+
86104
}

Tutorial6-1NavigationUI-ViewPager2/src/main/java/com/smarttoolfactory/tutorial6_1navigationui_viewpager2/blankfragment/DashboardFragment1.kt

-6
Original file line numberDiff line numberDiff line change
@@ -11,15 +11,9 @@ class DashboardFragment1 : BaseDataBindingFragment<FragmentDashboard1Binding>()
1111

1212
override fun getLayoutRes(): Int = R.layout.fragment_dashboard1
1313

14-
var count = 0
15-
1614
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
1715
super.onViewCreated(view, savedInstanceState)
1816

19-
dataBinding!!.btnIncrease.setOnClickListener {
20-
dataBinding!!.tvTitle.text = "Count: ${count++}"
21-
}
22-
2317
dataBinding!!.btnNextPage.setOnClickListener {
2418
findNavController().navigate(R.id.action_mainFragment_to_dashboardFragment2)
2519
}

Tutorial6-1NavigationUI-ViewPager2/src/main/java/com/smarttoolfactory/tutorial6_1navigationui_viewpager2/blankfragment/DashboardFragment2.kt

-6
Original file line numberDiff line numberDiff line change
@@ -11,15 +11,9 @@ class DashboardFragment2 : BaseDataBindingFragment<FragmentDashboard2Binding>()
1111

1212
override fun getLayoutRes(): Int = R.layout.fragment_dashboard2
1313

14-
var count = 0
15-
1614
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
1715
super.onViewCreated(view, savedInstanceState)
1816

19-
dataBinding!!.btnIncrease.setOnClickListener {
20-
dataBinding!!.tvTitle.text = "Count: ${count++}"
21-
}
22-
2317
dataBinding!!.btnNextPage.setOnClickListener {
2418
findNavController().navigate(R.id.action_dashboardFragment2_to_dashboardFragment3)
2519
}

Tutorial6-1NavigationUI-ViewPager2/src/main/java/com/smarttoolfactory/tutorial6_1navigationui_viewpager2/blankfragment/DashboardFragment3.kt

-5
Original file line numberDiff line numberDiff line change
@@ -10,14 +10,9 @@ class DashboardFragment3 : BaseDataBindingFragment<FragmentDashboard3Binding>()
1010

1111
override fun getLayoutRes(): Int = R.layout.fragment_dashboard3
1212

13-
var count = 0
14-
1513
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
1614
super.onViewCreated(view, savedInstanceState)
1715

18-
dataBinding!!.btnIncrease.setOnClickListener {
19-
dataBinding!!.tvTitle.text = "Count: ${count++}"
20-
}
2116

2217
dataBinding!!.btnGoToStart.setOnClickListener {
2318
findNavController().navigate(R.id.action_global_start)

Tutorial6-1NavigationUI-ViewPager2/src/main/java/com/smarttoolfactory/tutorial6_1navigationui_viewpager2/blankfragment/HomeFragment1.kt

-6
Original file line numberDiff line numberDiff line change
@@ -10,15 +10,9 @@ class HomeFragment1 : BaseDataBindingFragment<FragmentHome1Binding>() {
1010

1111
override fun getLayoutRes(): Int = R.layout.fragment_home1
1212

13-
var count = 0
14-
1513
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
1614
super.onViewCreated(view, savedInstanceState)
1715

18-
dataBinding!!.btnIncrease.setOnClickListener {
19-
dataBinding!!.tvTitle.text = "Count: ${count++}"
20-
}
21-
2216
dataBinding!!.btnNextPage.setOnClickListener {
2317
findNavController().navigate(R.id.action_mainFragment_to_homeFragment2)
2418
}

Tutorial6-1NavigationUI-ViewPager2/src/main/java/com/smarttoolfactory/tutorial6_1navigationui_viewpager2/blankfragment/HomeFragment2.kt

-6
Original file line numberDiff line numberDiff line change
@@ -10,15 +10,9 @@ class HomeFragment2 : BaseDataBindingFragment<FragmentHome2Binding>() {
1010

1111
override fun getLayoutRes(): Int = R.layout.fragment_home2
1212

13-
var count = 0
14-
1513
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
1614
super.onViewCreated(view, savedInstanceState)
1715

18-
dataBinding!!.btnIncrease.setOnClickListener {
19-
dataBinding!!.tvTitle.text = "Count: ${count++}"
20-
}
21-
2216
dataBinding!!.btnNextPage.setOnClickListener {
2317
findNavController().navigate(R.id.action_homeFragment2_to_homeFragment3)
2418
}

Tutorial6-1NavigationUI-ViewPager2/src/main/java/com/smarttoolfactory/tutorial6_1navigationui_viewpager2/blankfragment/HomeFragment3.kt

-7
Original file line numberDiff line numberDiff line change
@@ -9,16 +9,9 @@ import com.smarttoolfactory.tutorial6_1navigationui_viewpager2.databinding.Fragm
99
class HomeFragment3 : BaseDataBindingFragment<FragmentHome3Binding>() {
1010
override fun getLayoutRes(): Int = R.layout.fragment_home3
1111

12-
var count = 0
13-
1412
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
1513
super.onViewCreated(view, savedInstanceState)
1614

17-
18-
dataBinding!!.btnIncrease.setOnClickListener {
19-
dataBinding!!.tvTitle.text = "Count: ${count++}"
20-
}
21-
2215
dataBinding!!.btnGoToStart.setOnClickListener {
2316
findNavController().navigate(R.id.action_global_start)
2417
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
package com.smarttoolfactory.tutorial6_1navigationui_viewpager2.blankfragment
2+
3+
import android.os.Bundle
4+
import android.view.View
5+
import androidx.navigation.fragment.findNavController
6+
import com.smarttoolfactory.tutorial6_1navigationui_viewpager2.R
7+
import com.smarttoolfactory.tutorial6_1navigationui_viewpager2.databinding.FragmentNotification1Binding
8+
9+
class NotificationFragment1 : BaseDataBindingFragment<FragmentNotification1Binding>() {
10+
11+
override fun getLayoutRes(): Int = R.layout.fragment_notification1
12+
13+
14+
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
15+
super.onViewCreated(view, savedInstanceState)
16+
17+
dataBinding!!.btnNextPage.setOnClickListener {
18+
findNavController().navigate(R.id.action_main_fragment_to_notificationFragment2)
19+
}
20+
21+
}
22+
23+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
package com.smarttoolfactory.tutorial6_1navigationui_viewpager2.blankfragment
2+
3+
import android.os.Bundle
4+
import android.view.View
5+
import androidx.navigation.fragment.findNavController
6+
import com.smarttoolfactory.tutorial6_1navigationui_viewpager2.R
7+
import com.smarttoolfactory.tutorial6_1navigationui_viewpager2.databinding.FragmentNotification2Binding
8+
9+
class NotificationFragment2 : BaseDataBindingFragment<FragmentNotification2Binding>() {
10+
11+
override fun getLayoutRes(): Int = R.layout.fragment_notification2
12+
13+
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
14+
super.onViewCreated(view, savedInstanceState)
15+
16+
dataBinding!!.btnNextPage.setOnClickListener {
17+
findNavController().navigate(R.id.action_notificationFragment2_to_notificationFragment3)
18+
}
19+
20+
}
21+
22+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
package com.smarttoolfactory.tutorial6_1navigationui_viewpager2.blankfragment
2+
3+
import android.os.Bundle
4+
import android.view.View
5+
import androidx.navigation.fragment.findNavController
6+
import com.smarttoolfactory.tutorial6_1navigationui_viewpager2.R
7+
import com.smarttoolfactory.tutorial6_1navigationui_viewpager2.databinding.FragmentNotification3Binding
8+
9+
class NotificationFragment3 : BaseDataBindingFragment<FragmentNotification3Binding>() {
10+
override fun getLayoutRes(): Int = R.layout.fragment_notification3
11+
12+
13+
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
14+
super.onViewCreated(view, savedInstanceState)
15+
16+
dataBinding!!.btnGoToStart.setOnClickListener {
17+
findNavController().navigate(R.id.action_global_start)
18+
}
19+
}
20+
}

0 commit comments

Comments
 (0)