55
66package org.schabi.newpipe.ui.screens
77
8+ import android.content.Context
89import android.content.res.Configuration
10+ import android.os.Build
911import androidx.compose.foundation.horizontalScroll
1012import androidx.compose.foundation.layout.Column
1113import androidx.compose.foundation.layout.Row
@@ -21,32 +23,62 @@ import androidx.compose.material3.Icon
2123import androidx.compose.material3.IconButton
2224import androidx.compose.material3.MaterialTheme
2325import androidx.compose.material3.OutlinedTextField
24- import androidx.compose.material3.Surface
2526import androidx.compose.material3.Text
2627import androidx.compose.runtime.Composable
2728import androidx.compose.runtime.getValue
2829import androidx.compose.runtime.mutableStateOf
2930import androidx.compose.runtime.saveable.rememberSaveable
3031import androidx.compose.runtime.setValue
3132import androidx.compose.ui.Modifier
33+ import androidx.compose.ui.platform.LocalContext
3234import androidx.compose.ui.res.painterResource
3335import androidx.compose.ui.res.stringResource
3436import androidx.compose.ui.text.font.FontFamily
3537import androidx.compose.ui.text.font.FontWeight
3638import androidx.compose.ui.text.style.TextAlign
3739import androidx.compose.ui.tooling.preview.Preview
3840import androidx.compose.ui.unit.dp
41+ import java.time.ZonedDateTime
42+ import java.time.format.DateTimeFormatter
43+ import org.schabi.newpipe.BuildConfig
3944import org.schabi.newpipe.R
45+ import org.schabi.newpipe.error.ErrorInfo
4046import org.schabi.newpipe.ui.components.common.PrivacyPolicyDialog
4147import org.schabi.newpipe.ui.components.common.ScaffoldWithToolbar
4248import org.schabi.newpipe.ui.theme.AppTheme
49+ import org.schabi.newpipe.util.Localization
4350
4451private const val ACTION_EMAIL = " EMAIL"
4552private const val ACTION_GITHUB = " GITHUB"
4653
4754@Composable
4855fun ErrorReportScreen (
49- sorryMessage : String ,
56+ errorInfo : ErrorInfo ,
57+ onBackClick : () -> Unit ,
58+ onReportViaEmail : (comment: String ) -> Unit ,
59+ onCopyForGitHub : (comment: String ) -> Unit ,
60+ onReportOnGitHub : () -> Unit ,
61+ onReadPrivacyPolicy : () -> Unit = {},
62+ onShareError : (comment: String ) -> Unit = {}
63+ ) {
64+ val context = LocalContext .current
65+
66+ ErrorReportContent (
67+ errorMessage = errorInfo.getMessage(context).toString(),
68+ infoLabels = stringResource(R .string.info_labels),
69+ infoValues = buildInfoString(context, errorInfo),
70+ errorDetails = formErrorText(errorInfo.stackTraces),
71+ onBackClick = onBackClick,
72+ onReportViaEmail = onReportViaEmail,
73+ onCopyForGitHub = onCopyForGitHub,
74+ onReportOnGitHub = onReportOnGitHub,
75+ onReadPrivacyPolicy = onReadPrivacyPolicy,
76+ onShareError = onShareError
77+ )
78+ }
79+
80+ @Composable
81+ private fun ErrorReportContent (
5082 errorMessage : String ,
5183 infoLabels : String ,
5284 infoValues : String ,
@@ -95,7 +127,7 @@ fun ErrorReportScreen(
95127 ) {
96128 // Sorry header
97129 Text (
98- text = sorryMessage ,
130+ text = stringResource( R .string.sorry_string) ,
99131 style = MaterialTheme .typography.titleLarge,
100132 fontWeight = FontWeight .Bold ,
101133 textAlign = TextAlign .Center ,
@@ -193,23 +225,46 @@ fun ErrorReportScreen(
193225 }
194226}
195227
196- @Preview(name = " Light mode" , uiMode = Configuration .UI_MODE_NIGHT_NO )
197- @Preview(name = " Dark mode" , uiMode = Configuration .UI_MODE_NIGHT_YES )
228+ private fun buildInfoString (context : Context , errorInfo : ErrorInfo ): String {
229+ val contentLanguage = Localization .getPreferredLocalization(context).localizationCode
230+ val contentCountry = Localization .getPreferredContentCountry(context).countryCode
231+ val appLanguage = Localization .getAppLocale().toString()
232+ val osName = System .getProperty(" os.name" )!!
233+ val osBase = Build .VERSION .BASE_OS .ifEmpty { " Android" }
234+ val osString = " $osName $osBase ${Build .VERSION .RELEASE } - ${Build .VERSION .SDK_INT } "
235+ val timestamp = ZonedDateTime .now().format(DateTimeFormatter .ISO_OFFSET_DATE_TIME )
236+
237+ return errorInfo.userAction.message + " \n " +
238+ errorInfo.request + " \n " +
239+ contentLanguage + " \n " +
240+ contentCountry + " \n " +
241+ appLanguage + " \n " +
242+ errorInfo.getServiceName() + " \n " +
243+ timestamp + " \n " +
244+ context.packageName + " \n " +
245+ BuildConfig .VERSION_NAME + " \n " +
246+ osString
247+ }
248+
249+ private fun formErrorText (stackTraces : Array <String >): String {
250+ val separator = " -------------------------------------"
251+ return stackTraces.joinToString(separator + " \n " , separator + " \n " , separator)
252+ }
253+
254+ @Preview(name = " Light mode" , uiMode = Configuration .UI_MODE_NIGHT_NO , showBackground = true )
255+ @Preview(name = " Dark mode" , uiMode = Configuration .UI_MODE_NIGHT_YES , showBackground = true )
198256@Composable
199257private fun ErrorReportScreenPreview () {
200258 AppTheme {
201- Surface (color = MaterialTheme .colorScheme.background) {
202- ErrorReportScreen (
203- sorryMessage = " Sorry, that should not have happened." ,
204- errorMessage = " Requested list not handled" ,
205- infoLabels = " What:\n Request:\n Content Language:\n Content Country:\n App Language:\n Service:\n Timestamp:\n Package:\n Version:\n OS version:" ,
206- infoValues = " Requested list\n none\n en\n US\n en_US\n YouTube\n 2026-04-17T12:00:00Z\n org.schabi.newpipe\n 0.27.5\n Android 14 - 34" ,
207- errorDetails = " java.lang.IllegalArgumentException: ...\n\t at org.schabi.newpipe.SomeClass.method(SomeClass.kt:42)" ,
208- onBackClick = {},
209- onReportViaEmail = {},
210- onCopyForGitHub = {},
211- onReportOnGitHub = {}
212- )
213- }
259+ ErrorReportContent (
260+ errorMessage = " Requested list not handled" ,
261+ infoLabels = " What:\n Request:\n Content Language:\n Content Country:\n App Language:\n Service:\n Timestamp:\n Package:\n Version:\n OS version:" ,
262+ infoValues = " Requested list\n none\n en\n US\n en_US\n YouTube\n 2026-04-17T12:00:00Z\n org.schabi.newpipe\n 0.27.5\n Android 14 - 34" ,
263+ errorDetails = " -------------------------------------\n java.lang.IllegalArgumentException: ...\n\t at org.schabi.newpipe.SomeClass.method(SomeClass.kt:42)\n -------------------------------------" ,
264+ onBackClick = {},
265+ onReportViaEmail = {},
266+ onCopyForGitHub = {},
267+ onReportOnGitHub = {}
268+ )
214269 }
215270}
0 commit comments