1 /* 2 * Copyright (C) 2013 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 package org.jf.smalidea.errorReporting; 18 19 import com.intellij.diagnostic.IdeErrorsDialog; 20 import com.intellij.diagnostic.LogMessageEx; 21 import com.intellij.diagnostic.ReportMessages; 22 import com.intellij.errorreport.bean.ErrorBean; 23 import com.intellij.ide.DataManager; 24 import com.intellij.ide.plugins.IdeaPluginDescriptor; 25 import com.intellij.ide.plugins.PluginManager; 26 import com.intellij.idea.IdeaLogger; 27 import com.intellij.notification.NotificationListener; 28 import com.intellij.notification.NotificationType; 29 import com.intellij.openapi.actionSystem.CommonDataKeys; 30 import com.intellij.openapi.actionSystem.DataContext; 31 import com.intellij.openapi.diagnostic.ErrorReportSubmitter; 32 import com.intellij.openapi.diagnostic.IdeaLoggingEvent; 33 import com.intellij.openapi.diagnostic.SubmittedReportInfo; 34 import com.intellij.openapi.extensions.PluginId; 35 import com.intellij.openapi.progress.EmptyProgressIndicator; 36 import com.intellij.openapi.progress.ProgressManager; 37 import com.intellij.openapi.project.Project; 38 import com.intellij.util.Consumer; 39 40 import java.awt.*; 41 import java.util.Map; 42 43 /** 44 * Sends crash reports to Github. 45 * 46 * Based on the go-lang plugin's error reporter 47 * (https://github.com/dlsniper/google-go-lang-idea-plugin/commit/c451006cc9fc926ca347189951baa94f4032c5c4) 48 */ 49 public class ErrorReporter extends ErrorReportSubmitter { 50 51 @Override getReportActionText()52 public String getReportActionText() { 53 return "Report as issue on smali's github repo"; 54 } 55 56 @Override submit(IdeaLoggingEvent[] events, String additionalInfo, Component parentComponent, final Consumer<SubmittedReportInfo> consumer)57 public boolean submit(IdeaLoggingEvent[] events, String additionalInfo, Component parentComponent, 58 final Consumer<SubmittedReportInfo> consumer) { 59 IdeaLoggingEvent event = events[0]; 60 ErrorBean bean = new ErrorBean(event.getThrowable(), IdeaLogger.ourLastActionId); 61 62 final DataContext dataContext = DataManager.getInstance().getDataContext(parentComponent); 63 64 bean.setDescription(additionalInfo); 65 bean.setMessage(event.getMessage()); 66 67 Throwable throwable = event.getThrowable(); 68 if (throwable != null) { 69 final PluginId pluginId = IdeErrorsDialog.findPluginId(throwable); 70 if (pluginId != null) { 71 final IdeaPluginDescriptor ideaPluginDescriptor = PluginManager.getPlugin(pluginId); 72 if (ideaPluginDescriptor != null && !ideaPluginDescriptor.isBundled()) { 73 bean.setPluginName(ideaPluginDescriptor.getName()); 74 bean.setPluginVersion(ideaPluginDescriptor.getVersion()); 75 } 76 } 77 } 78 79 Object data = event.getData(); 80 81 if (data instanceof LogMessageEx) { 82 bean.setAttachments(((LogMessageEx)data).getAttachments()); 83 } 84 85 Map<String, String> reportValues = ITNProxy.createParameters(bean); 86 87 final Project project = CommonDataKeys.PROJECT.getData(dataContext); 88 89 Consumer<String> successCallback = new Consumer<String>() { 90 @Override 91 public void consume(String token) { 92 final SubmittedReportInfo reportInfo = new SubmittedReportInfo( 93 null, "Issue " + token, SubmittedReportInfo.SubmissionStatus.NEW_ISSUE); 94 consumer.consume(reportInfo); 95 96 ReportMessages.GROUP.createNotification(ReportMessages.ERROR_REPORT, 97 "Submitted", 98 NotificationType.INFORMATION, 99 null).setImportant(false).notify(project); 100 } 101 }; 102 103 Consumer<Exception> errorCallback = new Consumer<Exception>() { 104 @Override 105 public void consume(Exception e) { 106 String message = String.format("<html>There was an error while creating a GitHub issue: %s<br>" + 107 "Please consider manually creating an issue on the " + 108 "<a href=\"https://github.com/JesusFreke/smali/issues\">Smali Issue Tracker</a></html>", 109 e.getMessage()); 110 ReportMessages.GROUP.createNotification(ReportMessages.ERROR_REPORT, 111 message, 112 NotificationType.ERROR, 113 NotificationListener.URL_OPENING_LISTENER).setImportant(false).notify(project); 114 } 115 }; 116 117 GithubFeedbackTask task = new GithubFeedbackTask(project, "Submitting error report", true, reportValues, 118 successCallback, errorCallback); 119 120 if (project == null) { 121 task.run(new EmptyProgressIndicator()); 122 } else { 123 ProgressManager.getInstance().run(task); 124 } 125 return true; 126 } 127 } 128