Merge pull request #357 from theScrabi/ref_crashreport

Refactore crashreport
This commit is contained in:
Christian Schabesberger 2016-09-14 00:05:37 +02:00 committed by GitHub
commit 39ff1cd898
34 changed files with 221 additions and 57 deletions

View File

@ -32,10 +32,10 @@ android {
dependencies {
testCompile 'junit:junit:4.12'
compile 'com.android.support:appcompat-v7:24.2.0'
compile 'com.android.support:support-v4:24.2.0'
compile 'com.android.support:design:24.2.0'
compile 'com.android.support:recyclerview-v7:24.2.0'
compile 'com.android.support:appcompat-v7:24.2.1'
compile 'com.android.support:support-v4:24.2.1'
compile 'com.android.support:design:24.2.1'
compile 'com.android.support:recyclerview-v7:24.2.1'
compile 'org.jsoup:jsoup:1.8.3'
compile 'org.mozilla:rhino:1.7.7'
compile 'info.guardianproject.netcipher:netcipher:1.2'
@ -46,4 +46,5 @@ dependencies {
compile 'com.google.code.gson:gson:2.4'
compile 'com.nononsenseapps:filepicker:3.0.0'
testCompile 'junit:junit:4.12'
compile 'ch.acra:acra:4.9.0'
}

View File

@ -129,7 +129,7 @@
android:name=".ExitActivity"
android:label="@string/general_error"
android:theme="@android:style/Theme.NoDisplay" />
<activity android:name=".ErrorActivity" />
<activity android:name=".report.ErrorActivity" />
<!-- giga get related -->
<activity

View File

@ -42,8 +42,5 @@ public class ActivityCommunicator {
// Thumbnail send from VideoItemDetailFragment to BackgroundPlayer
public volatile Bitmap backgroundPlayerThumbnail;
// Sent from any activity to ErrorActivity.
public volatile List<Throwable> errorList;
public volatile Class returnActivity;
public volatile ErrorActivity.ErrorInfo errorInfo;
}

View File

@ -6,6 +6,13 @@ import android.content.Context;
import com.nostra13.universalimageloader.core.ImageLoader;
import com.nostra13.universalimageloader.core.ImageLoaderConfiguration;
import org.acra.ACRA;
import org.acra.config.ACRAConfiguration;
import org.acra.config.ACRAConfigurationException;
import org.acra.config.ConfigurationBuilder;
import org.acra.sender.ReportSenderFactory;
import org.schabi.newpipe.report.AcraReportSenderFactory;
import org.schabi.newpipe.report.ErrorActivity;
import org.schabi.newpipe.settings.SettingsActivity;
import info.guardianproject.netcipher.NetCipher;
@ -30,12 +37,28 @@ import info.guardianproject.netcipher.proxy.OrbotHelper;
*/
public class App extends Application {
private static final String TAG = App.class.toString();
private static boolean useTor;
final Class<? extends ReportSenderFactory>[] reportSenderFactoryClasses
= new Class[]{AcraReportSenderFactory.class};
@Override
public void onCreate() {
super.onCreate();
// init crashreport
try {
final ACRAConfiguration acraConfig = new ConfigurationBuilder(this)
.setReportSenderFactoryClasses(reportSenderFactoryClasses)
.build();
ACRA.init(this, acraConfig);
} catch(ACRAConfigurationException ace) {
ace.printStackTrace();
ErrorActivity.reportError(this, ace, null, null,
ErrorActivity.ErrorInfo.make(ErrorActivity.SEARCHED,"none",
"Could not initialize ACRA crash report", R.string.app_ui_crash));
}
// Initialize image loader
ImageLoaderConfiguration config = new ImageLoaderConfiguration.Builder(this).build();

View File

@ -27,6 +27,7 @@ import org.schabi.newpipe.extractor.ParsingException;
import org.schabi.newpipe.extractor.ServiceList;
import org.schabi.newpipe.extractor.StreamingService;
import org.schabi.newpipe.info_list.InfoListAdapter;
import org.schabi.newpipe.report.ErrorActivity;
import java.io.IOException;

View File

@ -7,8 +7,7 @@ import android.view.View;
import com.nostra13.universalimageloader.core.assist.FailReason;
import com.nostra13.universalimageloader.core.listener.ImageLoadingListener;
import org.schabi.newpipe.ErrorActivity;
import org.schabi.newpipe.R;
import org.schabi.newpipe.report.ErrorActivity;
import org.schabi.newpipe.extractor.ServiceList;
/**

View File

@ -6,7 +6,7 @@ import android.util.Log;
import android.view.View;
import org.schabi.newpipe.Downloader;
import org.schabi.newpipe.ErrorActivity;
import org.schabi.newpipe.report.ErrorActivity;
import org.schabi.newpipe.R;
import org.schabi.newpipe.extractor.ParsingException;
import org.schabi.newpipe.extractor.ServiceList;

View File

@ -43,7 +43,7 @@ import java.util.Vector;
import org.schabi.newpipe.ActivityCommunicator;
import org.schabi.newpipe.ChannelActivity;
import org.schabi.newpipe.ErrorActivity;
import org.schabi.newpipe.report.ErrorActivity;
import org.schabi.newpipe.ImageErrorLoadingListener;
import org.schabi.newpipe.Localization;
import org.schabi.newpipe.R;

View File

@ -26,7 +26,7 @@ import android.widget.SeekBar;
import android.widget.TextView;
import android.widget.Toast;
import org.schabi.newpipe.ErrorActivity;
import org.schabi.newpipe.report.ErrorActivity;
import org.schabi.newpipe.R;
import org.schabi.newpipe.settings.SettingsActivity;

View File

@ -0,0 +1,38 @@
package org.schabi.newpipe.report;
import android.content.Context;
import org.acra.collector.CrashReportData;
import org.acra.sender.ReportSender;
import org.acra.sender.ReportSenderException;
import org.schabi.newpipe.R;
/**
* Created by Christian Schabesberger on 13.09.16.
*
* Copyright (C) Christian Schabesberger 2015 <chris.schabesberger@mailbox.org>
* AcraReportSender.java is part of NewPipe.
*
* NewPipe is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* NewPipe is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with NewPipe. If not, see <http://www.gnu.org/licenses/>.
*/
public class AcraReportSender implements ReportSender {
@Override
public void send(Context context, CrashReportData report) throws ReportSenderException {
ErrorActivity.reportError(context, report,
ErrorActivity.ErrorInfo.make(ErrorActivity.UI_ERROR,"none",
"App crash, UI failure", R.string.app_ui_crash));
}
}

View File

@ -0,0 +1,34 @@
package org.schabi.newpipe.report;
import android.content.Context;
import org.acra.config.ACRAConfiguration;
import org.acra.sender.ReportSender;
import org.acra.sender.ReportSenderFactory;
import org.schabi.newpipe.report.AcraReportSender;
/**
* Created by Christian Schabesberger on 13.09.16.
*
* Copyright (C) Christian Schabesberger 2015 <chris.schabesberger@mailbox.org>
* AcraReportSenderFactory.java is part of NewPipe.
*
* NewPipe is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* NewPipe is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with NewPipe. If not, see <http://www.gnu.org/licenses/>.
*/
public class AcraReportSenderFactory implements ReportSenderFactory {
public ReportSender create(Context context, ACRAConfiguration config) {
return new AcraReportSender();
}
}

View File

@ -1,6 +1,6 @@
package org.schabi.newpipe;
package org.schabi.newpipe.report;
import android.app.Activity;
import android.content.Context;
@ -8,6 +8,8 @@ import android.content.Intent;
import android.graphics.Color;
import android.net.Uri;
import android.os.Build;
import android.os.Parcel;
import android.os.Parcelable;
import android.preference.PreferenceManager;
import android.support.design.widget.Snackbar;
import android.support.v4.app.NavUtils;
@ -24,8 +26,15 @@ import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import org.acra.ReportField;
import org.acra.collector.CrashReportData;
import org.json.JSONArray;
import org.json.JSONObject;
import org.schabi.newpipe.ActivityCommunicator;
import org.schabi.newpipe.BuildConfig;
import org.schabi.newpipe.Downloader;
import org.schabi.newpipe.MainActivity;
import org.schabi.newpipe.R;
import org.schabi.newpipe.extractor.Parser;
import java.io.PrintWriter;
@ -57,7 +66,7 @@ import java.util.Vector;
*/
public class ErrorActivity extends AppCompatActivity {
public static class ErrorInfo {
public static class ErrorInfo implements Parcelable {
public int userAction;
public String request;
public String serviceName;
@ -71,27 +80,73 @@ public class ErrorActivity extends AppCompatActivity {
info.message = message;
return info;
}
@Override
public int describeContents() {
return 0;
}
@Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeInt(this.userAction);
dest.writeString(this.request);
dest.writeString(this.serviceName);
dest.writeInt(this.message);
}
public ErrorInfo() {
}
protected ErrorInfo(Parcel in) {
this.userAction = in.readInt();
this.request = in.readString();
this.serviceName = in.readString();
this.message = in.readInt();
}
public static final Parcelable.Creator<ErrorInfo> CREATOR = new Parcelable.Creator<ErrorInfo>() {
@Override
public ErrorInfo createFromParcel(Parcel source) {
return new ErrorInfo(source);
}
@Override
public ErrorInfo[] newArray(int size) {
return new ErrorInfo[size];
}
};
}
// LOG TAGS
public static final String TAG = ErrorActivity.class.toString();
// BUNDLE TAGS
public static final String ERROR_INFO = "error_info";
public static final String ERROR_LIST = "error_list";
// MESSAGE ID
public static final int SEARCHED = 0;
public static final int REQUESTED_STREAM = 1;
public static final int GET_SUGGESTIONS = 2;
public static final int SOMETHING_ELSE = 3;
public static final int USER_REPORT = 4;
public static final int LOAD_IMAGE = 5;
public static final int UI_ERROR = 6;
// MESSAGE STRING
public static final String SEARCHED_STRING = "searched";
public static final String REQUESTED_STREAM_STRING = "requested stream";
public static final String GET_SUGGESTIONS_STRING = "get suggestions";
public static final String SOMETHING_ELSE_STRING = "something";
public static final String USER_REPORT_STRING = "user report";
public static final String LOAD_IMAGE_STRING = "load image";
public static final String UI_ERROR_STRING = "ui error";
public static final String ERROR_EMAIL_ADDRESS = "crashreport@newpipe.schabi.org";
public static final String ERROR_EMAIL_SUBJECT = "Exception in NewPipe " + BuildConfig.VERSION_NAME;
private List<Throwable> errorList;
private String[] errorList;
private ErrorInfo errorInfo;
private Class returnActivity;
private String currentTimeStamp;
@ -115,19 +170,19 @@ public class ErrorActivity extends AppCompatActivity {
@Override
public void onClick(View v) {
ActivityCommunicator ac = ActivityCommunicator.getCommunicator();
ac.errorList = el;
ac.returnActivity = returnAcitivty;
ac.errorInfo = errorInfo;
Intent intent = new Intent(context, ErrorActivity.class);
intent.putExtra(ERROR_INFO, errorInfo);
intent.putExtra(ERROR_LIST, elToSl(el));
context.startActivity(intent);
}
}).show();
} else {
ActivityCommunicator ac = ActivityCommunicator.getCommunicator();
ac.errorList = el;
ac.returnActivity = returnAcitivty;
ac.errorInfo = errorInfo;
Intent intent = new Intent(context, ErrorActivity.class);
intent.putExtra(ERROR_INFO, errorInfo);
intent.putExtra(ERROR_LIST, elToSl(el));
context.startActivity(intent);
}
}
@ -165,10 +220,29 @@ public class ErrorActivity extends AppCompatActivity {
});
}
public static void reportError(final Context context, final CrashReportData report, final ErrorInfo errorInfo) {
// get key first (don't ask about this solution)
ReportField key = null;
for(ReportField k : report.keySet()) {
if(k.toString().equals("STACK_TRACE")) {
key = k;
}
}
String[] el = new String[] { report.get(key) };
Intent intent = new Intent(context, ErrorActivity.class);
intent.putExtra(ERROR_INFO, errorInfo);
intent.putExtra(ERROR_LIST, el);
context.startActivity(intent);
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_error);
Intent intent = getIntent();
try {
ActionBar actionBar = getSupportActionBar();
actionBar.setDisplayHomeAsUpEnabled(true);
@ -179,23 +253,20 @@ public class ErrorActivity extends AppCompatActivity {
e.printStackTrace();
}
ActivityCommunicator ac = ActivityCommunicator.getCommunicator();
errorList = ac.errorList;
returnActivity = ac.returnActivity;
errorInfo = ac.errorInfo;
reportButton = (Button) findViewById(R.id.errorReportButton);
userCommentBox = (EditText) findViewById(R.id.errorCommentBox);
errorView = (TextView) findViewById(R.id.errorView);
infoView = (TextView) findViewById(R.id.errorInfosView);
errorMessageView = (TextView) findViewById(R.id.errorMessageView);
errorView.setText(formErrorText(errorList));
ActivityCommunicator ac = ActivityCommunicator.getCommunicator();
returnActivity = ac.returnActivity;
errorInfo = intent.getParcelableExtra(ERROR_INFO);
errorList = intent.getStringArrayExtra(ERROR_LIST);
//importand add gurumeditaion
addGuruMeditaion();
currentTimeStamp = getCurrentTimeStamp();
buildInfo(errorInfo);
reportButton.setOnClickListener(new View.OnClickListener() {
@Override
@ -214,12 +285,16 @@ public class ErrorActivity extends AppCompatActivity {
globIpRangeThread = new Thread(new IpRagneRequester());
globIpRangeThread.start();
// normal bugreport
buildInfo(errorInfo);
if(errorInfo.message != 0) {
errorMessageView.setText(errorInfo.message);
} else {
errorMessageView.setVisibility(View.GONE);
findViewById(R.id.messageWhatHappenedView).setVisibility(View.GONE);
}
errorView.setText(formErrorText(errorList));
}
@Override
@ -255,12 +330,12 @@ public class ErrorActivity extends AppCompatActivity {
return sw.getBuffer().toString();
}
private String formErrorText(List<Throwable> el) {
private String formErrorText(String[] el) {
String text = "";
if(el != null) {
for (Throwable e : el) {
for (String e : el) {
text += "-------------------------------------\n"
+ getStackTrace(e);
+ e;
}
}
text += "-------------------------------------";
@ -295,6 +370,7 @@ public class ErrorActivity extends AppCompatActivity {
+ "\n" + getContentLangString()
+ "\n" + info.serviceName
+ "\n" + currentTimeStamp
+ "\n" + getPackageName()
+ "\n" + BuildConfig.VERSION_NAME
+ "\n" + getOsString();
@ -309,6 +385,7 @@ public class ErrorActivity extends AppCompatActivity {
.put("request", errorInfo.request)
.put("content_language", getContentLangString())
.put("service", errorInfo.serviceName)
.put("package", getPackageName())
.put("version", BuildConfig.VERSION_NAME)
.put("os", getOsString())
.put("time", currentTimeStamp)
@ -316,8 +393,8 @@ public class ErrorActivity extends AppCompatActivity {
JSONArray exceptionArray = new JSONArray();
if(errorList != null) {
for (Throwable e : errorList) {
exceptionArray.put(getStackTrace(e));
for (String e : errorList) {
exceptionArray.put(e);
}
}
@ -347,6 +424,8 @@ public class ErrorActivity extends AppCompatActivity {
return USER_REPORT_STRING;
case LOAD_IMAGE:
return LOAD_IMAGE_STRING;
case UI_ERROR:
return UI_ERROR_STRING;
default:
return "Your description is in another castle.";
}
@ -421,4 +500,13 @@ public class ErrorActivity extends AppCompatActivity {
}
}
}
// errorList to StringList
private static String[] elToSl(List<Throwable> stackTraces) {
String[] out = new String[stackTraces.size()];
for(int i = 0; i < stackTraces.size(); i++) {
out[i] = getStackTrace(stackTraces.get(i));
}
return out;
}
}

View File

@ -18,7 +18,7 @@ import android.view.inputmethod.InputMethodManager;
import android.widget.ProgressBar;
import android.widget.Toast;
import org.schabi.newpipe.ErrorActivity;
import org.schabi.newpipe.report.ErrorActivity;
import org.schabi.newpipe.R;
import org.schabi.newpipe.detail.VideoItemDetailActivity;
import org.schabi.newpipe.detail.VideoItemDetailFragment;

View File

@ -6,10 +6,9 @@ import android.os.Handler;
import android.preference.PreferenceManager;
import android.util.Log;
import android.view.View;
import android.widget.Toast;
import org.schabi.newpipe.Downloader;
import org.schabi.newpipe.ErrorActivity;
import org.schabi.newpipe.report.ErrorActivity;
import org.schabi.newpipe.R;
import org.schabi.newpipe.extractor.ExtractionException;
import org.schabi.newpipe.extractor.SearchEngine;

View File

@ -1,14 +1,13 @@
package org.schabi.newpipe.search_fragment;
import android.app.Activity;
import android.content.Context;
import android.content.SharedPreferences;
import android.os.Handler;
import android.preference.PreferenceManager;
import android.widget.Toast;
import org.schabi.newpipe.Downloader;
import org.schabi.newpipe.ErrorActivity;
import org.schabi.newpipe.report.ErrorActivity;
import org.schabi.newpipe.R;
import org.schabi.newpipe.extractor.ExtractionException;
import org.schabi.newpipe.extractor.SearchEngine;

View File

@ -3,7 +3,7 @@
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".ErrorActivity">
tools:context=".report.ErrorActivity">
<ScrollView
android:id="@+id/scrollView"

View File

@ -135,7 +135,6 @@
<string name="autoplay_by_calling_app_summary">Auto-reproduz un videu al llamar a NewPipe dende otra aplicación.</string>
<string name="autoplay_by_calling_app_title">Auto-reproducir al llamar dende otra aplicación</string>
<string name="info_labels">Qué:\\nSolicitú:\\nLlingua conteníu:\\nServiciu:\\nHora GMT:\\nVersión:\\nVersión SO:\\nRangu global d\'IP:</string>
<string name="detail_uploader_thumbnail_view_description">Miniatura del xubidor</string>
<string name="detail_dislikes_img_view_description">Despréstames</string>
<string name="error_querying_decoders">Nun puen consultase los descodificadores del preséu</string>

View File

@ -91,7 +91,7 @@
<string name="error_snackbar_action">MELDEN</string>
<string name="what_device_headline">Info:</string>
<string name="what_happened_headline">Dies ist passiert:</string>
<string name="info_labels">Was:\\nAnfrage:\\nSprache des Inhalts:\\nDienst:\\nZeit (GMT):\\nVersion:\\nOS-Version:\\nGlob. IP-Bereich:</string>
<string name="info_labels">Was:\\nAnfrage:\\nSprache des Inhalts:\\nDienst:\\nZeit (GMT):\\nPacket:\\nVersion:\\nOS-Version:\\nGlob. IP-Bereich:</string>
<string name="error_details_headline">Details:</string>

View File

@ -99,7 +99,6 @@
<string name="error_snackbar_action">REPORTAR</string>
<string name="what_device_headline">Información:</string>
<string name="what_happened_headline">Qué ha ocurrido:</string>
<string name="info_labels">Que:\\nSolicitud:\\nIdioma del contenido:\\nServicio:\\nHora GMT:\\nVersión:\\nVersión del SO:\\nRango global de IP:</string>
<string name="info_searched_lbl">Buscado:</string>
<string name="info_requested_stream_lbl">Stream solicitado:</string>
<string name="your_comment">Su comentario (en Inglés):</string>

View File

@ -81,7 +81,6 @@
<string name="error_snackbar_action">گزارش</string>
<string name="what_device_headline">اطّلاعات:</string>
<string name="what_happened_headline">چه روی داد:</string>
<string name="info_labels">چه:\\nدرخواست:\\nزبان درخواست:\\nخدمت:\\nزمان GMT:\\nنگارش:\\nنگارش س.ع:\\nبازه آی‌پی:</string>
<string name="info_searched_lbl">جست‌وجو شده برای:</string>
<string name="info_requested_stream_lbl">جریان درخواستی:</string>
<string name="your_comment">توضیح شما (به انگلیسی):</string>

View File

@ -121,7 +121,6 @@
<string name="logging_verbose">Verbeux</string>
<string name="off">[désactivé]</string>
<string name="error_querying_decoders">Impossible d\'accéder aux décodeurs de l\'appareil</string>
<string name="info_labels">Action :\\nRequête :\\nLangue du contenu :\\nService :\\nHeure GMT :\\nVersion :\\nVersion d\'OS :\\nIntervalle global d\'IP :</string>
<string name="downloads">Téléchargements</string>
<string name="downloads_title">Téléchargements</string>
<string name="settings_title">Paramètres</string>

View File

@ -117,7 +117,6 @@
<string name="could_not_load_thumbnails">Nem sikerült az összes előnézeti kép betöltése</string>
<string name="parsing_error">Nem sikerült a weblap betöltése.</string>
<string name="light_parsing_error">Nem sikerült a weblap teljes betöltése.</string>
<string name="info_labels">Mi:\\nKérés:\\nTartalom nyelve:\\nSzolgáltatás:\\nGMT Idő:\\nVerzió:\\nOS verzió:\\nGlob. IP tartomány:</string>
<string name="error_drm_not_supported">Védett tartalom nincs támogatva 18-as API alatt (Android 4.3)</string>
<string name="error_drm_unsupported_scheme">Ez az eszköz nem támogatja a szükséges DRM sémát</string>
<string name="logging">Naplózás</string>

View File

@ -100,7 +100,6 @@
<string name="error_snackbar_action">SEGNALA</string>
<string name="what_device_headline">Info:</string>
<string name="what_happened_headline">Cosa è successo:</string>
<string name="info_labels">Cosa:\\nRichiesta:\\nLingua Contenuto:\\nServizio:\\nOrario GMT:\\nVersione:\\nVersione SO:\\nRange glob. dell\'IP:</string>
<string name="info_searched_lbl">È stato cercato:</string>
<string name="info_requested_stream_lbl">Stream richiesto:</string>
<string name="your_comment">Il tuo commento (in inglese):</string>

View File

@ -93,7 +93,6 @@
<string name="error_snackbar_action">報告</string>
<string name="what_device_headline">情報:</string>
<string name="what_happened_headline">何が起こりましたか:</string>
<string name="info_labels">何:\\nリクエスト:\\nコンテンツの言語:\\nサービス:\\nGMT 時間:\\nバージョン:\\nOS バージョン:\\nグローバル IP の範囲:</string>
<string name="info_searched_lbl">検索結果:</string>
<string name="info_requested_stream_lbl">要求したストリーム:</string>
<string name="your_comment">あなたのコメント (英語で):</string>

View File

@ -95,7 +95,6 @@
<string name="error_snackbar_action">보고</string>
<string name="what_device_headline">정보:</string>
<string name="what_happened_headline">다음이 발생함:</string>
<string name="info_labels">사유:\\n요청t:\\n컨텐츠 언어:\\n서비스:\\nGMT 시간:\\n버전:\\nOS 버전:\\nGlob. IP 범위:</string>
<string name="info_searched_lbl">다음을 검색:</string>
<string name="info_requested_stream_lbl">요청된 스트림:</string>
<string name="your_comment">내용 (영어로 작성):</string>

View File

@ -117,6 +117,5 @@
<string name="use_exoplayer_summary">Eksperimentelt</string>
<string name="duration_live">direkteoverført</string>
<string name="info_labels">Hva:\\nRequest:\\nContent Språk:\\nService:\\nGMT Tid:\\nVersion:\\nOS version:\\nGlob. IP-blokk:</string>
<string name="error_instantiating_decoder">Kunne ikke igangsette dekoder <xliff:g id="decoder_name">%1$s</xliff:g></string>
</resources>

View File

@ -89,7 +89,6 @@
<string name="error_snackbar_action">Relatório</string>
<string name="what_device_headline">Info:</string>
<string name="what_happened_headline">O que ocorreu:</string>
<string name="info_labels">O quê:\\nPedido:\\nIdioma do conteúdo:\\nServiço:\\nHora GMT:\\nVersão:\\nVersão do So:\\nGlob. IP:</string>
<string name="info_searched_lbl">Pesquisou por:</string>
<string name="info_requested_stream_lbl">Emissão solicitada:</string>
<string name="your_comment">Comentários (em Inglês):</string>

View File

@ -96,7 +96,6 @@
<string name="error_snackbar_action">RAPORTAȚI</string>
<string name="what_device_headline">Informații:</string>
<string name="what_happened_headline">Ce s-a întâmplat:</string>
<string name="info_labels">Ce:\\nRequest:\\nContent Lang:\\nService:\\nGMT Time:\\nVersion:\\nOS version:\\nGlob. Raza IP-ului:</string>
<string name="info_searched_lbl">S-a căutat pentru:</string>
<string name="info_requested_stream_lbl">Fluxul cerut:</string>
<string name="your_comment">Comentariul tău (în engleză):</string>

View File

@ -91,7 +91,6 @@
<string name="error_snackbar_action">SPRÁVA</string>
<string name="what_device_headline">Info:</string>
<string name="what_happened_headline">Čo sa stalo:</string>
<string name="info_labels">Čo:\\nPožiadavka:\\nJazyk obsahu:\\nSlužba:\\nČas v GMT:\\nVerzia:\\nVerzia OS:\\nGlob. rozsah IP:</string>
<string name="info_searched_lbl">Hľadané:</string>
<string name="info_requested_stream_lbl">Požadované vysielanie:</string>
<string name="your_comment">Váš komentár (v Angličtine):</string>

View File

@ -107,7 +107,6 @@
<string name="off">[izklopljeno]</string>
<string name="use_exoplayer_title">Uporabi ExoPlayer</string>
<string name="use_exoplayer_summary">Preizkusne zmožnosti</string>
<string name="info_labels">Predmet:\\nZahteva:\\nJezik vsebine:\\nStoritev:\\nČas po GMT:\\nRazličica:\\nRazličica OS:\\nObseg IP:</string>
<string name="info_searched_lbl">Iskano:</string>
<string name="info_requested_stream_lbl">Zahtevan pretok:</string>
<string name="your_comment">Opomba (v angleščini):</string>

View File

@ -95,7 +95,6 @@
<string name="error_snackbar_action">ПРИЈАВИ</string>
<string name="what_device_headline">Подаци:</string>
<string name="what_happened_headline">Шта се десило:</string>
<string name="info_labels">Шта:\\nЗахтев:\\nЈезик садржаја:\\nУслуга:\\nГМТ време:\\nИздање:\\nИздање система:\\nГлоб. ИП опсег:</string>
<string name="your_comment">Ваш коментар (на енглеском):</string>
<string name="error_details_headline">Детаљи:</string>

View File

@ -79,5 +79,4 @@
<string name="error_snackbar_action">ЗВІТУВАТИ</string>
<string name="what_device_headline">Інформація:</string>
<string name="what_happened_headline">Що сталося:</string>
<string name="info_labels">Що:\\nЗапит:\\nМова контенту:\\nСервіс:\\nЧас GMT:\\nВерсія:\\nВерсія ОС:\\nДіапазон IP:</string>
</resources>

View File

@ -89,7 +89,6 @@
<string name="error_details_headline">详细信息:</string>
<string name="info_labels">什么:\\n请求\\n内容语言\\n服务\\nGMT 时间:\\n版本\\nOS 版本:\\nGlob. IP 范围:</string>
<string name="report_error">报告错误</string>
<string name="user_report">用户报告</string>

View File

@ -97,6 +97,7 @@
<string name="live_streams_not_supported">This is a LIVE STREAM. These are not yet supported.</string>
<string name="could_not_get_stream">Could not get any stream.</string>
<string name="could_not_load_image">Could not load Image</string>
<string name="app_ui_crash">App/UI crashed</string>
<!-- error activity -->
<string name="sorry_string">Sorry that should not happen.</string>
<string name="guru_meditation" translatable="false">Guru Meditation.</string>
@ -105,7 +106,7 @@
<string name="error_snackbar_action">REPORT</string>
<string name="what_device_headline">Info:</string>
<string name="what_happened_headline">What happened:</string>
<string name="info_labels">What:\\nRequest:\\nContent Lang:\\nService:\\nGMT Time:\\nVersion:\\nOS version:\\nGlob. IP range:</string>
<string name="info_labels">What:\\nRequest:\\nContent Lang:\\nService:\\nGMT Time:\\nPackage:\\nVersion:\\nOS version:\\nGlob. IP range:</string>
<string name="info_searched_lbl">Searched for:</string>
<string name="info_requested_stream_lbl">Requested stream:</string>
<string name="your_comment">Your comment (in English):</string>