forked from geode-sdk/android-launcher
add external modification check
This commit is contained in:
4 files changed
+45
-14
No files matched your search
@@ -38,6 +38,7 @@ import com.geode.launcher.ui.theme.Theme
|
||||
import com.geode.launcher.ui.theme.Typography
|
||||
import com.geode.launcher.utils.LaunchUtils
|
||||
import com.geode.launcher.utils.PreferenceUtils
|
||||
import com.geode.launcher.utils.ReleaseManager
|
||||
import com.geode.launcher.utils.useCountdownTimer
|
||||
import java.net.ConnectException
|
||||
import java.net.UnknownHostException
|
||||
@@ -152,6 +153,14 @@ fun UpdateCard(releaseViewModel: ReleaseViewModel, modifier: Modifier = Modifier
|
||||
val message = when (state.exception) {
|
||||
is UnknownHostException, is ConnectException ->
|
||||
stringResource(R.string.release_fetch_no_internet)
|
||||
is ReleaseManager.UpdateException -> {
|
||||
when (state.exception.reason) {
|
||||
ReleaseManager.UpdateException.Reason.EXTERNAL_FILE_IN_USE -> stringResource(
|
||||
R.string.release_fetch_manual_check_required
|
||||
)
|
||||
else -> state.exception.message
|
||||
}
|
||||
}
|
||||
else -> state.exception.message
|
||||
}
|
||||
|
||||
|
||||
@@ -97,6 +97,7 @@ class PreferenceUtils(private val sharedPreferences: SharedPreferences) {
|
||||
CURRENT_VERSION_TIMESTAMP,
|
||||
THEME,
|
||||
BLACK_BACKGROUND,
|
||||
CURRENT_RELEASE_MODIFIED,
|
||||
}
|
||||
|
||||
private fun defaultValueForBooleanKey(key: Key): Boolean {
|
||||
@@ -116,6 +117,7 @@ class PreferenceUtils(private val sharedPreferences: SharedPreferences) {
|
||||
Key.CURRENT_VERSION_TIMESTAMP -> "PreferenceCurrentVersionDescriptor"
|
||||
Key.THEME -> "PreferenceTheme"
|
||||
Key.BLACK_BACKGROUND -> "PreferenceBlackBackground"
|
||||
Key.CURRENT_RELEASE_MODIFIED -> "PreferenceReleaseModified"
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -9,7 +9,6 @@ import kotlinx.coroutines.DelicateCoroutinesApi
|
||||
import kotlinx.coroutines.GlobalScope
|
||||
import kotlinx.coroutines.Job
|
||||
import kotlinx.coroutines.cancelAndJoin
|
||||
import kotlinx.coroutines.coroutineScope
|
||||
import kotlinx.coroutines.flow.MutableStateFlow
|
||||
import kotlinx.coroutines.flow.StateFlow
|
||||
import kotlinx.coroutines.flow.asStateFlow
|
||||
@@ -58,6 +57,15 @@ class ReleaseManager private constructor(
|
||||
data class Finished(val hasUpdated: Boolean = false) : ReleaseManagerState()
|
||||
}
|
||||
|
||||
class UpdateException(reason: Reason? = null, cause: Throwable? = null) : Exception(reason?.name, cause) {
|
||||
enum class Reason {
|
||||
EXTERNAL_FILE_IN_USE
|
||||
}
|
||||
|
||||
var reason: Reason? = reason
|
||||
private set
|
||||
}
|
||||
|
||||
private var updateJob: Job? = null
|
||||
|
||||
private val _uiState = MutableStateFlow<ReleaseManagerState>(ReleaseManagerState.Finished())
|
||||
@@ -157,23 +165,34 @@ class ReleaseManager private constructor(
|
||||
return
|
||||
}
|
||||
|
||||
// check if the file was externally modified
|
||||
val fileLastModified = sharedPreferences.getLong(PreferenceUtils.Key.CURRENT_RELEASE_MODIFIED)
|
||||
if (fileLastModified != 0L && fileLastModified != geodeFile.lastModified()) {
|
||||
sendError(UpdateException(UpdateException.Reason.EXTERNAL_FILE_IN_USE))
|
||||
return
|
||||
}
|
||||
|
||||
performUpdate(release)
|
||||
}
|
||||
|
||||
private suspend fun updatePreferences(release: Release) {
|
||||
coroutineScope {
|
||||
val sharedPreferences = PreferenceUtils.get(applicationContext)
|
||||
private fun updatePreferences(release: Release) {
|
||||
val sharedPreferences = PreferenceUtils.get(applicationContext)
|
||||
|
||||
sharedPreferences.setString(
|
||||
PreferenceUtils.Key.CURRENT_VERSION_TAG,
|
||||
release.getDescription()
|
||||
)
|
||||
sharedPreferences.setString(
|
||||
PreferenceUtils.Key.CURRENT_VERSION_TAG,
|
||||
release.getDescription()
|
||||
)
|
||||
|
||||
sharedPreferences.setLong(
|
||||
PreferenceUtils.Key.CURRENT_VERSION_TIMESTAMP,
|
||||
release.getDescriptor()
|
||||
)
|
||||
}
|
||||
sharedPreferences.setLong(
|
||||
PreferenceUtils.Key.CURRENT_VERSION_TIMESTAMP,
|
||||
release.getDescriptor()
|
||||
)
|
||||
|
||||
val outputFile = getGeodeOutputPath()
|
||||
sharedPreferences.setLong(
|
||||
PreferenceUtils.Key.CURRENT_RELEASE_MODIFIED,
|
||||
outputFile.lastModified()
|
||||
)
|
||||
}
|
||||
|
||||
private fun getGeodeOutputPath(): File {
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
<resources>
|
||||
<string name="app_name">Geode</string>
|
||||
<string name="app_name" translatable="false">Geode</string>
|
||||
<string name="no_activity_found">No activity found for this action.</string>
|
||||
|
||||
<!-- MainActivity strings -->
|
||||
@@ -30,6 +30,7 @@
|
||||
<string name="release_fetch_cancelled">Update cancelled.</string>
|
||||
<string name="release_fetch_button_retry">Retry</string>
|
||||
<string name="release_fetch_button_cancel">Cancel</string>
|
||||
<string name="release_fetch_manual_check_required">Externally managed library in use, please manually check for updates if you want to overwrite it.</string>
|
||||
|
||||
<!-- GeometryDashActivity strings -->
|
||||
<string name="message_box_cancel">Cancel</string>
|
||||
|
||||
Reference in new issue
Block a user