diff --git a/Corona-Warn-App/src/androidTest/java/de/rki/coronawarnapp/bugreporting/DebugLogFragmentTest.kt b/Corona-Warn-App/src/androidTest/java/de/rki/coronawarnapp/bugreporting/DebugLogFragmentTest.kt index c97a39b0d8463fc49dfb7330b5225f4f755212da..c18496b74f1e74c700ffa3e4c1fe6779379f34e4 100644 --- a/Corona-Warn-App/src/androidTest/java/de/rki/coronawarnapp/bugreporting/DebugLogFragmentTest.kt +++ b/Corona-Warn-App/src/androidTest/java/de/rki/coronawarnapp/bugreporting/DebugLogFragmentTest.kt @@ -1,12 +1,10 @@ package de.rki.coronawarnapp.bugreporting -import android.content.ContentResolver import androidx.lifecycle.MutableLiveData import androidx.test.ext.junit.runners.AndroidJUnit4 import dagger.Module import dagger.android.ContributesAndroidInjector import de.rki.coronawarnapp.bugreporting.debuglog.DebugLogger -import de.rki.coronawarnapp.bugreporting.debuglog.export.SAFLogExport import de.rki.coronawarnapp.bugreporting.debuglog.internal.LogSnapshotter import de.rki.coronawarnapp.bugreporting.debuglog.ui.DebugLogFragment import de.rki.coronawarnapp.bugreporting.debuglog.ui.DebugLogViewModel @@ -36,8 +34,6 @@ class DebugLogFragmentTest : BaseUITest() { @MockK lateinit var enfClient: ENFClient @MockK lateinit var bugReportingSettings: BugReportingSettings @MockK lateinit var logSnapshotter: LogSnapshotter - @MockK lateinit var safLogExport: SAFLogExport - @MockK lateinit var contentResolver: ContentResolver private lateinit var inactiveViewModel: DebugLogViewModel private lateinit var activeViewModel: DebugLogViewModel @@ -103,9 +99,7 @@ class DebugLogFragmentTest : BaseUITest() { TestDispatcherProvider(), enfClient, bugReportingSettings, - logSnapshotter, - safLogExport, - contentResolver + logSnapshotter ) ) with(vm) { diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/bugreporting/debuglog/export/SAFLogExport.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/bugreporting/debuglog/export/SAFLogExport.kt deleted file mode 100644 index 12d91f7ef912e45f33766f9838c2a8499e784c01..0000000000000000000000000000000000000000 --- a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/bugreporting/debuglog/export/SAFLogExport.kt +++ /dev/null @@ -1,62 +0,0 @@ -package de.rki.coronawarnapp.bugreporting.debuglog.export - -import android.content.ContentResolver -import android.content.Intent -import android.net.Uri -import de.rki.coronawarnapp.bugreporting.debuglog.internal.LogSnapshotter -import de.rki.coronawarnapp.util.files.determineMimeType -import okio.buffer -import okio.sink -import okio.source -import timber.log.Timber -import javax.inject.Inject -import javax.inject.Singleton - -@Singleton -class SAFLogExport @Inject constructor() { - private var lastId = 1 - private val requestMap = mutableMapOf<Int, Request>() - - fun createSAFRequest(snapshot: LogSnapshotter.Snapshot): Request { - val request = Request( - id = ++lastId, - snapshot = snapshot - ) - requestMap[request.id] = request - return request - } - - fun getRequest(id: Int): Request? = requestMap[id] - - data class Request( - val id: Int, - val snapshot: LogSnapshotter.Snapshot, - ) { - fun createIntent() = Intent(Intent.ACTION_CREATE_DOCUMENT).apply { - addCategory(Intent.CATEGORY_OPENABLE) - type = snapshot.path.determineMimeType() - putExtra(Intent.EXTRA_TITLE, snapshot.path.name) - } - - fun storeSnapshot(resolver: ContentResolver, uri: Uri): Result { - Timber.tag(TAG).d("Writing to %s", uri) - resolver.openOutputStream(uri)!!.sink().buffer().use { dest -> - snapshot.path.source().buffer().use { source -> - dest.writeAll(source) - } - } - Timber.tag(TAG).i("%s was written to %s", snapshot, uri) - - snapshot.delete().also { - Timber.tag(TAG).d("Snapshot deleted: %s", snapshot) - } - return Result(uri) - } - - data class Result(val storageUri: Uri) - } - - companion object { - private const val TAG = "SAFLogSharing" - } -} diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/bugreporting/debuglog/ui/DebugLogFragment.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/bugreporting/debuglog/ui/DebugLogFragment.kt index 0adf631f1500b23fb6dd6510eead37f5d0ff9544..7c2913791e8582c7ec1881d6e4f38f863f2c46e5 100644 --- a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/bugreporting/debuglog/ui/DebugLogFragment.kt +++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/bugreporting/debuglog/ui/DebugLogFragment.kt @@ -1,6 +1,5 @@ package de.rki.coronawarnapp.bugreporting.debuglog.ui -import android.app.Activity import android.content.Intent import android.os.Bundle import android.provider.Settings @@ -12,11 +11,12 @@ import androidx.core.widget.NestedScrollView import androidx.fragment.app.Fragment import com.google.android.material.dialog.MaterialAlertDialogBuilder import de.rki.coronawarnapp.R +import de.rki.coronawarnapp.bugreporting.debuglog.internal.LogSnapshotter import de.rki.coronawarnapp.databinding.BugreportingDebuglogFragmentBinding import de.rki.coronawarnapp.util.ContextExtensions.getDrawableCompat import de.rki.coronawarnapp.util.di.AutoInject +import de.rki.coronawarnapp.util.files.FileSharing import de.rki.coronawarnapp.util.setUrl -import de.rki.coronawarnapp.util.tryHumanReadableError import de.rki.coronawarnapp.util.ui.doNavigate import de.rki.coronawarnapp.util.ui.observe2 import de.rki.coronawarnapp.util.ui.popBackStack @@ -26,12 +26,13 @@ import de.rki.coronawarnapp.util.viewmodel.CWAViewModelFactoryProvider import de.rki.coronawarnapp.util.viewmodel.cwaViewModels import org.joda.time.Duration import org.joda.time.Instant -import timber.log.Timber import javax.inject.Inject class DebugLogFragment : Fragment(R.layout.bugreporting_debuglog_fragment), AutoInject { @Inject lateinit var viewModelFactory: CWAViewModelFactoryProvider.Factory + @Inject lateinit var fileSharing: FileSharing + private val vm: DebugLogViewModel by cwaViewModels { viewModelFactory } private val binding: BugreportingDebuglogFragmentBinding by viewBindingLazy() @@ -91,13 +92,13 @@ class DebugLogFragment : Fragment(R.layout.bugreporting_debuglog_fragment), Auto toggleSendErrorLog.apply { isGone = !it.isRecording isEnabled = it.currentSize > 0L && !it.isActionInProgress - setOnClickListener { vm.onShareButtonPress() } + setOnClickListener { vm.onSendErrorLogPress() } } - toggleStoreLog.apply { + toggleExportLog.apply { isGone = !it.isRecording isEnabled = it.currentSize > 0L && !it.isActionInProgress - setOnClickListener { vm.onStoreLog() } + setOnClickListener { vm.onExportLogPress() } } } } @@ -128,14 +129,8 @@ class DebugLogFragment : Fragment(R.layout.bugreporting_debuglog_fragment), Auto DebugLogViewModel.Event.ShowLowStorageDialog -> { showLowStorageError() } - is DebugLogViewModel.Event.LocalExport -> { - startActivityForResult(it.request.createIntent(), it.request.id) - } - is DebugLogViewModel.Event.ExportResult -> { - showExportResult() - } - is DebugLogViewModel.Event.ShowLocalExportError -> { - showLocalExportError(it.error) + is DebugLogViewModel.Event.Export -> { + exportLog(it.snapshot) } } } @@ -164,14 +159,6 @@ class DebugLogFragment : Fragment(R.layout.bugreporting_debuglog_fragment), Auto binding.debugLogHistoryContainer.setOnClickListener { vm.onIdHistoryPress() } } - override fun onActivityResult(requestCode: Int, resultCode: Int, resultData: Intent?) { - Timber.d("onActivityResult(requestCode=$requestCode, resultCode=$resultCode, resultData=$resultData") - vm.processSAFResult( - requestCode, - if (resultCode == Activity.RESULT_OK) resultData?.data else null - ) - } - private fun showLogDeletionRequest() { MaterialAlertDialogBuilder(requireContext()).apply { setTitle(R.string.debugging_debuglog_stop_confirmation_title) @@ -198,29 +185,10 @@ class DebugLogFragment : Fragment(R.layout.bugreporting_debuglog_fragment), Auto }.show() } - private fun showExportResult() { - MaterialAlertDialogBuilder(requireContext()).apply { - setTitle(R.string.debugging_debuglog_localexport_title) - setMessage(R.string.debugging_debuglog_localexport_message) - setPositiveButton(android.R.string.yes) { _, _ -> /* dismiss */ } - }.show() - } - - private fun showLocalExportError(cause: Throwable) { - MaterialAlertDialogBuilder(requireContext()).apply { - setTitle(R.string.errors_generic_headline_short) - setMessage( - getString(R.string.debugging_debuglog_localexport_error_message) + "\n(" + - cause.tryHumanReadableError(requireContext()).description + ")" - ) - setPositiveButton(android.R.string.yes) { _, _ -> /* dismiss */ } - setNeutralButton(R.string.menu_settings) { _, _ -> - try { - startActivity(Intent(Settings.ACTION_INTERNAL_STORAGE_SETTINGS)) - } catch (e: Exception) { - Toast.makeText(requireContext(), e.toString(), Toast.LENGTH_LONG).show() - } - } - }.show() + private fun exportLog(snapshot: LogSnapshotter.Snapshot) { + val intent = fileSharing + .getFileIntentProvider(snapshot.path, snapshot.path.name, createChooserIntent = true) + .intent(requireActivity()) + startActivity(intent) } } diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/bugreporting/debuglog/ui/DebugLogViewModel.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/bugreporting/debuglog/ui/DebugLogViewModel.kt index d9793e597bc6606b636e4d87e4eed7be0b0578fe..8e83edfe1e15eb7df71f2fc32159a3897bc1fe43 100644 --- a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/bugreporting/debuglog/ui/DebugLogViewModel.kt +++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/bugreporting/debuglog/ui/DebugLogViewModel.kt @@ -1,14 +1,11 @@ package de.rki.coronawarnapp.bugreporting.debuglog.ui -import android.content.ContentResolver -import android.net.Uri import androidx.lifecycle.LiveData import androidx.lifecycle.asLiveData import dagger.assisted.AssistedFactory import dagger.assisted.AssistedInject import de.rki.coronawarnapp.bugreporting.BugReportingSettings import de.rki.coronawarnapp.bugreporting.debuglog.DebugLogger -import de.rki.coronawarnapp.bugreporting.debuglog.export.SAFLogExport import de.rki.coronawarnapp.bugreporting.debuglog.internal.LogSnapshotter import de.rki.coronawarnapp.nearby.ENFClient import de.rki.coronawarnapp.util.CWADebug @@ -20,16 +17,13 @@ import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.combine import timber.log.Timber -import java.io.IOException class DebugLogViewModel @AssistedInject constructor( private val debugLogger: DebugLogger, dispatcherProvider: DispatcherProvider, private val enfClient: ENFClient, bugReportingSettings: BugReportingSettings, - private val logSnapshotter: LogSnapshotter, - private val safLogExport: SAFLogExport, - private val contentResolver: ContentResolver, + private val logSnapshotter: LogSnapshotter ) : CWAViewModel(dispatcherProvider = dispatcherProvider) { private val isActionInProgress = MutableStateFlow(false) @@ -55,7 +49,7 @@ class DebugLogViewModel @AssistedInject constructor( events.postValue(Event.NavigateToPrivacyFragment) } - fun onShareButtonPress() { + fun onSendErrorLogPress() { events.postValue(Event.NavigateToUploadFragment) } @@ -93,33 +87,10 @@ class DebugLogViewModel @AssistedInject constructor( } } - fun onStoreLog() = launchWithProgress(finishProgressAction = false) { - Timber.d("storeLog()") + fun onExportLogPress() = launchWithProgress(finishProgressAction = true) { + Timber.d("onExportLogPress()") val snapshot = logSnapshotter.snapshot() - val shareRequest = safLogExport.createSAFRequest(snapshot) - events.postValue(Event.LocalExport(shareRequest)) - } - - fun processSAFResult(requestCode: Int, safPath: Uri?) = launchWithProgress { - if (safPath == null) { - Timber.i("No SAF path available.") - return@launchWithProgress - } - - val request = safLogExport.getRequest(requestCode) - if (request == null) { - Timber.w("Unknown request with code $requestCode") - return@launchWithProgress - } - - try { - val storageResult = request.storeSnapshot(contentResolver, safPath) - Timber.i("Log stored %s", storageResult) - events.postValue(Event.ExportResult(storageResult)) - } catch (e: IOException) { - Timber.e(e, "Failed to store log file.") - events.postValue(Event.ShowLocalExportError(e)) - } + events.postValue(Event.Export(snapshot)) } private fun launchWithProgress( @@ -156,10 +127,8 @@ class DebugLogViewModel @AssistedInject constructor( object NavigateToUploadHistory : Event() object ShowLogDeletionRequest : Event() object ShowLowStorageDialog : Event() - data class ShowLocalExportError(val error: Throwable) : Event() data class Error(val error: Throwable) : Event() - data class LocalExport(val request: SAFLogExport.Request) : Event() - data class ExportResult(val result: SAFLogExport.Request.Result) : Event() + data class Export(val snapshot: LogSnapshotter.Snapshot) : Event() } @AssistedFactory diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/util/files/FileSharing.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/util/files/FileSharing.kt index 488c8a12f3a23a44cb9f8a7ad51cfb762d7f346b..632ee2a10ee5a78d3422a9024494d5c847038c50 100644 --- a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/util/files/FileSharing.kt +++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/util/files/FileSharing.kt @@ -4,7 +4,6 @@ import android.app.Activity import android.content.Context import android.content.Intent import android.net.Uri -import androidx.annotation.StringRes import androidx.core.app.ShareCompat import androidx.core.content.FileProvider import dagger.Reusable @@ -25,45 +24,19 @@ class FileSharing @Inject constructor( path ) - fun getIntentProvider( - path: File, - title: String, - @StringRes chooserTitle: Int? = null - ): ShareIntentProvider = object : ShareIntentProvider { - override fun get(activity: Activity): Intent { - val builder = ShareCompat.IntentBuilder.from(activity).apply { - setType(path.determineMimeType()) - setStream(getFileUri(path)) - setSubject(title) - chooserTitle?.let { setChooserTitle(it) } - } - - val intent = if (chooserTitle != null) { - builder.createChooserIntent() - } else { - builder.intent - } - return intent.apply { - addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION) - Timber.tag(TAG).d("Intent created %s", this) - } - } - } - fun getFileIntentProvider( path: File, title: String, - @StringRes chooserTitle: Int? = null + createChooserIntent: Boolean = false ): FileIntentProvider = object : FileIntentProvider { override fun intent(activity: Activity): Intent { val builder = ShareCompat.IntentBuilder.from(activity).apply { setType(path.determineMimeType()) setStream(getFileUri(path)) setSubject(title) - chooserTitle?.let { setChooserTitle(it) } } - val intent = if (chooserTitle != null) { + val intent = if (createChooserIntent) { builder.createChooserIntent() } else { builder.intent diff --git a/Corona-Warn-App/src/main/res/layout/bugreporting_debuglog_fragment.xml b/Corona-Warn-App/src/main/res/layout/bugreporting_debuglog_fragment.xml index 2277fe672d8fe4b98a599c31289f0bed4ad0c11e..1a236c4b811a56108ddc2af3207966dbaaf3bcec 100644 --- a/Corona-Warn-App/src/main/res/layout/bugreporting_debuglog_fragment.xml +++ b/Corona-Warn-App/src/main/res/layout/bugreporting_debuglog_fragment.xml @@ -174,13 +174,13 @@ tools:text="@string/debugging_debuglog_action_share_log" /> <Button - android:id="@+id/toggle_store_log" + android:id="@+id/toggle_export_log" style="@style/buttonPrimary" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginBottom="8dp" - android:text="@string/debugging_debuglog_action_local_log_store" - tools:text="@string/debugging_debuglog_action_local_log_store" /> + android:text="@string/debugging_debuglog_action_local_log_export" + tools:text="@string/debugging_debuglog_action_local_log_export" /> <Button android:id="@+id/toggle_recording" diff --git a/Corona-Warn-App/src/main/res/values-bg/strings.xml b/Corona-Warn-App/src/main/res/values-bg/strings.xml index 3b78ec9880e3753956cb89e11d5bc8bcd4960ee7..253d3c980162babfee16722e8c5de23abe828653 100644 --- a/Corona-Warn-App/src/main/res/values-bg/strings.xml +++ b/Corona-Warn-App/src/main/res/values-bg/strings.xml @@ -852,10 +852,10 @@ <string name="debugging_debuglog_action_start_recording">"Ðачало"</string> <!-- XBUT: Button text to stop the log recording --> <string name="debugging_debuglog_action_stop_recording">"Спиране и изтриване"</string> - <!-- XBUT: Button text to share the log recording --> + <!-- XBUT: Button text to send the log recording to the server --> <string name="debugging_debuglog_action_share_log">"Изпращане на отчет за грешки"</string> - <!-- XBUT: Button text to locally store the log recording --> - <string name="debugging_debuglog_action_local_log_store">"Локално запазване и продължаване"</string> + <!-- XBUT: Button text to export the log --> + <string name="debugging_debuglog_action_local_log_export">"Локално запазване и продължаване"</string> <!-- YTXT: Status text if a debug log is being recorded --> <string name="debugging_debuglog_status_recording">"ЗапиÑването е активно"</string> <!-- YTXT: Status text if a debug log is being recorded but there is not enough free storage space --> @@ -882,12 +882,6 @@ <string name="debugging_debuglog_stop_confirmation_discard_button">"Продължаване на анализа"</string> <!-- YTXT: Dialog message if there is not enough free storage to start a debug log --> <string name="debugging_debuglog_start_low_storage_error">"Ðеобходими Ñа поне 200 MB памет, за да Ñе Ñтартира анализа на грешките. МолÑ, оÑвободете мÑÑто."</string> - <!-- XHED: Dialog title if a user has stored a debug log locally --> - <string name="debugging_debuglog_localexport_title">"Запазено локално"</string> - <!-- YTXT: Dialog message if a user has stored a debug log locally --> - <string name="debugging_debuglog_localexport_message">"Ðнализът на грешките е запазен локално."</string> - <!-- YTXT: Dialog message if local export has failed --> - <string name="debugging_debuglog_localexport_error_message">"Отчетът за грешките не беше запазен. МолÑ, проверете дали има доÑтатъчно Ñвободна памет."</string> <!-- XHED: Title for debug legal screen --> <string name="debugging_debuglog_legal_dialog_title">"Подробна Ð¸Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ð¾Ñ‚Ð½Ð¾Ñно изпращането на отчети за грешки"</string> <!-- YTXT: Section Title for debug legal screen --> diff --git a/Corona-Warn-App/src/main/res/values-de/strings.xml b/Corona-Warn-App/src/main/res/values-de/strings.xml index c18d91172304704774f9953b876dd814312fb630..6d3f3cf7cb1483798811bf17b2611f4a53d014fc 100644 --- a/Corona-Warn-App/src/main/res/values-de/strings.xml +++ b/Corona-Warn-App/src/main/res/values-de/strings.xml @@ -862,10 +862,10 @@ <string name="debugging_debuglog_action_start_recording">"Starten"</string> <!-- XBUT: Button text to stop the log recording --> <string name="debugging_debuglog_action_stop_recording">"Stoppen und löschen"</string> - <!-- XBUT: Button text to share the log recording --> + <!-- XBUT: Button text to send the log recording to the server--> <string name="debugging_debuglog_action_share_log">"Fehlerbericht senden"</string> - <!-- XBUT: Button text to locally store the log recording --> - <string name="debugging_debuglog_action_local_log_store">"Lokal speichern und fortsetzen"</string> + <!-- XBUT: Button text to export the log --> + <string name="debugging_debuglog_action_local_log_export">"Teilen und fortsetzen"</string> <!-- YTXT: Status text if a debug log is being recorded --> <string name="debugging_debuglog_status_recording">"Aufzeichnung läuft"</string> <!-- YTXT: Status text if a debug log is being recorded but there is not enough free storage space --> @@ -892,12 +892,7 @@ <string name="debugging_debuglog_stop_confirmation_discard_button">"Analyse fortführen"</string> <!-- YTXT: Dialog message if there is not enough free storage to start a debug log --> <string name="debugging_debuglog_start_low_storage_error">"Sie brauchen mindestens 200 MB Speicherplatz, um die Fehleranalyse zu starten. Bitte geben Sie Speicherplatz frei."</string> - <!-- XHED: Dialog title if a user has stored a debug log locally --> - <string name="debugging_debuglog_localexport_title">"Lokal gespeichert"</string> - <!-- YTXT: Dialog message if a user has stored a debug log locally --> - <string name="debugging_debuglog_localexport_message">"Die Fehleranalyse wurde lokal gespeichert."</string> - <!-- YTXT: Dialog message if local export has failed --> - <string name="debugging_debuglog_localexport_error_message">"Das Speichern des Fehlerberichts ist fehlgeschlagen. Bitte überprüfen Sie, ob genügend Speicherplatz zur Verfügung steht."</string> + <!-- XHED: Title for debug legal screen --> <string name="debugging_debuglog_legal_dialog_title">"Ausführliche Informationen zur Übersendung der Fehlerberichte"</string> <!-- YTXT: Section Title for debug legal screen --> diff --git a/Corona-Warn-App/src/main/res/values-en/strings.xml b/Corona-Warn-App/src/main/res/values-en/strings.xml index 26cc64fa9ff54a2200edb956e0e9bc0becf8b91f..44a5711432d50f970e86fe224b85f3d05dda7e09 100644 --- a/Corona-Warn-App/src/main/res/values-en/strings.xml +++ b/Corona-Warn-App/src/main/res/values-en/strings.xml @@ -852,10 +852,10 @@ <string name="debugging_debuglog_action_start_recording">"Start"</string> <!-- XBUT: Button text to stop the log recording --> <string name="debugging_debuglog_action_stop_recording">"Stop and Delete"</string> - <!-- XBUT: Button text to share the log recording --> + <!-- XBUT: Button text to send the log recording to the server --> <string name="debugging_debuglog_action_share_log">"Send Error Report"</string> - <!-- XBUT: Button text to locally store the log recording --> - <string name="debugging_debuglog_action_local_log_store">"Save Locally and Continue"</string> + <!-- XBUT: Button text to export the log --> + <string name="debugging_debuglog_action_local_log_export">"Save Locally and Continue"</string> <!-- YTXT: Status text if a debug log is being recorded --> <string name="debugging_debuglog_status_recording">"Recording Active"</string> <!-- YTXT: Status text if a debug log is being recorded but there is not enough free storage space --> @@ -882,12 +882,6 @@ <string name="debugging_debuglog_stop_confirmation_discard_button">"Continue Analysis"</string> <!-- YTXT: Dialog message if there is not enough free storage to start a debug log --> <string name="debugging_debuglog_start_low_storage_error">"You need at least 200 MB of memory to start the error analysis. Please free up memory."</string> - <!-- XHED: Dialog title if a user has stored a debug log locally --> - <string name="debugging_debuglog_localexport_title">"Saved Locally"</string> - <!-- YTXT: Dialog message if a user has stored a debug log locally --> - <string name="debugging_debuglog_localexport_message">"The error analysis was saved locally."</string> - <!-- YTXT: Dialog message if local export has failed --> - <string name="debugging_debuglog_localexport_error_message">"The attempt to save the error report failed. Please check whether enough memory is available."</string> <!-- XHED: Title for debug legal screen --> <string name="debugging_debuglog_legal_dialog_title">"Detailed Information on Sending Error Reports"</string> <!-- YTXT: Section Title for debug legal screen --> diff --git a/Corona-Warn-App/src/main/res/values-pl/strings.xml b/Corona-Warn-App/src/main/res/values-pl/strings.xml index f5836ab498ff0a42066e643ae89b6b57a0347c1c..4cb9b8034544e2456c812cd427eb253f85e9620b 100644 --- a/Corona-Warn-App/src/main/res/values-pl/strings.xml +++ b/Corona-Warn-App/src/main/res/values-pl/strings.xml @@ -852,10 +852,10 @@ <string name="debugging_debuglog_action_start_recording">"Uruchom"</string> <!-- XBUT: Button text to stop the log recording --> <string name="debugging_debuglog_action_stop_recording">"Zatrzymaj i usuÅ„"</string> - <!-- XBUT: Button text to share the log recording --> + <!-- XBUT: Button text to send the log recording to the server --> <string name="debugging_debuglog_action_share_log">"WyÅ›lij raport o błędzie"</string> - <!-- XBUT: Button text to locally store the log recording --> - <string name="debugging_debuglog_action_local_log_store">"Zapisz lokalnie i kontynuuj"</string> + <!-- XBUT: Button text to export the log --> + <string name="debugging_debuglog_action_local_log_export">"Zapisz lokalnie i kontynuuj"</string> <!-- YTXT: Status text if a debug log is being recorded --> <string name="debugging_debuglog_status_recording">"Nagrywanie aktywne"</string> <!-- YTXT: Status text if a debug log is being recorded but there is not enough free storage space --> @@ -882,12 +882,6 @@ <string name="debugging_debuglog_stop_confirmation_discard_button">"Kontynuuj analizÄ™"</string> <!-- YTXT: Dialog message if there is not enough free storage to start a debug log --> <string name="debugging_debuglog_start_low_storage_error">"Aby rozpocząć analizÄ™ błędu, potrzebujesz co najmniej 200 MB pamiÄ™ci. Zwolnij pamięć."</string> - <!-- XHED: Dialog title if a user has stored a debug log locally --> - <string name="debugging_debuglog_localexport_title">"Zapisano lokalnie"</string> - <!-- YTXT: Dialog message if a user has stored a debug log locally --> - <string name="debugging_debuglog_localexport_message">"Analiza błędu zostaÅ‚a zapisana lokalnie."</string> - <!-- YTXT: Dialog message if local export has failed --> - <string name="debugging_debuglog_localexport_error_message">"Próba zapisania raportu o błędzie nie powiodÅ‚a siÄ™. Sprawdź, czy dostÄ™pna jest wystarczajÄ…ca ilość pamiÄ™ci."</string> <!-- XHED: Title for debug legal screen --> <string name="debugging_debuglog_legal_dialog_title">"Szczegółowe informacje na temat wysyÅ‚ania raportów o błędach"</string> <!-- YTXT: Section Title for debug legal screen --> diff --git a/Corona-Warn-App/src/main/res/values-ro/strings.xml b/Corona-Warn-App/src/main/res/values-ro/strings.xml index 26877ff0620859f82c66a73889f988fa8d9c8b2d..35eca689be1b506a278f743374789d39f8a9fd77 100644 --- a/Corona-Warn-App/src/main/res/values-ro/strings.xml +++ b/Corona-Warn-App/src/main/res/values-ro/strings.xml @@ -852,10 +852,10 @@ <string name="debugging_debuglog_action_start_recording">"Pornire"</string> <!-- XBUT: Button text to stop the log recording --> <string name="debugging_debuglog_action_stop_recording">"Oprire È™i È™tergere"</string> - <!-- XBUT: Button text to share the log recording --> + <!-- XBUT: Button text to send the log recording to the server --> <string name="debugging_debuglog_action_share_log">"Trimitere raport de erori"</string> - <!-- XBUT: Button text to locally store the log recording --> - <string name="debugging_debuglog_action_local_log_store">"Salvare locală È™i continuare"</string> + <!-- XBUT: Button text to export the log --> + <string name="debugging_debuglog_action_local_log_export">"Salvare locală È™i continuare"</string> <!-- YTXT: Status text if a debug log is being recorded --> <string name="debugging_debuglog_status_recording">"ÃŽnregistrare activă"</string> <!-- YTXT: Status text if a debug log is being recorded but there is not enough free storage space --> @@ -882,12 +882,6 @@ <string name="debugging_debuglog_stop_confirmation_discard_button">"Continuare analiză"</string> <!-- YTXT: Dialog message if there is not enough free storage to start a debug log --> <string name="debugging_debuglog_start_low_storage_error">"AveÈ›i nevoie de cel puÈ›in 200 MB de memorie pentru a începe analiza erorilor. EliberaÈ›i memorie."</string> - <!-- XHED: Dialog title if a user has stored a debug log locally --> - <string name="debugging_debuglog_localexport_title">"Salvat local"</string> - <!-- YTXT: Dialog message if a user has stored a debug log locally --> - <string name="debugging_debuglog_localexport_message">"Analiza erorilor a fost salvată local."</string> - <!-- YTXT: Dialog message if local export has failed --> - <string name="debugging_debuglog_localexport_error_message">"ÃŽncercarea de a salva un raport de erori a eÈ™uat. VerificaÈ›i dacă este disponibilă suficientă memorie."</string> <!-- XHED: Title for debug legal screen --> <string name="debugging_debuglog_legal_dialog_title">"InformaÈ›ii detaliate despre trimiterea rapoartelor de erori"</string> <!-- YTXT: Section Title for debug legal screen --> diff --git a/Corona-Warn-App/src/main/res/values-tr/strings.xml b/Corona-Warn-App/src/main/res/values-tr/strings.xml index 523c06ce04769693a14319f31900212b0cb8b1c6..34cf7ca499e4fa1ec7a56887b7603f955219d98c 100644 --- a/Corona-Warn-App/src/main/res/values-tr/strings.xml +++ b/Corona-Warn-App/src/main/res/values-tr/strings.xml @@ -852,10 +852,10 @@ <string name="debugging_debuglog_action_start_recording">"BaÅŸlat"</string> <!-- XBUT: Button text to stop the log recording --> <string name="debugging_debuglog_action_stop_recording">"Durdur ve Sil"</string> - <!-- XBUT: Button text to share the log recording --> + <!-- XBUT: Button text to send the log recording to the server --> <string name="debugging_debuglog_action_share_log">"Hata Raporu Gönder"</string> - <!-- XBUT: Button text to locally store the log recording --> - <string name="debugging_debuglog_action_local_log_store">"Yerel Olarak Kaydet ve Devam Et"</string> + <!-- XBUT: Button text to export the log --> + <string name="debugging_debuglog_action_local_log_export">"Yerel Olarak Kaydet ve Devam Et"</string> <!-- YTXT: Status text if a debug log is being recorded --> <string name="debugging_debuglog_status_recording">"Kayıt Etkin"</string> <!-- YTXT: Status text if a debug log is being recorded but there is not enough free storage space --> @@ -882,12 +882,6 @@ <string name="debugging_debuglog_stop_confirmation_discard_button">"Analizi Devam Ettir"</string> <!-- YTXT: Dialog message if there is not enough free storage to start a debug log --> <string name="debugging_debuglog_start_low_storage_error">"Hata analizini baÅŸlatmak için en az 200 MB bellek alanınızın olması gerekir. Lütfen belleÄŸi boÅŸaltın."</string> - <!-- XHED: Dialog title if a user has stored a debug log locally --> - <string name="debugging_debuglog_localexport_title">"Yerel Olarak Kaydedildi"</string> - <!-- YTXT: Dialog message if a user has stored a debug log locally --> - <string name="debugging_debuglog_localexport_message">"Hata analizi yerel olarak kaydedilmiÅŸtir."</string> - <!-- YTXT: Dialog message if local export has failed --> - <string name="debugging_debuglog_localexport_error_message">"Hata raporunu kaydetme denemesi baÅŸarısız oldu. Lütfen yeterli bellek alanı olup olmadığını kontrol edin."</string> <!-- XHED: Title for debug legal screen --> <string name="debugging_debuglog_legal_dialog_title">"Hata Raporlarını Gönderme Konusunda Ayrıntılı Bilgi"</string> <!-- YTXT: Section Title for debug legal screen --> diff --git a/Corona-Warn-App/src/main/res/values/strings.xml b/Corona-Warn-App/src/main/res/values/strings.xml index 2dcf9f6df2e4985bf0e7b4a3c6472a5423051205..25a9ac057c69fc7ac41a07be1f4ee2852c4b2e09 100644 --- a/Corona-Warn-App/src/main/res/values/strings.xml +++ b/Corona-Warn-App/src/main/res/values/strings.xml @@ -879,10 +879,10 @@ <string name="debugging_debuglog_action_start_recording">"Start"</string> <!-- XBUT: Button text to stop the log recording --> <string name="debugging_debuglog_action_stop_recording">"Stop and Delete"</string> - <!-- XBUT: Button text to share the log recording --> + <!-- XBUT: Button text to send the log recording to the server --> <string name="debugging_debuglog_action_share_log">"Send Error Report"</string> - <!-- XBUT: Button text to locally store the log recording --> - <string name="debugging_debuglog_action_local_log_store">"Save Locally and Continue"</string> + <!-- XBUT: Button text to export the log --> + <string name="debugging_debuglog_action_local_log_export">"Save Locally and Continue"</string> <!-- YTXT: Status text if a debug log is being recorded --> <string name="debugging_debuglog_status_recording">"Recording Active"</string> <!-- YTXT: Status text if a debug log is being recorded but there is not enough free storage space --> @@ -909,12 +909,6 @@ <string name="debugging_debuglog_stop_confirmation_discard_button">"Continue Analysis"</string> <!-- YTXT: Dialog message if there is not enough free storage to start a debug log --> <string name="debugging_debuglog_start_low_storage_error">"You need at least 200 MB of memory to start the error analysis. Please free up memory."</string> - <!-- XHED: Dialog title if a user has stored a debug log locally --> - <string name="debugging_debuglog_localexport_title">"Saved Locally"</string> - <!-- YTXT: Dialog message if a user has stored a debug log locally --> - <string name="debugging_debuglog_localexport_message">"The error analysis was saved locally."</string> - <!-- YTXT: Dialog message if local export has failed --> - <string name="debugging_debuglog_localexport_error_message">"The attempt to save the error report failed. Please check whether enough memory is available."</string> <!-- XHED: Title for debug legal screen --> <string name="debugging_debuglog_legal_dialog_title">"Detailed Information on Sending Error Reports"</string> <!-- YTXT: Section Title for debug legal screen --> diff --git a/Corona-Warn-App/src/main/res/xml/provider_paths.xml b/Corona-Warn-App/src/main/res/xml/provider_paths.xml index 823eb81820e952965917ed99e4ae20099ae4dcca..6f39652a1a858094640a0f29cabff71580717260 100644 --- a/Corona-Warn-App/src/main/res/xml/provider_paths.xml +++ b/Corona-Warn-App/src/main/res/xml/provider_paths.xml @@ -5,7 +5,7 @@ path="share/" /> <cache-path name="shared_logs" - path="debuglog/shared/" /> + path="debuglog_snapshots/" /> <cache-path name="Poster" diff --git a/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/bugreporting/debuglog/export/SAFLogExportTest.kt b/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/bugreporting/debuglog/export/SAFLogExportTest.kt deleted file mode 100644 index d7716d1931e92db753827a4b2983257ce7bcc9c7..0000000000000000000000000000000000000000 --- a/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/bugreporting/debuglog/export/SAFLogExportTest.kt +++ /dev/null @@ -1,72 +0,0 @@ -package de.rki.coronawarnapp.bugreporting.debuglog.export - -import android.content.ContentResolver -import de.rki.coronawarnapp.bugreporting.debuglog.internal.LogSnapshotter -import io.kotest.matchers.shouldBe -import io.kotest.matchers.shouldNotBe -import io.mockk.MockKAnnotations -import io.mockk.every -import io.mockk.impl.annotations.MockK -import io.mockk.mockk -import org.junit.jupiter.api.AfterEach -import org.junit.jupiter.api.BeforeEach -import org.junit.jupiter.api.Test -import testhelpers.BaseIOTest -import timber.log.Timber -import java.io.File - -class SAFLogExportTest : BaseIOTest() { - - @MockK lateinit var contentResolver: ContentResolver - - private val testDir = File(IO_TEST_BASEDIR, this::class.simpleName!!) - private val zipFile = File(testDir, "logfile.zip") - private val uriFakeFile = File(testDir, "urifakefile") - - @BeforeEach - fun setup() { - MockKAnnotations.init(this) - - testDir.mkdirs() - testDir.exists() shouldBe true - - every { contentResolver.openOutputStream(any()) } answers { - uriFakeFile.outputStream() - } - } - - @AfterEach - fun teardown() { - testDir.deleteRecursively() - Timber.uprootAll() - } - - private fun createInstance() = SAFLogExport() - - @Test - fun `request creation and write`() { - val instance = createInstance() - - zipFile.createNewFile() - zipFile.exists() shouldBe true - zipFile.writeText("testcontent") - - val snapshot = LogSnapshotter.Snapshot(zipFile) - val request = instance.createSAFRequest(snapshot) - request.snapshot shouldBe snapshot - - request.storeSnapshot(contentResolver, mockk()) - zipFile.exists() shouldBe false - uriFakeFile.readText() shouldBe "testcontent" - } - - @Test - fun `new requests increase id`() { - val instance = createInstance() - instance.createSAFRequest(mockk()).id shouldBe 2 - instance.getRequest(2) shouldNotBe null - instance.createSAFRequest(mockk()).id shouldBe 3 - instance.getRequest(3) shouldNotBe null - instance.getRequest(4) shouldBe null - } -}