Skip to content

Commit 92814d2

Browse files
Merge pull request #14 from ImaginativeShohag/dev
add Data pass example between activities and fragments
2 parents 210b027 + d26e195 commit 92814d2

28 files changed

+875
-28
lines changed

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@ A simple Android MVVM pattern example and template.
2929
- Awesome module naming example (see `AwesomeModuleConstants`)
3030
- Dynamic accent color from image (see `calculatePaletteInImage()`)
3131
- Simple Encryption Utils (see `EncryptionUtils`)
32+
- Data pass example between activities and fragments
3233

3334
## Extension Functions (see `utils/extensions`)
3435

@@ -68,7 +69,6 @@ A simple Android MVVM pattern example and template.
6869
- [ ] Splash (Introduced in Android S)
6970
- [ ] UI/Unit Testing
7071
- [ ] Example of LocationProviderUtilClient
71-
- [ ] AdUtils from Ticket Sheba
7272

7373
# My Other Projects
7474

app/build.gradle

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -132,6 +132,9 @@ dependencies {
132132
androidTestImplementation 'androidx.test.ext:junit:1.1.5'
133133
androidTestImplementation 'androidx.test.espresso:espresso-core:3.5.1'
134134

135+
// Fragment
136+
implementation "androidx.fragment:fragment-ktx:1.5.5"
137+
135138
// Material Design
136139
implementation 'com.google.android.material:material:1.8.0'
137140

app/src/main/AndroidManifest.xml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,9 @@
3030
</intent-filter>
3131
</activity>
3232

33+
<activity android:name="org.imaginativeworld.simplemvvm.ui.activities.activitynav.DemoOneActivity" />
34+
<activity android:name="org.imaginativeworld.simplemvvm.ui.activities.activitynav.DemoTwoActivity" />
35+
3336

3437
<!-- https://developer.android.com/reference/androidx/core/content/FileProvider -->
3538
<provider

app/src/main/java/org/imaginativeworld/simplemvvm/interfaces/OnFragmentInteractionListener.kt

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,5 +24,4 @@ interface OnFragmentInteractionListener {
2424
fun showLoading()
2525

2626
fun hideLoading()
27-
28-
}
27+
}

app/src/main/java/org/imaginativeworld/simplemvvm/models/DemoPost.kt

Lines changed: 35 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,16 +3,48 @@ package org.imaginativeworld.simplemvvm.models
33
import androidx.annotation.Keep
44
import com.squareup.moshi.Json
55
import com.squareup.moshi.JsonClass
6+
import kotlin.random.Random
67

