com.codename1.system.DefaultCrashReporter Maven / Gradle / Ivy
/*
* Copyright (c) 2012, Codename One and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation. Codename One designates this
* particular file as subject to the "Classpath" exception as provided
* by Oracle in the LICENSE file that accompanied this code.
*
* This code 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
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Codename One through http://www.codenameone.com/ if you
* need additional information or have any questions.
*/
package com.codename1.system;
import com.codename1.io.Log;
import com.codename1.io.Preferences;
import com.codename1.ui.Button;
import com.codename1.ui.CheckBox;
import com.codename1.ui.Command;
import com.codename1.ui.Container;
import com.codename1.ui.Dialog;
import com.codename1.ui.Display;
import com.codename1.ui.TextArea;
import com.codename1.ui.layouts.BorderLayout;
import com.codename1.ui.layouts.BoxLayout;
import com.codename1.ui.layouts.GridLayout;
import com.codename1.ui.util.UITimer;
import java.util.TimerTask;
/**
* A default implementation of the crash reporter that instantly sends the crash
* data to the server.
*
* @author Shai Almog
*/
public class DefaultCrashReporter implements CrashReport {
private boolean promptUser = false;
private static String errorText = "The application encountered an error, do you wish to report it?";
private static String sendButtonText = "Send";
private static String dontSendButtonText = "Don't Send";
private static String checkboxText = "Don't show this dialog again";
/**
* The text for the user prompt dialog
* @return the errorText
*/
public static String getErrorText() {
return errorText;
}
/**
* The text for the user prompt dialog
* @param aErrorText the errorText to set
*/
public static void setErrorText(String aErrorText) {
errorText = aErrorText;
}
/**
* The text for the user prompt dialog
* @return the sendButtonText
*/
public static String getSendButtonText() {
return sendButtonText;
}
/**
* The text for the user prompt dialog
* @param aSendButtonText the sendButtonText to set
*/
public static void setSendButtonText(String aSendButtonText) {
sendButtonText = aSendButtonText;
}
/**
* The text for the user prompt dialog
* @return the dontSendButtonText
*/
public static String getDontSendButtonText() {
return dontSendButtonText;
}
/**
* The text for the user prompt dialog
* @param aDontSendButtonText the dontSendButtonText to set
*/
public static void setDontSendButtonText(String aDontSendButtonText) {
dontSendButtonText = aDontSendButtonText;
}
/**
* The text for the user prompt dialog
* @return the checkboxText
*/
public static String getCheckboxText() {
return checkboxText;
}
/**
* The text for the user prompt dialog
* @param aCheckboxText the checkboxText to set
*/
public static void setCheckboxText(String aCheckboxText) {
checkboxText = aCheckboxText;
}
private DefaultCrashReporter() {}
/**
* Installs a crash reporter within the system
* @param promptUser indicates whether the user should be prompted on crash reporting
* @param frequency the frequency with which we send the log to the server in debug mode in minutes
* frequency must be at least 1. Any lower level automatically disables this feature
*/
public static void init(boolean promptUser, int frequency) {
if(Preferences.get("$CN1_crashBlocked", false) || Log.getReportingLevel() == Log.REPORTING_NONE) {
return;
}
if(Preferences.get("$CN1_pendingCrash", false)) {
// we must have crashed during a report, send it.
Log.sendLog();
Preferences.set("$CN1_pendingCrash", false);
}
if(Log.getReportingLevel() == Log.REPORTING_DEBUG && frequency > 0) {
java.util.Timer t = new java.util.Timer();
t.schedule(new TimerTask() {
public void run() {
if(!Display.getInstance().isEdt()) {
Display.getInstance().callSerially(this);
return;
}
Log.sendLog();
}
}, frequency * 60000, frequency * 60000);
}
DefaultCrashReporter d = new DefaultCrashReporter();
d.promptUser = promptUser && Preferences.get("$CN1_prompt", true);
Display.getInstance().setCrashReporter(d);
}
/**
* {@inheritDoc}
*/
public void exception(Throwable t) {
Preferences.set("$CN1_pendingCrash", true);
if(promptUser) {
Dialog error = new Dialog("Error");
error.setLayout(new BoxLayout(BoxLayout.Y_AXIS));
TextArea txt = new TextArea(errorText);
txt.setEditable(false);
txt.setUIID("DialogBody");
error.addComponent(txt);
CheckBox cb = new CheckBox(checkboxText);
cb.setUIID("DialogBody");
error.addComponent(cb);
Container grid = new Container(new GridLayout(1, 2));
error.addComponent(grid);
Command ok = new Command(sendButtonText);
Command dont = new Command(dontSendButtonText);
Button send = new Button(ok);
Button dontSend = new Button(dont);
grid.addComponent(send);
grid.addComponent(dontSend);
Command result = error.showPacked(BorderLayout.CENTER, true);
if(result == dont) {
if(cb.isSelected()) {
Preferences.set("$CN1_crashBlocked", true);
}
Preferences.set("$CN1_pendingCrash", false);
return;
} else {
if(cb.isSelected()) {
Preferences.set("$CN1_prompt", false);
}
}
}
Log.sendLog();
Preferences.set("$CN1_pendingCrash", false);
}
}