Merge pull request #626 from vector-im/feature/bma/sonar

Sonar
This commit is contained in:
Benoit Marty 2023-06-21 10:41:26 +02:00 committed by GitHub
commit 02aee0fe15
7 changed files with 29 additions and 9 deletions

View file

@ -81,8 +81,12 @@ jobs:
**/out/failures/ **/out/failures/
**/build/reports/tests/*UnitTest/ **/build/reports/tests/*UnitTest/
- name: 🔊 Publish results to Sonar (disabled) - name: 🔊 Publish results to Sonar
run: echo "This is now done only once a day, see nightlyReports.yml" env:
SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }}
ORG_GRADLE_PROJECT_SONAR_LOGIN: ${{ secrets.SONAR_TOKEN }}
if: ${{ always() && env.SONAR_TOKEN != '' && env.ORG_GRADLE_PROJECT_SONAR_LOGIN != '' }}
run: ./gradlew sonar $CI_GRADLE_ARG_PROPERTIES
# https://github.com/codecov/codecov-action # https://github.com/codecov/codecov-action
- name: ☂️ Upload coverage reports to codecov - name: ☂️ Upload coverage reports to codecov

View file

@ -20,6 +20,7 @@ import android.net.Uri
import io.element.android.features.createroom.impl.configureroom.RoomPrivacy import io.element.android.features.createroom.impl.configureroom.RoomPrivacy
import io.element.android.features.createroom.impl.di.CreateRoomScope import io.element.android.features.createroom.impl.di.CreateRoomScope
import io.element.android.features.createroom.impl.userlist.UserListDataStore import io.element.android.features.createroom.impl.userlist.UserListDataStore
import io.element.android.libraries.androidutils.file.safeDelete
import io.element.android.libraries.di.SingleIn import io.element.android.libraries.di.SingleIn
import kotlinx.collections.immutable.toImmutableList import kotlinx.collections.immutable.toImmutableList
import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.Flow
@ -36,7 +37,7 @@ class CreateRoomDataStore @Inject constructor(
private val createRoomConfigFlow: MutableStateFlow<CreateRoomConfig> = MutableStateFlow(CreateRoomConfig()) private val createRoomConfigFlow: MutableStateFlow<CreateRoomConfig> = MutableStateFlow(CreateRoomConfig())
private var cachedAvatarUri: Uri? = null private var cachedAvatarUri: Uri? = null
set(value) { set(value) {
field?.path?.let { File(it) }?.delete() field?.path?.let { File(it) }?.safeDelete()
field = value field = value
} }

View file

@ -80,8 +80,7 @@ fun ConfirmAccountProviderView(
id = if (state.isAccountCreation) { id = if (state.isAccountCreation) {
R.string.screen_account_provider_signup_subtitle R.string.screen_account_provider_signup_subtitle
} else { } else {
// Use same value for now. R.string.screen_account_provider_signin_subtitle
R.string.screen_account_provider_signup_subtitle
}, },
) )
) )

View file

@ -35,6 +35,19 @@ fun File.safeDelete() {
) )
} }
fun File.safeRenameTo(dest: File) {
tryOrNull(
onError = {
Timber.e(it, "Error, unable to rename file $path to ${dest.path}")
},
operation = {
if (renameTo(dest).not()) {
Timber.w("Warning, unable to rename file $path to ${dest.path}")
}
}
)
}
fun Context.createTmpFile(baseDir: File = cacheDir, extension: String? = null): File { fun Context.createTmpFile(baseDir: File = cacheDir, extension: String? = null): File {
val suffix = extension?.let { ".$extension" } val suffix = extension?.let { ".$extension" }
return File.createTempFile(UUID.randomUUID().toString(), suffix, baseDir).apply { mkdirs() } return File.createTempFile(UUID.randomUUID().toString(), suffix, baseDir).apply { mkdirs() }

View file

@ -24,6 +24,7 @@ import androidx.exifinterface.media.ExifInterface
import com.squareup.anvil.annotations.ContributesBinding import com.squareup.anvil.annotations.ContributesBinding
import io.element.android.libraries.androidutils.file.createTmpFile import io.element.android.libraries.androidutils.file.createTmpFile
import io.element.android.libraries.androidutils.file.getFileName import io.element.android.libraries.androidutils.file.getFileName
import io.element.android.libraries.androidutils.file.safeRenameTo
import io.element.android.libraries.androidutils.media.runAndRelease import io.element.android.libraries.androidutils.media.runAndRelease
import io.element.android.libraries.core.coroutine.CoroutineDispatchers import io.element.android.libraries.core.coroutine.CoroutineDispatchers
import io.element.android.libraries.core.data.tryOrNull import io.element.android.libraries.core.data.tryOrNull
@ -105,7 +106,7 @@ class AndroidMediaPreProcessor @Inject constructor(
private fun MediaUploadInfo.postProcess(uri: Uri): MediaUploadInfo { private fun MediaUploadInfo.postProcess(uri: Uri): MediaUploadInfo {
val name = context.getFileName(uri) ?: return this val name = context.getFileName(uri) ?: return this
val renamedFile = File(context.cacheDir, name).also { val renamedFile = File(context.cacheDir, name).also {
file.renameTo(it) file.safeRenameTo(it)
} }
return when (this) { return when (this) {
is MediaUploadInfo.AnyFile -> copy(file = renamedFile) is MediaUploadInfo.AnyFile -> copy(file = renamedFile)

View file

@ -21,6 +21,7 @@ import android.net.Uri
import com.otaliastudios.transcoder.Transcoder import com.otaliastudios.transcoder.Transcoder
import com.otaliastudios.transcoder.TranscoderListener import com.otaliastudios.transcoder.TranscoderListener
import io.element.android.libraries.androidutils.file.createTmpFile import io.element.android.libraries.androidutils.file.createTmpFile
import io.element.android.libraries.androidutils.file.safeDelete
import io.element.android.libraries.di.ApplicationContext import io.element.android.libraries.di.ApplicationContext
import kotlinx.coroutines.channels.awaitClose import kotlinx.coroutines.channels.awaitClose
import kotlinx.coroutines.flow.callbackFlow import kotlinx.coroutines.flow.callbackFlow
@ -46,12 +47,12 @@ class VideoCompressor @Inject constructor(
} }
override fun onTranscodeCanceled() { override fun onTranscodeCanceled() {
tmpFile.delete() tmpFile.safeDelete()
close() close()
} }
override fun onTranscodeFailed(exception: Throwable) { override fun onTranscodeFailed(exception: Throwable) {
tmpFile.delete() tmpFile.safeDelete()
close(exception) close(exception)
} }
}) })

View file

@ -18,6 +18,7 @@ package io.element.android.libraries.push.impl.notifications
import android.content.Context import android.content.Context
import io.element.android.libraries.androidutils.file.EncryptedFileFactory import io.element.android.libraries.androidutils.file.EncryptedFileFactory
import io.element.android.libraries.androidutils.file.safeDelete
import io.element.android.libraries.core.data.tryOrNull import io.element.android.libraries.core.data.tryOrNull
import io.element.android.libraries.core.log.logger.LoggerTag import io.element.android.libraries.core.log.logger.LoggerTag
import io.element.android.libraries.di.ApplicationContext import io.element.android.libraries.di.ApplicationContext
@ -70,7 +71,7 @@ class NotificationEventPersistence @Inject constructor(
fun persistEvents(queuedEvents: NotificationEventQueue) { fun persistEvents(queuedEvents: NotificationEventQueue) {
Timber.tag(loggerTag.value).d("Serializing ${queuedEvents.rawEvents().size} NotifiableEvent(s)") Timber.tag(loggerTag.value).d("Serializing ${queuedEvents.rawEvents().size} NotifiableEvent(s)")
// Always delete file before writing, or encryptedFile.openFileOutput() will throw // Always delete file before writing, or encryptedFile.openFileOutput() will throw
file.delete() file.safeDelete()
if (queuedEvents.isEmpty()) return if (queuedEvents.isEmpty()) return
try { try {
encryptedFile.openFileOutput().use { fos -> encryptedFile.openFileOutput().use { fos ->