78
@Keep
89
@JsonClass(generateAdapter = true)
910
data class DemoPost(
10-
@Json(name = "body")
11-
val body: String,
1211
@Json(name = "id")
1312
val id: String,
1413
@Json(name = "title")
1514
val title: String,
15+
@Json(name = "body")
16+
val body: String,
1617
@Json(name = "user_id")
1718
val userId: String
18-
)
19+
) {
20+
companion object {
21+
fun getDummies(): List<DemoPost> {
22+
return listOf(
23+
DemoPost(
24+
"${Random(0).nextInt()}",
25+
"sunt aut facere repellat provident occaecati excepturi optio reprehenderit",
26+
"quia et suscipit\\nsuscipit recusandae consequuntur expedita et cum\\nreprehenderit molestiae ut ut quas totam\\nnostrum rerum est autem sunt rem eveniet architecto",
27+
"${Random(0).nextInt()}"
28+
),
29+
DemoPost(
30+
"${Random(0).nextInt()}",
31+
"qui est esse",
32+
"est rerum tempore vitae\nsequi sint nihil reprehenderit dolor beatae ea dolores neque\nfugiat blanditiis voluptate porro vel nihil molestiae ut reiciendis\nqui aperiam non debitis possimus qui neque nisi nulla",
33+
"${Random(0).nextInt()}"
34+
),
35+
DemoPost(
36+
"${Random(0).nextInt()}",
37+
"eum et est occaecati",
38+
"ullam et saepe reiciendis voluptatem adipisci\nsit amet autem assumenda provident rerum culpa\nquis hic commodi nesciunt rem tenetur doloremque ipsam iure\nquis sunt voluptatem rerum illo velit",
39+
"${Random(0).nextInt()}"
40+
),
41+
DemoPost(
42+
"${Random(0).nextInt()}",
43+
"nesciunt quas odio",
44+
"repudiandae veniam quaerat sunt sed\nalias aut fugiat sit autem sed est\nvoluptatem omnis possimus esse voluptatibus quis\nest aut tenetur dolor neque",
45+
"${Random(0).nextInt()}"
46+
)
47+
)
48+
}
49+
}
50+
}
Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
package org.imaginativeworld.simplemvvm.ui.activities.activitynav
2+
3+
import android.app.Activity
4+
import android.content.Intent
5+
import android.os.Bundle
6+
import androidx.appcompat.app.AppCompatActivity
7+
import org.imaginativeworld.simplemvvm.databinding.ActivityDemoOneBinding
8+
import org.imaginativeworld.simplemvvm.interfaces.CommonFunctions
9+
10+
class DemoOneActivity : AppCompatActivity(), CommonFunctions {
11+
companion object {
12+
private const val PARAM_DATA_ONE = "data_one"
13+
private const val PARAM_DATA_TWO = "data_two"
14+
15+
fun start(activity: Activity, dataOne: Int, dataTwo: String?) {
16+
val intent = Intent(activity, DemoOneActivity::class.java)
17+
intent.apply {
18+
putExtra(PARAM_DATA_ONE, dataOne)
19+
putExtra(PARAM_DATA_TWO, dataTwo)
20+
}
21+
activity.startActivity(intent)
22+
}
23+
}
24+
25+
private lateinit var binding: ActivityDemoOneBinding
26+
27+
private var dataOne: Int = -1
28+
private var dataTwo: String? = null
29+
30+
override fun onCreate(savedInstanceState: Bundle?) {
31+
super.onCreate(savedInstanceState)
32+
33+
binding = ActivityDemoOneBinding.inflate(layoutInflater)
34+
setContentView(binding.root)
35+
36+
// Receive Data
37+
intent.apply {
38+
dataOne = getIntExtra(PARAM_DATA_ONE, -1)
39+
dataTwo = getStringExtra(PARAM_DATA_TWO)
40+
}
41+
42+
initViews()
43+
initListeners()
44+
}
45+
46+
override fun initViews() {
47+
binding.apply {
48+
txtOne.text = "$dataOne"
49+
txtTwo.text = "$dataTwo"
50+
}
51+
}
52+
53+
override fun initListeners() {
54+
binding.btnBack.setOnClickListener {
55+
finish()
56+
}
57+
}
58+
}
Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
package org.imaginativeworld.simplemvvm.ui.activities.activitynav
2+
3+
import android.content.Intent
4+
import android.os.Bundle
5+
import android.os.Parcelable
6+
import androidx.appcompat.app.AppCompatActivity
7+
import kotlinx.parcelize.Parcelize
8+
import org.imaginativeworld.simplemvvm.databinding.ActivityDemoTwoBinding
9+
import org.imaginativeworld.simplemvvm.interfaces.CommonFunctions
10+
11+
class DemoTwoActivity : AppCompatActivity(), CommonFunctions {
12+
13+
companion object {
14+
const val PARAM_DATA = "data"
15+
}
16+
17+
private lateinit var binding: ActivityDemoTwoBinding
18+
19+
override fun onCreate(savedInstanceState: Bundle?) {
20+
super.onCreate(savedInstanceState)
21+
22+
binding = ActivityDemoTwoBinding.inflate(layoutInflater)
23+
setContentView(binding.root)
24+
25+
initListeners()
26+
}
27+
28+
override fun initListeners() {
29+
binding.btnFinishActivity.setOnClickListener {
30+
val data = DemoTwoActivityData(
31+
dataOne = binding.inputDataOne.text.toString().toIntOrNull() ?: -1,
32+
dataTwo = binding.inputDataTwo.text.toString()
33+
)
34+
val intent = Intent()
35+
.apply {
36+
putExtra(PARAM_DATA, data)
37+
}
38+
setResult(RESULT_OK, intent)
39+
finish()
40+
}
41+
}
42+
}
43+
44+
@Parcelize
45+
data class DemoTwoActivityData(
46+
val dataOne: Int,
47+
val dataTwo: String?
48+
) : Parcelable

app/src/main/java/org/imaginativeworld/simplemvvm/ui/activities/main/MainActivity.kt

Lines changed: 12 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ import androidx.navigation.NavDirections
1111
import androidx.navigation.findNavController
1212
import com.onesignal.OneSignal
1313
import dagger.hilt.android.AndroidEntryPoint
14+
import javax.inject.Inject
1415
import org.imaginativeworld.simplemvvm.BuildConfig
1516
import org.imaginativeworld.simplemvvm.R
1617
import org.imaginativeworld.simplemvvm.databinding.ActivityMainBinding
@@ -25,7 +26,6 @@ import org.imaginativeworld.simplemvvm.utils.extensions.hideKeyboard
2526
import org.imaginativeworld.simplemvvm.utils.extensions.indefiniteSnackbar
2627
import org.imaginativeworld.simplemvvm.utils.extensions.longSnackbar
2728
import timber.log.Timber
28-
import javax.inject.Inject
2929

3030
@AndroidEntryPoint
3131
class MainActivity :
@@ -67,16 +67,21 @@ class MainActivity :
6767
// Do things that may crash.
6868
}
6969

70-
val result = EncryptionUtils.decrypt(
71-
("rbr\bk9jlhj\u0001a\n" +
72-
"k%\u0001\u0006\u0003g\u0001g\u0016e?jeo\u000Bl\u0017\u0007a'fhsh\u0014|\u000BjI\u000F\brf\u000Erdm%\u0003zsh\tf\u0001\u0006G\u0001oy}\u000Fy\bi.m~\u0003\u0005bp\u001Cp\$ogdg\u0014\u0017\u0019").toByteArray()
73-
)
74-
75-
Timber.e("decrypt: ${String(result)}")
70+
encryptionUtilsDemo()
7671

