Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -48,6 +48,7 @@ object AssetsInstallationHelper {

data class Failure(
val cause: Throwable?,
val errorMessage: String? = cause?.message,
) : Result
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ package com.itsaky.androidide.assets
import android.content.Context
import androidx.annotation.WorkerThread
import com.itsaky.androidide.app.configuration.CpuArch
import com.itsaky.androidide.resources.R
import com.itsaky.androidide.utils.Environment
import com.itsaky.androidide.utils.TerminalInstaller
import kotlinx.coroutines.Dispatchers
Expand Down Expand Up @@ -45,6 +46,7 @@ data object SplitAssetsInstaller : BaseAssetsInstaller() {
): Unit =
withContext(Dispatchers.IO) {
val entry = zipFile.getEntry(entryName)
?: throw FileNotFoundException(context.getString(R.string.err_asset_entry_not_found, entryName))
val time =
measureTimeMillis {
zipFile.getInputStream(entry).use { zipInput ->
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -176,7 +176,6 @@ class PermissionsFragment :
is InstallationState.InstallationError -> {
enableFinishButton()
finishButton?.text = getString(R.string.finish_installation)
activity?.flashError(getString(state.errorMessageResId))
}
}
}
Expand Down Expand Up @@ -220,8 +219,7 @@ class PermissionsFragment :
builder.title(getString(R.string.ide_setup_in_progress))
},
) { flashbar, _ ->
// Launch progress collector as a child coroutine
launch(Dispatchers.Main) {
val progressJob = launch(Dispatchers.Main) {
viewModel.installationProgress.collect { progress ->
if (progress.isNotEmpty()) {
flashbar.flashbarView.setMessage(progress)
Expand All @@ -231,17 +229,21 @@ class PermissionsFragment :

viewModel.startIdeSetup(requireContext())

viewModel.state.first { state ->
when (state) {
is InstallationState.InstallationComplete -> {
withContext(Dispatchers.Main) {
(activity as? OnboardingActivity)?.tryNavigateToMainIfSetupIsCompleted()
try {
viewModel.state.first { state ->
when (state) {
is InstallationState.InstallationComplete -> {
withContext(Dispatchers.Main) {
(activity as? OnboardingActivity)?.tryNavigateToMainIfSetupIsCompleted()
}
true
}
true
is InstallationState.InstallationError -> true
else -> false
}
is InstallationState.InstallationError -> true
else -> false
}
} finally {
progressJob.cancel()
}
}
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,8 +1,6 @@

package com.itsaky.androidide.viewmodel

import androidx.annotation.StringRes

sealed class InstallationState {
object InstallationPending : InstallationState()

Expand All @@ -12,5 +10,5 @@ sealed class InstallationState {

object InstallationComplete : InstallationState()

data class InstallationError(@StringRes val errorMessageResId: Int) : InstallationState()
data class InstallationError(val errorMessage: String) : InstallationState()
}
Original file line number Diff line number Diff line change
Expand Up @@ -82,25 +82,33 @@ class InstallationViewModel : ViewModel() {

when (result) {
is AssetsInstallationHelper.Result.Success -> {
// Reload JDK distributions after installation
val distributionProvider = IJdkDistributionProvider.getInstance()
distributionProvider.loadDistributions()

_state.update { InstallationComplete }
}
is AssetsInstallationHelper.Result.Failure -> {
result.cause?.let { Sentry.captureException(it) }
val errorMsg = result.errorMessage
?: context.getString(R.string.title_installation_failed)
viewModelScope.launch {
_events.emit(InstallationEvent.ShowError(errorMsg))
}
_state.update {
InstallationError(R.string.title_installation_failed)
InstallationError(errorMsg)
}
}
}
}
} catch (e: Exception) {
Sentry.captureException(e)
log.error("IDE setup installation failed", e)
val errorMsg = e.message ?: context.getString(R.string.unknown_error)
viewModelScope.launch {
_events.emit(InstallationEvent.ShowError(errorMsg))
}
_state.update {
InstallationError(R.string.unknown_error)
InstallationError(errorMsg)
}
}
}
Expand Down
1 change: 1 addition & 0 deletions resources/src/main/res/values/strings.xml
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,7 @@
<string name="msg_no_references">No references found</string>
<string name="view_diags">Diagnostics</string>
<string name="title_installation_failed">Installation failed</string>
<string name="err_asset_entry_not_found">Entry \'%1$s\' not found in assets zip file</string>
<string name="msg_picked_isnt_dir">The picked file is not a directory!</string>
<string name="please_wait">Please wait for a moment.</string>
<string name="not_enough_storage">Not enough storage available for installation. An additional %1$.1fGB is required on the Internal Storage partition. You currently have %2$.1fGB available.</string>
Expand Down