@@ -19,6 +19,8 @@ package com.itsaky.androidide.activities
1919
2020import android.content.Intent
2121import android.os.Bundle
22+ import android.util.Log
23+ import androidx.activity.result.contract.ActivityResultContracts
2224import androidx.core.content.ContextCompat
2325import androidx.fragment.app.Fragment
2426import com.github.appintro.AppIntro2
@@ -32,18 +34,42 @@ import com.itsaky.androidide.fragments.onboarding.IdeSetupConfigurationFragment
3234import com.itsaky.androidide.fragments.onboarding.OnboardingInfoFragment
3335import com.itsaky.androidide.fragments.onboarding.PermissionsFragment
3436import com.itsaky.androidide.fragments.onboarding.StatisticsFragment
37+ import com.itsaky.androidide.models.JdkDistribution
3538import com.itsaky.androidide.preferences.internal.prefManager
3639import com.itsaky.androidide.preferences.internal.statConsentDialogShown
40+ import com.itsaky.androidide.tasks.launchAsyncWithProgress
3741import com.itsaky.androidide.ui.themes.IThemeManager
3842import com.itsaky.androidide.utils.Environment
3943import com.termux.shared.android.PackageUtils
4044import com.termux.shared.markdown.MarkdownUtils
4145import com.termux.shared.termux.TermuxConstants
46+ import kotlinx.coroutines.CoroutineName
47+ import kotlinx.coroutines.CoroutineScope
48+ import kotlinx.coroutines.Dispatchers
49+ import kotlinx.coroutines.Job
50+ import kotlinx.coroutines.cancel
51+ import kotlinx.coroutines.withContext
4252
4353class OnboardingActivity : AppIntro2 () {
4454
55+ private val terminalActivityCallback = registerForActivityResult(
56+ ActivityResultContracts .StartActivityForResult ()) {
57+ Log .d(TAG , " TerminalActivity: resultCode=${it.resultCode} " )
58+ if (! isFinishing) {
59+ reloadJdkDistInfo {
60+ tryNavigateToMainIfSetupIsCompleted()
61+ }
62+ }
63+ }
64+
65+ private val activityScope =
66+ CoroutineScope (Dispatchers .Main + CoroutineName (" OnboardingActivity" ))
67+
68+ private var listJdkInstallationsJob: Job ? = null
69+
4570 companion object {
4671
72+ private const val TAG = " OnboardingActivity"
4773 private const val KEY_ARCHCONFIG_WARNING_IS_SHOWN = " ide.archConfig.experimentalWarning.isShown"
4874 }
4975
@@ -52,9 +78,8 @@ class OnboardingActivity : AppIntro2() {
5278
5379 super .onCreate(savedInstanceState)
5480
55- if (isSetupDone()) {
56- openActivity(MainActivity ::class .java)
57- finish()
81+ if (tryNavigateToMainIfSetupIsCompleted()) {
82+ return
5883 }
5984
6085 setSwipeLock(true )
@@ -110,12 +135,16 @@ class OnboardingActivity : AppIntro2() {
110135
111136 override fun onResume () {
112137 super .onResume()
113- if (isSetupDone()) {
114- openActivity(MainActivity ::class .java)
115- finish()
138+ reloadJdkDistInfo {
139+ tryNavigateToMainIfSetupIsCompleted()
116140 }
117141 }
118142
143+ override fun onDestroy () {
144+ super .onDestroy()
145+ activityScope.cancel(" Activity is being destroyed" )
146+ }
147+
119148 override fun onNextPressed (currentFragment : Fragment ? ) {
120149 (currentFragment as ? StatisticsFragment ? )?.updateStatOptInStatus()
121150 }
@@ -129,31 +158,58 @@ class OnboardingActivity : AppIntro2() {
129158 }
130159
131160 if (! checkToolsIsInstalled() && currentFragment is IdeSetupConfigurationFragment ) {
132- val intenet = Intent (this , TerminalActivity ::class .java)
161+ val intent = Intent (this , TerminalActivity ::class .java)
133162 if (currentFragment.isAutoInstall()) {
134- intenet .putExtra(TerminalActivity .EXTRA_ONBOARDING_RUN_IDESETUP , true )
135- intenet .putExtra(TerminalActivity .EXTRA_ONBOARDING_RUN_IDESETUP_ARGS ,
163+ intent .putExtra(TerminalActivity .EXTRA_ONBOARDING_RUN_IDESETUP , true )
164+ intent .putExtra(TerminalActivity .EXTRA_ONBOARDING_RUN_IDESETUP_ARGS ,
136165 currentFragment.buildIdeSetupArguments())
137166 }
138- startActivity(intenet )
167+ terminalActivityCallback.launch(intent )
139168 return
140169 }
141170
142- openActivity(MainActivity ::class .java)
143- }
144-
145- private fun openActivity (cls : Class <* >) {
146- startActivity(Intent (this , cls))
171+ tryNavigateToMainIfSetupIsCompleted()
147172 }
148173
149174 private fun checkToolsIsInstalled (): Boolean {
150175 return IJdkDistributionProvider .getInstance().installedDistributions.isNotEmpty()
151176 && Environment .ANDROID_HOME .exists()
152177 }
153178
154- private fun isSetupDone () =
155- (checkToolsIsInstalled() && statConsentDialogShown && PermissionsFragment .areAllPermissionsGranted(
156- this ))
179+ private fun isSetupCompleted (): Boolean {
180+ return checkToolsIsInstalled()
181+ && statConsentDialogShown
182+ && PermissionsFragment .areAllPermissionsGranted(this )
183+ }
184+
185+ private fun tryNavigateToMainIfSetupIsCompleted (): Boolean {
186+ if (isSetupCompleted()) {
187+ startActivity(Intent (this , MainActivity ::class .java))
188+ finish()
189+ return true
190+ }
191+
192+ return false
193+ }
194+
195+ private inline fun reloadJdkDistInfo (crossinline distConsumer : (List <JdkDistribution >) -> Unit ) {
196+ listJdkInstallationsJob?.cancel(" Reloading JDK distributions" )
197+
198+ listJdkInstallationsJob = activityScope.launchAsyncWithProgress(Dispatchers .Default ,
199+ configureFlashbar = { builder, _ ->
200+ builder.message(string.please_wait)
201+ }) { _, _ ->
202+ val distributionProvider = IJdkDistributionProvider .getInstance()
203+ distributionProvider.loadDistributions()
204+ withContext(Dispatchers .Main ) {
205+ distConsumer(distributionProvider.installedDistributions)
206+ }
207+ }.also {
208+ it?.invokeOnCompletion {
209+ listJdkInstallationsJob = null
210+ }
211+ }
212+ }
157213
158214 private fun isInstalledOnSdCard (): Boolean {
159215 // noinspection SdCardPath
0 commit comments