7772
Timber.e("baseUrl: ${BuildConfig.BASE_URL}")
7873
}
7974

75+
private fun encryptionUtilsDemo() {
76+
val encryptedText = EncryptionUtils.encrypt("Lorem Ipsum Dolor".toByteArray())
77+
78+
Timber.e("Encrypted Text: ${String(encryptedText)}")
79+
80+
val decryptedText = EncryptionUtils.decrypt(encryptedText)
81+
82+
Timber.e("Decrypted Text: ${String(decryptedText)}")
83+
}
84+
8085
// TODO: Add this to onResume
8186
private fun updateOneSignalId() {
8287
// this can also be used to observer:
@@ -110,11 +115,9 @@ class MainActivity :
110115
hideKeyboard()
111116

112117
if (navController.currentDestination == null) {
113-
114118
showLoading()
115119
navController.navigate(destinationResId)
116120
} else {
117-
118121
navController.currentDestination?.let {
119122
if (it.id != destinationResId) {
120123
showLoading()
@@ -128,11 +131,9 @@ class MainActivity :
128131
hideKeyboard()
129132

130133
if (navController.currentDestination == null) {
131-
132134
showLoading()
133135
navController.navigate(destinationResId, data)
134136
} else {
135-
136137
navController.currentDestination?.let {
137138
if (it.id != destinationResId) {
138139
showLoading()
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,100 @@
1+
package org.imaginativeworld.simplemvvm.ui.fragments.demo_activity_nav
2+
3+
import android.app.Activity
4+
import android.content.Context
5+
import android.content.Intent
6+
import android.os.Bundle
7+
import android.view.LayoutInflater
8+
import android.view.View
9+
import android.view.ViewGroup
10+
import androidx.activity.result.contract.ActivityResultContracts
11+
import androidx.fragment.app.Fragment
12+
import org.imaginativeworld.simplemvvm.R
13+
import org.imaginativeworld.simplemvvm.databinding.FragmentDemoActivityNavBinding
14+
import org.imaginativeworld.simplemvvm.interfaces.CommonFunctions
15+
import org.imaginativeworld.simplemvvm.interfaces.OnFragmentInteractionListener
16+
import org.imaginativeworld.simplemvvm.ui.activities.activitynav.DemoOneActivity
17+
import org.imaginativeworld.simplemvvm.ui.activities.activitynav.DemoTwoActivity
18+
import org.imaginativeworld.simplemvvm.ui.activities.activitynav.DemoTwoActivityData
19+
20+
class DemoActivityNavFragment : Fragment(), CommonFunctions {
21+
22+
private var listener: OnFragmentInteractionListener? = null
23+
24+
private lateinit var binding: FragmentDemoActivityNavBinding
25+
26+
private val getActivityResult =
27+
registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { result ->
28+
val data = result.data?.getParcelableExtra<DemoTwoActivityData>(
29+
DemoTwoActivity.PARAM_DATA
30+
)
31+
32+
if (result.resultCode == Activity.RESULT_OK && data != null) {
33+
binding.txtResult.text = """
34+
Data One: ${data.dataOne}
35+
Data Two: ${data.dataTwo}
36+
""".trimIndent()
37+
}
38+
}
39+
40+
override fun onCreate(savedInstanceState: Bundle?) {
41+
super.onCreate(savedInstanceState)
42+
43+
initObservers()
44+
}
45+
46+
override fun onCreateView(
47+
inflater: LayoutInflater,
48+
container: ViewGroup?,
49+
savedInstanceState: Bundle?
50+
): View {
51+
binding = FragmentDemoActivityNavBinding.inflate(inflater, container, false)
52+
return binding.root
53+
}
54+
55+
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
56+
super.onViewCreated(view, savedInstanceState)
57+
58+
listener?.setAppTitle(getString(R.string.app_name))
59+
60+
listener?.hideLoading()
61+
62+
initViews()
63+
}
64+
65+
override fun initViews() {
66+
binding.btnLaunchActivity.setOnClickListener {
67+
val dataOne: Int = binding.inputDataOne.text.toString().toIntOrNull() ?: -1
68+
val dataTwo: String = binding.inputDataTwo.text.toString()
69+
70+
activity?.let {
71+
DemoOneActivity.start(
72+
it,
73+
dataOne,
74+
dataTwo
75+
)
76+
}
77+
}
78+
79+
binding.btnLaunchActivityForResult.setOnClickListener {
80+
activity?.let {
81+
getActivityResult.launch(Intent(activity, DemoTwoActivity::class.java))
82+
}
83+
}
84+
}
85+
86+
override fun onAttach(context: Context) {
87+
super.onAttach(context)
88+
89+
if (context is OnFragmentInteractionListener) {
90+
listener = context
91+
} else {
92+
throw RuntimeException("$context must implement OnFragmentInteractionListener")
93+
}
94+
}
95+
96+
override fun onDetach() {
97+
super.onDetach()
98+
listener = null
99+
}
100+
}

0 commit comments

Comments
 (0)