made error handling work a bit

This commit is contained in:
Christian Schabesberger 2016-02-25 03:43:13 +01:00
parent 27a2dee3bd
commit 64c423902a
8 changed files with 142 additions and 39 deletions

View file

@ -22,10 +22,12 @@ package org.schabi.newpipe;
import android.graphics.Bitmap;
import java.util.List;
/**
* Singleton:
* Used to send data between certain Activity/Services within the same process.
* This can be considered as hack inside the Android universe. **/
* This can be considered as an ugly hack inside the Android universe. **/
public class ActivityCommunicator {
private static ActivityCommunicator activityCommunicator = null;
@ -39,4 +41,8 @@ public class ActivityCommunicator {
// Thumbnail send from VideoItemDetailFragment to BackgroundPlayer
public volatile Bitmap backgroundPlayerThumbnail;
// Sent from any activity to ErrorActivity.
public volatile List<Exception> errorList;
public volatile Class returnActivity;
}

View file

@ -46,6 +46,7 @@ import com.nostra13.universalimageloader.core.listener.ImageLoadingListener;
import java.util.ArrayList;
import java.util.Vector;
import org.schabi.newpipe.errorhandling.ErrorActivity;
import org.schabi.newpipe.extractor.MediaFormat;
import org.schabi.newpipe.extractor.ParsingException;
import org.schabi.newpipe.extractor.ServiceList;
@ -166,10 +167,23 @@ public class VideoItemDetailFragment extends Fragment {
});
e.printStackTrace();
} catch (ParsingException e) {
postNewErrorToast(h, e.getMessage());
ErrorActivity.reportError(h, getActivity(), e, 0, VideoItemListActivity.class);
h.post(new Runnable() {
@Override
public void run() {
getActivity().finish();
}
});
e.printStackTrace();
} catch(Exception e) {
postNewErrorToast(h, R.string.general_error);
ErrorActivity.reportError(h, getActivity(), e,
R.string.general_error, VideoItemListActivity.class);
h.post(new Runnable() {
@Override
public void run() {
getActivity().finish();
}
});
e.printStackTrace();
} finally {
if(videoInfo != null &&
@ -178,6 +192,9 @@ public class VideoItemDetailFragment extends Fragment {
for(Exception e : videoInfo.errors) {
e.printStackTrace();
}
//todo: do not call directly ask the user if it should be reported
ErrorActivity.reportError(h, getActivity(),
videoInfo.errors, 0, VideoItemDetailActivity.class);
}
}
}

View file

@ -241,12 +241,6 @@ public class VideoItemListActivity extends AppCompatActivity
}
PreferenceManager.setDefaultValues(this, R.xml.settings, false);
/* this is for debuging only if this is still pressent in master branch kill the programmer */
startActivity(new Intent(this, ErrorActivity.class));
//-------------------------------------------------------------------------
}
@Override

View file

@ -1,15 +1,125 @@
package org.schabi.newpipe.errorhandling;
import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.support.v4.app.NavUtils;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.os.Handler;
import android.view.MenuItem;
import android.widget.TextView;
import org.apache.commons.lang.exception.ExceptionUtils;
import org.schabi.newpipe.ActivityCommunicator;
import org.schabi.newpipe.R;
import org.schabi.newpipe.VideoItemListActivity;
import java.util.List;
import java.util.Vector;
public class ErrorActivity extends AppCompatActivity {
private List<Exception> errorList;
private Class returnActivity;
// views
private TextView errorView;
public static void reportError(Context context, List<Exception> el, int message, Class returnAcitivty) {
ActivityCommunicator ac = ActivityCommunicator.getCommunicator();
ac.errorList = el;
ac.returnActivity = returnAcitivty;
Intent intent = new Intent(context, ErrorActivity.class);
context.startActivity(intent);
}
public static void reportError(Context context, Exception e, int message, Class returnAcitivty) {
List<Exception> el = new Vector<>();
el.add(e);
reportError(context, el, message, returnAcitivty);
}
// async call
public static void reportError(Handler handler, final Context context,
final Exception e, final int message, final Class returnAcitivty) {
List<Exception> el = new Vector<>();
el.add(e);
reportError(handler, context, el, message, returnAcitivty);
}
// async call
public static void reportError(Handler handler, final Context context,
final List<Exception> el, final int message, final Class returnAcitivty) {
handler.post(new Runnable() {
@Override
public void run() {
reportError(context, el, message, returnAcitivty);
}
});
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_error);
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
ActivityCommunicator ac = ActivityCommunicator.getCommunicator();
errorList = ac.errorList;
returnActivity = ac.returnActivity;
errorView = (TextView) findViewById(R.id.errorView);
errorView.setText(formErrorText(errorList));
//importand add gurumeditaion
addGuruMeditaion();
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
int id = item.getItemId();
if (id == android.R.id.home) {
goToReturnActivity();
return true;
}
return false;
}
private String formErrorText(List<Exception> el) {
String text = "";
for(Exception e : el) {
text += "-------------------------------------\n"
+ ExceptionUtils.getStackTrace(e);
}
text += "-------------------------------------";
return text;
}
private void goToReturnActivity() {
Intent intent;
if(returnActivity != null &&
returnActivity.isAssignableFrom(Activity.class)) {
intent = new Intent(this, returnActivity);
} else {
intent = new Intent(this, VideoItemListActivity.class);
}
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
NavUtils.navigateUpTo(this, intent);
}
private void addGuruMeditaion() {
//just an easter egg
TextView sorryView = (TextView) findViewById(R.id.errorSorryView);
String text = sorryView.getText().toString();
text += "\n" + getString(R.string.guru_meditation);
sorryView.setText(text);
}
@Override
public void onBackPressed() {
super.onBackPressed();
goToReturnActivity();
}
}