-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathStartForResultExample.kt
80 lines (67 loc) · 2.65 KB
/
StartForResultExample.kt
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
package ru.yandex.money.alcexample
import android.app.Activity
import android.content.Intent
import android.os.Bundle
import android.util.Log
import androidx.appcompat.app.AppCompatActivity
import androidx.fragment.app.Fragment
import androidx.fragment.app.FragmentManager
class StartingActivityCallback : Application.ActivityLifecycleCallbacks {
override fun onActivityCreated(activity: Activity, savedInstanceState: Bundle?) {
if (savedInstanceState == null) {
(activity as? StartForResultActivity)?.supportFragmentManager?.also { fragmentManager ->
val startingFragment = findOrCreateFragment(fragmentManager)
startingFragment.listener = { resultCode, data ->
// handle response here
Log.d("StartForResultExample", "resultCode: $resultCode; extras: ${data?.extras?.toMap()}")
}
// start Activity inside StartingFragment
}
}
}
private fun findOrCreateFragment(fragmentManager: FragmentManager): StartingFragment {
return fragmentManager.findFragmentByTag(StartingFragment::class.java.name) as StartingFragment?
?: StartingFragment().apply {
fragmentManager
.beginTransaction()
.add(this, StartingFragment::class.java.name)
.commit()
}
}
}
class StartingFragment : Fragment() {
private val requestCode = 1
var listener: ((Int, Intent?) -> Unit)? = null
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
if (savedInstanceState == null) {
startActivityForResult(Intent(requireContext(), ResultActivity::class.java), requestCode)
}
}
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
super.onActivityResult(requestCode, resultCode, data)
if (requestCode == this.requestCode) {
listener?.invoke(resultCode, data)
}
}
}
class ResultActivity : AppCompatActivity() {
override fun onResume() {
super.onResume()
setResult(Activity.RESULT_OK, Intent().apply {
putExtra("result", "result")
})
finish()
}
}
class StartForResultActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(FrameLayout {
Text(text = "Start for result example\nsee output in Logcat by \"StartForResultExample\" tag")
})
}
}
private fun Bundle.toMap(): Map<String, Any?> {
return keySet().map { it to this.get(it) }.toMap()
}