← Back to team overview

apport-hackers team mailing list archive

[Merge] lp:~didrocks/apport/whoopsie-auto-ui into lp:apport

 

Didier Roche has proposed merging lp:~didrocks/apport/whoopsie-auto-ui into lp:apport.

Commit message:
Remember option so that users can diminish crash interactions

Requested reviews:
  Apport upstream developers (apport-hackers)
Related bugs:
  Bug #1778497 in apport (Ubuntu): "Add a remember option to whoopsie so that users can diminish crash interactions"
  https://bugs.launchpad.net/ubuntu/+source/apport/+bug/1778497

For more details, see:
https://code.launchpad.net/~didrocks/apport/whoopsie-auto-ui/+merge/348479

Add and adapt test for a "remember" option, which is reported by the UI,
to tell that we want to store the send/don't send option.
Ensure that Relaunch/Force close/Leave close additional buttons are
changed to a checkbox, and that additional Cancel button is never shown,
as being redundant with don't send if enable reporting is possible.
If enable reporting isn't enabled, leave it to "Continue".
Finally, additional labels to propose Sending the report.

-- 
Your team Apport upstream developers is requested to review the proposed merge of lp:~didrocks/apport/whoopsie-auto-ui into lp:apport.
=== modified file 'apport/fileutils.py'
--- apport/fileutils.py	2016-12-10 11:28:27 +0000
+++ apport/fileutils.py	2018-06-25 16:12:21 +0000
@@ -25,14 +25,15 @@
 report_dir = os.environ.get('APPORT_REPORT_DIR', '/var/crash')
 
 _config_file = '~/.config/apport/settings'
-_whoopsie_config_file = '/etc/default/whoopsie'
 
 
 def allowed_to_report():
     '''Check whether crash reporting is enabled.'''
 
-    return get_config('General', 'report_crashes', default=True,
-                      path=_whoopsie_config_file, bool=True)
+    try:
+        return subprocess.call(["/bin/systemctl", "-q", "is-enabled", "whoopsie.service"]) == 0
+    except OSError:
+        return False
 
 
 def find_package_desktopfile(package):

=== modified file 'apport/ui.py'
--- apport/ui.py	2018-05-09 23:28:31 +0000
+++ apport/ui.py	2018-06-25 16:12:21 +0000
@@ -305,6 +305,8 @@
                 self.restart()
             if response['blacklist']:
                 self.report.mark_ignore()
+            if response['remember']:
+                self.remember_send_report(response['report'])
             if not response['report']:
                 return
 
@@ -916,6 +918,26 @@
 
         self.ui_run_terminal(cmds[response[0]])
 
+    def remember_send_report(self, send_report):
+        '''Put whoopsie in auto or never mode'''
+        if send_report:
+            send_report = "true"
+        else:
+            send_report = "false"
+        try:
+            subprocess.check_output(['/usr/bin/gdbus', 'call', '-y',
+                                     '-d', 'com.ubuntu.WhoopsiePreferences',
+                                     '-o', '/com/ubuntu/WhoopsiePreferences',
+                                     '-m', 'com.ubuntu.WhoopsiePreferences.SetReportCrashes', send_report])
+            subprocess.check_output(['/usr/bin/gdbus', 'call', '-y',
+                                     '-d', 'com.ubuntu.WhoopsiePreferences',
+                                     '-o', '/com/ubuntu/WhoopsiePreferences',
+                                     '-m', 'com.ubuntu.WhoopsiePreferences.SetAutomaticallyReportCrashes', 'true'])
+        except (OSError, subprocess.CalledProcessError) as e:
+            self.ui_error_message(_("Can't remember send report status settings"), '%s\n\n%s' % (
+                                  _("Saving crash reporting state failed. Canno't set auto or never reporting mode/"),
+                                  excstr(e)))
+
     def check_report_crashdb(self):
         '''Process reports' CrashDB field, if present'''
 

=== modified file 'bin/apport-cli'
--- bin/apport-cli	2017-11-08 20:50:21 +0000
+++ bin/apport-cli	2018-06-25 16:12:21 +0000
@@ -212,7 +212,7 @@
         while True:
             response = dialog.run()
 
-            return_value = {'restart': False, 'blacklist': False,
+            return_value = {'restart': False, 'blacklist': False, 'remember': False,
                             'report': False, 'examine': False}
             if response == examine:
                 return_value['examine'] = True

=== modified file 'gtk/apport-gtk'
--- gtk/apport-gtk	2016-12-18 12:51:13 +0000
+++ gtk/apport-gtk	2018-06-25 16:12:21 +0000
@@ -75,6 +75,7 @@
         self.md = None
 
         self.desktop_info = None
+        self.allowed_to_report = True
 
     #
     # ui_* implementation of abstract UserInterface classes
@@ -180,15 +181,11 @@
                                         _('Send problem report to the developers?'))
         self.w('title_label').show()
         self.w('subtitle_label').hide()
-        self.w('closed_button').hide()
         self.w('ignore_future_problems').hide()
         self.w('show_details').clicked()
         self.w('show_details').hide()
-        self.w('cancel_button').show()
-        self.w('cancel_button').connect('clicked', Gtk.main_quit)
+        self.w('dont_send_button').show()
         self.w('continue_button').set_label(_('Send'))
-        self.w('send_error_report').set_active(True)
-        self.w('send_error_report').hide()
 
     def set_modal_for(self, xid):
         gdk_window = self.w('dialog_crash_new')
@@ -207,18 +204,20 @@
         self.w('show_details').set_label(_('Show Details'))
         self.tree_model.clear()
 
-        if allowed_to_report:
-            self.w('send_error_report').set_active(True)
-            self.w('send_error_report').show()
+        self.allowed_to_report = allowed_to_report
+        if self.allowed_to_report:
+            self.w('remember_send_report_choice').show()
+            self.w('send_problem_notice_label').set_label(
+                '<b>%s</b>' % self.w('send_problem_notice_label').get_label())
+            self.w('send_problem_notice_label').show()
+            self.w('dont_send_button').grab_focus()
         else:
-            self.w('send_error_report').set_active(False)
-            self.w('send_error_report').hide()
+            self.w('dont_send_button').hide()
+            self.w('continue_button').set_label(_('Continue'))
+            self.w('continue_button').grab_focus()
 
         self.w('examine').set_visible(self.can_examine_locally())
 
-        self.w('continue_button').set_label(_('Continue'))
-
-        self.w('cancel_button').hide()
         if modal_for is not None and 'DISPLAY' in os.environ:
             xid = find_xid_for_pid(modal_for)
             if xid:
@@ -227,9 +226,8 @@
         if report_type == 'Hang' and self.offer_restart:
             self.w('ignore_future_problems').set_active(False)
             self.w('ignore_future_problems').hide()
-            self.w('closed_button').show()
-            self.w('closed_button').set_label(_('Force Closed'))
-            self.w('continue_button').set_label(_('Relaunch'))
+            self.w('relaunch_app').set_active(True)
+            self.w('relaunch_app').show()
             self.w('subtitle_label').show()
             self.w('subtitle_label').set_label(
                 'You can wait to see if it wakes up, or close or relaunch it.')
@@ -245,13 +243,14 @@
                 title = _('The program "%s" has stopped responding.') % name
             self.w('title_label').set_label('<big><b>%s</b></big>' % title)
         elif not self.report_file or report_type == 'Bug':
+            self.w('remember_send_report_choice').hide()
+            self.w('send_problem_notice_label').hide()
             self.setup_bug_report()
         elif report_type == 'KernelCrash' or report_type == 'KernelOops':
             self.w('ignore_future_problems').set_active(False)
             self.w('ignore_future_problems').hide()
             self.w('title_label').set_label('<big><b>%s</b></big>' %
                                             self.get_system_application_title())
-            self.w('closed_button').hide()
             self.w('subtitle_label').hide()
             icon = 'distributor-logo'
         elif report_type == 'Package':
@@ -261,7 +260,6 @@
                 self.w('subtitle_label').show()
             else:
                 self.w('subtitle_label').hide()
-            self.w('closed_button').hide()
             self.w('ignore_future_problems').hide()
             self.w('title_label').set_label(
                 _('Sorry, a problem occurred while installing software.'))
@@ -282,13 +280,9 @@
 
                 pid = apport.ui.get_pid(self.report)
                 still_running = pid and apport.ui.still_running(pid)
-                if 'ProcCmdline' not in self.report or still_running or not self.offer_restart:
-                    self.w('closed_button').hide()
-                    self.w('continue_button').set_label(_('Continue'))
-                else:
-                    self.w('closed_button').show()
-                    self.w('closed_button').set_label(_('Leave Closed'))
-                    self.w('continue_button').set_label(_('Relaunch'))
+                if 'ProcCmdline' in self.report and not still_running and self.offer_restart:
+                    self.w('relaunch_app').set_active(True)
+                    self.w('relaunch_app').show()
             else:
                 icon = 'distributor-logo'
                 if report_type == 'RecoverableProblem':
@@ -302,8 +296,6 @@
                 self.w('subtitle_label').set_label(
                     _('If you notice further problems, '
                       'try restarting the computer.'))
-                self.w('closed_button').hide()
-                self.w('continue_button').set_label(_('Continue'))
                 self.w('ignore_future_problems').set_label(_('Ignore future problems of this type'))
             if self.report.get('CrashCounter'):
                 self.w('ignore_future_problems').show()
@@ -353,7 +345,7 @@
         if len(sys.argv) == 1:
             d.set_focus_on_map(False)
 
-        return_value = {'report': False, 'blacklist': False,
+        return_value = {'report': False, 'blacklist': False, 'remember': False,
                         'restart': False, 'examine': False}
 
         def dialog_crash_dismissed(widget):
@@ -366,17 +358,24 @@
                 Gtk.main_quit()
                 return
 
-            if self.w('send_error_report').get_active():
-                return_value['report'] = True
+            # Force close or leave close app are the default actions with no specifier
+            # in case of hangs or crash
+            if self.w('relaunch_app').get_active() and self.desktop_info and self.offer_restart:
+                return_value['restart'] = True
+
             if self.w('ignore_future_problems').get_active():
                 return_value['blacklist'] = True
-            if widget == self.w('continue_button') and self.desktop_info and self.offer_restart:
-                return_value['restart'] = True
+
+            return_value['remember'] = self.w('remember_send_report_choice').get_active()
+
+            if widget == self.w('continue_button'):
+                return_value['report'] = self.allowed_to_report
+
             Gtk.main_quit()
 
         self.w('dialog_crash_new').connect('destroy', dialog_crash_dismissed)
         self.w('continue_button').connect('clicked', dialog_crash_dismissed)
-        self.w('closed_button').connect('clicked', dialog_crash_dismissed)
+        self.w('dont_send_button').connect('clicked', dialog_crash_dismissed)
         self.w('examine').connect('clicked', dialog_crash_dismissed)
         Gtk.main()
         return return_value

=== modified file 'gtk/apport-gtk.ui'
--- gtk/apport-gtk.ui	2015-06-05 10:42:49 +0000
+++ gtk/apport-gtk.ui	2018-06-25 16:12:21 +0000
@@ -162,6 +162,21 @@
                   </packing>
                 </child>
                 <child>
+                  <object class="GtkLabel" id="send_problem_notice_label">
+                    <property name="visible">False</property>
+                    <property name="can_focus">False</property>
+                    <property name="xalign">0</property>
+                    <property name="label" translatable="yes">Send problem report to the developers?</property>
+                    <property name="use_markup">True</property>
+                    <property name="wrap">True</property>
+                  </object>
+                  <packing>
+                    <property name="expand">False</property>
+                    <property name="fill">True</property>
+                    <property name="position">1</property>
+                  </packing>
+                </child>
+                <child>
                   <object class="GtkLabel" id="subtitle_label">
                     <property name="visible">True</property>
                     <property name="can_focus">False</property>
@@ -172,7 +187,7 @@
                   <packing>
                     <property name="expand">False</property>
                     <property name="fill">True</property>
-                    <property name="position">1</property>
+                    <property name="position">2</property>
                   </packing>
                 </child>
                 <child>
@@ -199,7 +214,7 @@
                   <packing>
                     <property name="expand">True</property>
                     <property name="fill">True</property>
-                    <property name="position">2</property>
+                    <property name="position">3</property>
                   </packing>
                 </child>
                 <child>
@@ -209,13 +224,13 @@
                     <property name="orientation">vertical</property>
                     <property name="spacing">3</property>
                     <child>
-                      <object class="GtkCheckButton" id="send_error_report">
-                        <property name="label" translatable="yes">Send an error report to help fix this problem</property>
-                        <property name="visible">True</property>
+                      <object class="GtkCheckButton" id="remember_send_report_choice">
+                        <property name="label" translatable="yes">Remember this in future</property>
+                        <property name="visible">False</property>
                         <property name="can_focus">True</property>
                         <property name="receives_default">False</property>
                         <property name="use_action_appearance">False</property>
-                        <property name="active">True</property>
+                        <property name="active">False</property>
                         <property name="draw_indicator">True</property>
                       </object>
                       <packing>
@@ -239,11 +254,26 @@
                         <property name="position">1</property>
                       </packing>
                     </child>
+                    <child>
+                      <object class="GtkCheckButton" id="relaunch_app">
+                        <property name="label" translatable="yes">Relaunch this application</property>
+                        <property name="visible">False</property>
+                        <property name="can_focus">True</property>
+                        <property name="receives_default">False</property>
+                        <property name="use_action_appearance">False</property>
+                        <property name="draw_indicator">True</property>
+                      </object>
+                      <packing>
+                        <property name="expand">False</property>
+                        <property name="fill">True</property>
+                        <property name="position">2</property>
+                      </packing>
+                    </child>
                   </object>
                   <packing>
                     <property name="expand">False</property>
                     <property name="fill">True</property>
-                    <property name="position">3</property>
+                    <property name="position">4</property>
                   </packing>
                 </child>
               </object>
@@ -304,19 +334,6 @@
                         <property name="position">1</property>
                       </packing>
                     </child>
-                    <child>
-                      <object class="GtkButton" id="cancel_button">
-                        <property name="label" translatable="yes">Cancel</property>
-                        <property name="can_focus">True</property>
-                        <property name="receives_default">True</property>
-                        <property name="use_action_appearance">False</property>
-                      </object>
-                      <packing>
-                        <property name="expand">False</property>
-                        <property name="fill">True</property>
-                        <property name="position">2</property>
-                      </packing>
-                    </child>
                   </object>
                 </child>
               </object>
@@ -332,8 +349,8 @@
                 <property name="can_focus">False</property>
                 <property name="spacing">6</property>
                 <child>
-                  <object class="GtkButton" id="closed_button">
-                    <property name="label" translatable="yes">Leave Closed</property>
+                  <object class="GtkButton" id="dont_send_button">
+                    <property name="label" translatable="yes">Don't send</property>
                     <property name="visible">True</property>
                     <property name="can_focus">True</property>
                     <property name="receives_default">True</property>
@@ -347,7 +364,7 @@
                 </child>
                 <child>
                   <object class="GtkButton" id="continue_button">
-                    <property name="label" translatable="yes">Continue</property>
+                    <property name="label" translatable="yes">Send</property>
                     <property name="visible">True</property>
                     <property name="can_focus">True</property>
                     <property name="receives_default">True</property>

=== modified file 'kde/apport-kde'
--- kde/apport-kde	2016-12-18 12:51:13 +0000
+++ kde/apport-kde	2018-06-25 16:12:21 +0000
@@ -369,7 +369,7 @@
 
         response = self.dialog.exec_()
 
-        return_value = {'report': False, 'blacklist': False,
+        return_value = {'report': False, 'blacklist': False, 'remember': False,
                         'restart': False, 'examine': False}
         if response == QDialog.Rejected:
             return return_value

=== modified file 'test/test_ui.py'
--- test/test_ui.py	2018-05-09 23:14:26 +0000
+++ test/test_ui.py	2018-06-25 16:12:21 +0000
@@ -502,7 +502,8 @@
         self.ui.present_details_response = {'report': False,
                                             'blacklist': False,
                                             'examine': False,
-                                            'restart': False}
+                                            'restart': False,
+                                            'remember': False}
         self.ui.run_argv()
         self.assertEqual(self.ui.offer_restart, True)
 
@@ -534,7 +535,8 @@
         self.ui.present_details_response = {'report': True,
                                             'blacklist': False,
                                             'examine': False,
-                                            'restart': False}
+                                            'restart': False,
+                                            'remember': False}
         self.assertEqual(self.ui.run_argv(), True)
 
         self.assertEqual(self.ui.msg_severity, None)
@@ -577,7 +579,8 @@
             self.ui.present_details_response = {'report': True,
                                                 'blacklist': False,
                                                 'examine': False,
-                                                'restart': False}
+                                                'restart': False,
+                                                'remember': False}
             self.assertEqual(self.ui.run_argv(), True)
         finally:
             # kill test process
@@ -691,7 +694,8 @@
         self.ui.present_details_response = {'report': True,
                                             'blacklist': False,
                                             'examine': False,
-                                            'restart': False}
+                                            'restart': False,
+                                            'remember': False}
         self.ui.run_argv()
 
         self.assertTrue(self.ui.report['Package'].startswith(apport.packaging.get_kernel_package()))
@@ -729,7 +733,8 @@
         self.ui.present_details_response = {'report': True,
                                             'blacklist': False,
                                             'examine': False,
-                                            'restart': False}
+                                            'restart': False,
+                                            'remember': False}
         self.assertEqual(self.ui.run_argv(), True)
 
         self.assertEqual(self.ui.msg_text, None)
@@ -788,7 +793,8 @@
         self.ui.present_details_response = {'report': False,
                                             'blacklist': False,
                                             'examine': False,
-                                            'restart': False}
+                                            'restart': False,
+                                            'remember': False}
         self.ui.run_crash(report_file)
         self.assertEqual(self.ui.msg_severity, None)
         self.assertEqual(self.ui.msg_title, None)
@@ -803,7 +809,8 @@
         self.ui.present_details_response = {'report': True,
                                             'blacklist': False,
                                             'examine': False,
-                                            'restart': False}
+                                            'restart': False,
+                                            'remember': False}
         self.ui.run_crash(report_file)
         self.assertEqual(self.ui.msg_severity, None, self.ui.msg_text)
         self.assertEqual(self.ui.msg_title, None)
@@ -832,7 +839,8 @@
         self.ui.present_details_response = {'report': False,
                                             'blacklist': True,
                                             'examine': False,
-                                            'restart': False}
+                                            'restart': False,
+                                            'remember': False}
         self.ui.run_crash(report_file)
         self.assertEqual(self.ui.msg_severity, None)
         self.assertEqual(self.ui.msg_title, None)
@@ -854,7 +862,8 @@
         self.ui.present_details_response = {'report': True,
                                             'blacklist': False,
                                             'examine': False,
-                                            'restart': False}
+                                            'restart': False,
+                                            'remember': False}
         self.ui.run_crash(report_file)
         self.assertEqual(self.ui.msg_severity, None, self.ui.msg_text)
 
@@ -890,7 +899,8 @@
         self.ui.present_details_response = {'report': True,
                                             'blacklist': False,
                                             'examine': False,
-                                            'restart': False}
+                                            'restart': False,
+                                            'remember': False}
         self.ui.run_crash(report_file)
         self.assertEqual(self.ui.msg_severity, 'info', self.ui.msg_text)
         self.assertTrue('decompress' in self.ui.msg_text)
@@ -908,7 +918,8 @@
         self.ui.present_details_response = {'report': True,
                                             'blacklist': False,
                                             'examine': False,
-                                            'restart': False}
+                                            'restart': False,
+                                            'remember': False}
 
         self.assertEqual(self.ui.run_argv(), True)
 
@@ -926,7 +937,8 @@
         self.ui.present_details_response = {'report': True,
                                             'blacklist': False,
                                             'examine': False,
-                                            'restart': False}
+                                            'restart': False,
+                                            'remember': False}
         self.assertEqual(self.ui.run_argv(), True)
 
         self.assertTrue('It stinks.' in self.ui.msg_text, '%s: %s' %
@@ -949,7 +961,8 @@
         self.ui.present_details_response = {'report': True,
                                             'blacklist': False,
                                             'examine': False,
-                                            'restart': False}
+                                            'restart': False,
+                                            'remember': False}
 
         self.ui.run_crash(self.report_file.name)
 
@@ -967,7 +980,8 @@
         self.ui.present_details_response = {'report': True,
                                             'blacklist': False,
                                             'examine': False,
-                                            'restart': False}
+                                            'restart': False,
+                                            'remember': False}
 
         self.ui.run_crash(self.report_file.name)
 
@@ -987,7 +1001,8 @@
         self.ui.present_details_response = {'report': True,
                                             'blacklist': False,
                                             'examine': False,
-                                            'restart': False}
+                                            'restart': False,
+                                            'remember': False}
 
         self.ui.run_crash(self.report_file.name)
 
@@ -1009,7 +1024,8 @@
         self.ui.present_details_response = {'report': True,
                                             'blacklist': False,
                                             'examine': False,
-                                            'restart': False}
+                                            'restart': False,
+                                            'remember': False}
 
         self.ui.run_crash(self.report_file.name)
 
@@ -1085,7 +1101,8 @@
         self.ui.present_details_response = {'report': False,
                                             'blacklist': False,
                                             'examine': False,
-                                            'restart': False}
+                                            'restart': False,
+                                            'remember': False}
         self.ui.run_crash(report_file)
         self.assertEqual(self.ui.msg_severity, None, 'has %s message: %s: %s' % (
             self.ui.msg_severity, str(self.ui.msg_title), str(self.ui.msg_text)))
@@ -1117,7 +1134,8 @@
         self.ui.present_details_response = {'report': True,
                                             'blacklist': False,
                                             'examine': False,
-                                            'restart': False}
+                                            'restart': False,
+                                            'remember': False}
         self.ui.run_crash(report_file)
         self.assertEqual(self.ui.cur_package, 'uninstalled_pkg')
         self.assertEqual(self.ui.msg_severity, None, 'has %s message: %s: %s' % (
@@ -1139,7 +1157,8 @@
         self.ui.present_details_response = {'report': True,
                                             'blacklist': False,
                                             'examine': False,
-                                            'restart': False}
+                                            'restart': False,
+                                            'remember': False}
         self.assertRaises(SystemExit, self.ui.run_crash, report_file)
 
         self.assertEqual(self.ui.msg_title, _('Invalid problem report'))
@@ -1159,7 +1178,8 @@
         self.ui.present_details_response = {'report': True,
                                             'blacklist': False,
                                             'examine': False,
-                                            'restart': False}
+                                            'restart': False,
+                                            'remember': False}
         self.ui.run_crash(report_file)
 
         self.assertEqual(self.ui.msg_title, _('Problem in bash'))
@@ -1199,7 +1219,8 @@
         self.ui.present_details_response = {'report': True,
                                             'blacklist': False,
                                             'examine': False,
-                                            'restart': False}
+                                            'restart': False,
+                                            'remember': False}
         self.ui.run_crash(report_file)
 
         self.assertFalse('ExecutableTimestamp' in self.ui.report)
@@ -1230,7 +1251,8 @@
         self.ui.present_details_response = {'report': False,
                                             'blacklist': False,
                                             'examine': False,
-                                            'restart': False}
+                                            'restart': False,
+                                            'remember': False}
         self.ui.run_crash(report_file)
         self.assertEqual(self.ui.msg_severity, None)
         self.assertEqual(self.ui.msg_title, None)
@@ -1245,7 +1267,8 @@
         self.ui.present_details_response = {'report': True,
                                             'blacklist': False,
                                             'examine': False,
-                                            'restart': False}
+                                            'restart': False,
+                                            'remember': False}
         self.ui.run_crash(report_file)
         self.assertEqual(self.ui.msg_severity, None)
         self.assertEqual(self.ui.msg_title, None)
@@ -1292,7 +1315,8 @@
         self.ui.present_details_response = {'report': False,
                                             'blacklist': False,
                                             'examine': False,
-                                            'restart': False}
+                                            'restart': False,
+                                            'remember': False}
         self.ui.run_crash(report_file)
         self.assertEqual(self.ui.msg_severity, None, 'error: %s - %s' %
                          (self.ui.msg_title, self.ui.msg_text))
@@ -1308,7 +1332,8 @@
         self.ui.present_details_response = {'report': True,
                                             'blacklist': False,
                                             'examine': False,
-                                            'restart': False}
+                                            'restart': False,
+                                            'remember': False}
         self.ui.run_crash(report_file)
         self.assertEqual(self.ui.msg_severity, None, str(self.ui.msg_title) +
                          ' ' + str(self.ui.msg_text))
@@ -1336,7 +1361,8 @@
         self.ui.present_details_response = {'report': True,
                                             'blacklist': False,
                                             'examine': False,
-                                            'restart': False}
+                                            'restart': False,
+                                            'remember': False}
         self.ui.run_crash(report_file)
         self.assertEqual(self.ui.msg_severity, None, self.ui.msg_text)
 
@@ -1390,7 +1416,8 @@
             self.ui.present_details_response = {'report': True,
                                                 'blacklist': False,
                                                 'examine': False,
-                                                'restart': False}
+                                                'restart': False,
+                                                'remember': False}
             self.ui.run_crash(report_file)
             self.assertEqual(self.ui.msg_severity, None, self.ui.msg_text)
 
@@ -1424,7 +1451,8 @@
             self.ui.present_details_response = {'report': True,
                                                 'blacklist': False,
                                                 'examine': False,
-                                                'restart': False}
+                                                'restart': False,
+                                                'remember': False}
             self.ui.run_crash(report_file)
             self.assertEqual(self.ui.msg_severity, None, self.ui.msg_text)
 
@@ -1464,7 +1492,8 @@
             self.ui.present_details_response = {'report': True,
                                                 'blacklist': False,
                                                 'examine': False,
-                                                'restart': False}
+                                                'restart': False,
+                                                'remember': False}
             self.ui.run_crash(report_file)
             self.assertEqual(self.ui.msg_severity, None, self.ui.msg_text)
 
@@ -1484,7 +1513,8 @@
         self.ui.present_details_response = {'report': True,
                                             'blacklist': False,
                                             'examine': False,
-                                            'restart': False}
+                                            'restart': False,
+                                            'remember': False}
 
         # known without URL
         with open(report_file, 'wb') as f:
@@ -1499,7 +1529,8 @@
         self.ui.present_details_response = {'report': True,
                                             'blacklist': False,
                                             'examine': False,
-                                            'restart': False}
+                                            'restart': False,
+                                            'remember': False}
         # known with URL
         with open(report_file, 'wb') as f:
             r.write(f)
@@ -1525,7 +1556,8 @@
         self.ui.present_details_response = {'report': True,
                                             'blacklist': False,
                                             'examine': False,
-                                            'restart': False}
+                                            'restart': False,
+                                            'remember': False}
         self.ui.run_crash(report_file)
         self.assertEqual(self.ui.opened_url, 'http://coreutils.bugs.example.com/%i' % self.ui.crashdb.latest_id())
         # internal key should not be uploaded to the crash db
@@ -1564,7 +1596,8 @@
         self.ui.present_details_response = {'report': True,
                                             'blacklist': False,
                                             'examine': False,
-                                            'restart': False}
+                                            'restart': False,
+                                            'remember': False}
         self.ui.run_crashes()
 
         if os.getuid() != 0:
@@ -1611,7 +1644,8 @@
         self.ui.present_details_response = {'report': True,
                                             'blacklist': False,
                                             'examine': False,
-                                            'restart': False}
+                                            'restart': False,
+                                            'remember': False}
 
         self.ui.crashdb.download(1)['SourcePackage'] = 'bash'
         self.ui.crashdb.download(1)['Package'] = 'bash'
@@ -1634,7 +1668,8 @@
         self.ui.present_details_response = {'report': True,
                                             'blacklist': False,
                                             'examine': False,
-                                            'restart': False}
+                                            'restart': False,
+                                            'remember': False}
 
         self.assertEqual(self.ui.run_argv(), True)
         self.assertEqual(self.ui.msg_severity, None, self.ui.msg_text)
@@ -1656,7 +1691,8 @@
         self.ui.present_details_response = {'report': True,
                                             'blacklist': False,
                                             'examine': False,
-                                            'restart': False}
+                                            'restart': False,
+                                            'remember': False}
 
         self.assertEqual(self.ui.run_argv(), True)
         self.assertEqual(self.ui.msg_severity, None, self.ui.msg_text)
@@ -1677,7 +1713,8 @@
         self.ui.present_details_response = {'report': True,
                                             'blacklist': False,
                                             'examine': False,
-                                            'restart': False}
+                                            'restart': False,
+                                            'remember': False}
 
         with open(os.path.join(self.hookdir, 'source_foo.py'), 'w') as f:
             f.write('def add_info(r, ui):\n  r["MachineType"]="Laptop"\n')
@@ -1712,7 +1749,8 @@
         self.ui.present_details_response = {'report': True,
                                             'blacklist': False,
                                             'examine': False,
-                                            'restart': False}
+                                            'restart': False,
+                                            'remember': False}
 
         with open(os.path.join(self.hookdir, 'source_%s.py' % kernel_src), 'w') as f:
             f.write('def add_info(r, ui):\n  r["MachineType"]="Laptop"\n')
@@ -1742,7 +1780,8 @@
         self.ui.present_details_response = {'report': False,
                                             'blacklist': False,
                                             'examine': False,
-                                            'restart': False}
+                                            'restart': False,
+                                            'remember': False}
         self._run_hook('''report['begin'] = '1'
 ui.information('InfoText')
 report['end'] = '1'
@@ -1757,7 +1796,8 @@
         self.ui.present_details_response = {'report': False,
                                             'blacklist': False,
                                             'examine': False,
-                                            'restart': False}
+                                            'restart': False,
+                                            'remember': False}
         self.ui.question_yesno_response = True
         self._run_hook('''report['begin'] = '1'
 report['answer'] = str(ui.yesno('YesNo?'))
@@ -1784,7 +1824,8 @@
         self.ui.present_details_response = {'report': False,
                                             'blacklist': False,
                                             'examine': False,
-                                            'restart': False}
+                                            'restart': False,
+                                            'remember': False}
         self.ui.question_file_response = '/etc/fstab'
         self._run_hook('''report['begin'] = '1'
 report['answer'] = str(ui.file('YourFile?'))
@@ -1806,7 +1847,8 @@
         self.ui.present_details_response = {'report': False,
                                             'blacklist': False,
                                             'examine': False,
-                                            'restart': False}
+                                            'restart': False,
+                                            'remember': False}
         self.ui.question_choice_response = [1]
         self._run_hook('''report['begin'] = '1'
 report['answer'] = str(ui.choice('YourChoice?', ['foo', 'bar']))
@@ -1840,7 +1882,8 @@
         self.ui.present_details_response = {'report': True,
                                             'blacklist': False,
                                             'examine': False,
-                                            'restart': False}
+                                            'restart': False,
+                                            'remember': False}
         self.assertEqual(self.ui.run_argv(), True)
         self.assertTrue('foobar" is not known' in self.ui.msg_text)
         self.assertEqual(self.ui.msg_severity, 'error')
@@ -1892,7 +1935,8 @@
         self.ui.present_details_response = {'report': True,
                                             'blacklist': False,
                                             'examine': False,
-                                            'restart': False}
+                                            'restart': False,
+                                            'remember': False}
         self.assertEqual(self.ui.run_argv(), True)
         self.assertEqual(self.ui.msg_text, None)
         self.assertEqual(self.ui.msg_severity, None)
@@ -1910,7 +1954,8 @@
         self.ui.present_details_response = {'report': True,
                                             'blacklist': False,
                                             'examine': False,
-                                            'restart': False}
+                                            'restart': False,
+                                            'remember': False}
         self.assertEqual(self.ui.run_argv(), True)
         self.assertEqual(self.ui.msg_text, None)
         self.assertEqual(self.ui.msg_severity, None)
@@ -1932,7 +1977,8 @@
         self.ui.present_details_response = {'report': True,
                                             'blacklist': False,
                                             'examine': False,
-                                            'restart': False}
+                                            'restart': False,
+                                            'remember': False}
         self.ui.question_yesno_response = True
         self.assertEqual(self.ui.run_argv(), True)
         self.assertTrue(self.ui.present_details_shown)
@@ -1963,7 +2009,8 @@
         self.ui.present_details_response = {'report': True,
                                             'blacklist': False,
                                             'examine': False,
-                                            'restart': False}
+                                            'restart': False,
+                                            'remember': False}
 
         self.ui.question_choice_response = None
         self.assertEqual(self.ui.run_argv(), True)
@@ -2210,7 +2257,8 @@
         self.ui.present_details_response = {'report': True,
                                             'blacklist': False,
                                             'examine': False,
-                                            'restart': False}
+                                            'restart': False,
+                                            'remember': False}
         self.assertEqual(self.ui.run_argv(), True)
 
         self.assertEqual(self.ui.msg_severity, None)

=== modified file 'test/test_ui_gtk.py'
--- test/test_ui_gtk.py	2016-12-18 12:51:13 +0000
+++ test/test_ui_gtk.py	2018-06-25 16:12:21 +0000
@@ -89,7 +89,6 @@
 
         def c(*args):
             self.app.w('dialog_crash_new').destroy()
-        self.app.w('send_error_report').set_active(True)
         GLib.idle_add(c)
         result = self.app.ui_present_report_details(True)
         self.assertFalse(result['report'])
@@ -98,10 +97,11 @@
         '''
         +-----------------------------------------------------------------+
         | [ logo] YourDistro has experienced an internal error.           |
-        |                                                                 |
-        |            [x] Send an error report to help fix this problem.   |
-        |                                                                 |
-        | [ Show Details ]                                   [ Continue ] |
+        |            Send problem report to the developers?               |
+        |                                                                 |
+        |            [ ] Remember this in future                          |
+        |                                                                 |
+        | [ Show Details ]                      [ Don't send ]   [ Send ] |
         +-----------------------------------------------------------------+
         '''
         self.app.report['ProblemType'] = 'KernelCrash'
@@ -110,14 +110,15 @@
         self.assertEqual(self.app.w('dialog_crash_new').get_title(), self.distro)
         self.assertEqual(self.app.w('title_label').get_text(),
                          _('Sorry, %s has experienced an internal error.') % self.distro)
-        send_error_report = self.app.w('send_error_report')
-        self.assertTrue(send_error_report.get_property('visible'))
-        self.assertTrue(send_error_report.get_active())
+        self.assertTrue(self.app.w('send_problem_notice_label').get_property('visible'))
+        remember_send_error_report = self.app.w('remember_send_report_choice')
+        self.assertTrue(remember_send_error_report.get_property('visible'))
+        self.assertFalse(remember_send_error_report.get_active())
         self.assertTrue(self.app.w('show_details').get_property('visible'))
+        self.assertTrue(self.app.w('dont_send_button').get_property('visible'))
         self.assertTrue(self.app.w('continue_button').get_property('visible'))
         self.assertEqual(self.app.w('continue_button').get_label(),
-                         _('Continue'))
-        self.assertFalse(self.app.w('closed_button').get_property('visible'))
+                         _('Send'))
         self.assertFalse(self.app.w('subtitle_label').get_property('visible'))
         self.assertFalse(self.app.w('ignore_future_problems').get_property('visible'))
 
@@ -125,11 +126,12 @@
         '''
         +-----------------------------------------------------------------+
         | [ error  ] Sorry, a problem occurred while installing software. |
+        |            Send problem report to the developers?               |
         |            Package: apport 1.2.3~0ubuntu1                       |
         |                                                                 |
-        |            [x] Send an error report to help fix this problem.   |
+        |            [ ] Remember this in future                          |
         |                                                                 |
-        | [ Show Details ]                                   [ Continue ] |
+        | [ Show Details ]                      [ Don't send ]   [ Send ] |
         +-----------------------------------------------------------------+
         '''
         self.app.report['ProblemType'] = 'Package'
@@ -139,36 +141,50 @@
         self.assertEqual(self.app.w('dialog_crash_new').get_title(), self.distro)
         self.assertEqual(self.app.w('title_label').get_text(),
                          _('Sorry, a problem occurred while installing software.'))
-        send_error_report = self.app.w('send_error_report')
-        self.assertTrue(send_error_report.get_property('visible'))
-        self.assertTrue(send_error_report.get_active())
+        self.assertTrue(self.app.w('send_problem_notice_label').get_property('visible'))
+        remember_send_error_report = self.app.w('remember_send_report_choice')
+        self.assertTrue(remember_send_error_report.get_property('visible'))
+        self.assertFalse(remember_send_error_report.get_active())
         self.assertTrue(self.app.w('show_details').get_property('visible'))
+        self.assertTrue(self.app.w('dont_send_button').get_property('visible'))
         self.assertTrue(self.app.w('continue_button').get_property('visible'))
         self.assertEqual(self.app.w('continue_button').get_label(),
-                         _('Continue'))
-        self.assertFalse(self.app.w('closed_button').get_property('visible'))
+                         _('Send'))
         self.assertTrue(self.app.w('subtitle_label').get_property('visible'))
         self.assertEqual(self.app.w('subtitle_label').get_text(),
                          _('Package: apport 1.2.3~0ubuntu1'))
 
     def test_regular_crash_thread_layout(self):
         '''A thread of execution has failed, but the application persists.'''
+        '''
+        +-----------------------------------------------------------------+
+        | [ logo] YourDistro has experienced an internal error.           |
+        |            Send problem report to the developers?               |
+        |            If you notice further problems, try restarting the   |
+        |            computer.                                            |
+        |                                                                 |
+        |            [ ] Remember this in future                          |
+        |                                                                 |
+        | [ Show Details ]                      [ Don't send ]   [ Send ] |
+        +-----------------------------------------------------------------+
+        '''
         self.app.report['ProblemType'] = 'Crash'
         self.app.report['ProcStatus'] = 'Name:\tupstart\nPid:\t1'
         GLib.idle_add(Gtk.main_quit)
         self.app.ui_present_report_details(True)
-        self.assertFalse(self.app.w('closed_button').get_property('visible'))
-        self.assertEqual(self.app.w('continue_button').get_label(), _('Continue'))
+        self.assertTrue(self.app.w('dont_send_button').get_property('visible'))
+        self.assertEqual(self.app.w('continue_button').get_label(), _('Send'))
 
     def test_regular_crash_layout(self):
         '''
         +-----------------------------------------------------------------+
         | [ apport ] The application Apport has closed unexpectedly.      |
-        |                                                                 |
-        |            [x] Send an error report to help fix this problem.   |
-        |            [ ] Ignore future problems of this program version.  |
-        |                                                                 |
-        | [ Show Details ]                                   [ Continue ] |
+        |            Send problem report to the developers?               |
+        |                                                                 |
+        |            [ ] Remember this in future                          |
+        |            [ ] Ignore future problems of this program version   |
+        |                                                                 |
+        | [ Show Details ]                      [ Don't send ]   [ Send ] |
         +-----------------------------------------------------------------+
         '''
         self.app.report['ProblemType'] = 'Crash'
@@ -186,15 +202,16 @@
         self.assertEqual(self.app.w('dialog_crash_new').get_title(), self.distro)
         self.assertEqual(self.app.w('title_label').get_text(),
                          _('The application Apport has closed unexpectedly.'))
-        send_error_report = self.app.w('send_error_report')
-        self.assertTrue(send_error_report.get_property('visible'))
-        self.assertTrue(send_error_report.get_active())
+        self.assertTrue(self.app.w('send_problem_notice_label').get_property('visible'))
+        remember_send_error_report = self.app.w('remember_send_report_choice')
+        self.assertTrue(remember_send_error_report.get_property('visible'))
+        self.assertFalse(remember_send_error_report.get_active())
         self.assertTrue(self.app.w('show_details').get_property('visible'))
+        self.assertTrue(self.app.w('dont_send_button').get_property('visible'))
         # no ProcCmdline, cannot restart
         self.assertTrue(self.app.w('continue_button').get_property('visible'))
         self.assertEqual(self.app.w('continue_button').get_label(),
-                         _('Continue'))
-        self.assertFalse(self.app.w('closed_button').get_property('visible'))
+                         _('Send'))
         self.assertFalse(self.app.w('subtitle_label').get_property('visible'))
         self.assertTrue(self.app.w('ignore_future_problems').get_property('visible'))
         self.assertTrue(self.app.w('ignore_future_problems').get_label().endswith(
@@ -204,11 +221,13 @@
         '''
         +-----------------------------------------------------------------+
         | [ apport ] The application Apport has closed unexpectedly.      |
-        |                                                                 |
-        |            [x] Send an error report to help fix this problem.   |
-        |            [ ] Ignore future problems of this program version.  |
-        |                                                                 |
-        | [ Show Details ]                 [ Leave Closed ]  [ Relaunch ] |
+        |            Send problem report to the developers?               |
+        |                                                                 |
+        |            [ ] Remember this in future                          |
+        |            [ ] Ignore future problems of this program version   |
+        |            [X] Relaunch this application                        |
+        |                                                                 |
+        | [ Show Details ]                      [ Don't send ]   [ Send ] |
         +-----------------------------------------------------------------+
         '''
         # pretend we got called through run_crashes() which sets offer_restart
@@ -229,28 +248,32 @@
         self.assertEqual(self.app.w('dialog_crash_new').get_title(), self.distro)
         self.assertEqual(self.app.w('title_label').get_text(),
                          _('The application Apport has closed unexpectedly.'))
-        send_error_report = self.app.w('send_error_report')
-        self.assertTrue(send_error_report.get_property('visible'))
-        self.assertTrue(send_error_report.get_active())
+        self.assertTrue(self.app.w('send_problem_notice_label').get_property('visible'))
+        remember_send_error_report = self.app.w('remember_send_report_choice')
+        self.assertTrue(remember_send_error_report.get_property('visible'))
+        self.assertFalse(remember_send_error_report.get_active())
         self.assertTrue(self.app.w('show_details').get_property('visible'))
+        self.assertTrue(self.app.w('dont_send_button').get_property('visible'))
         self.assertTrue(self.app.w('continue_button').get_property('visible'))
         self.assertEqual(self.app.w('continue_button').get_label(),
-                         _('Relaunch'))
-        self.assertTrue(self.app.w('closed_button').get_property('visible'))
+                         _('Send'))
         self.assertFalse(self.app.w('subtitle_label').get_property('visible'))
         self.assertTrue(self.app.w('ignore_future_problems').get_property('visible'))
         self.assertTrue(self.app.w('ignore_future_problems').get_label().endswith(
             'of this program version'))
+        self.assertTrue(self.app.w('relaunch_app').get_property('visible'))
+        self.assertTrue(self.app.w('relaunch_app').get_active())
 
     def test_regular_crash_layout_norestart(self):
         '''
         +-----------------------------------------------------------------+
         | [ apport ] The application Apport has closed unexpectedly.      |
+        |            Send problem report to the developers?               |
         |                                                                 |
-        |            [x] Send an error report to help fix this problem.   |
+        |            [ ] Remember this in future                          |
         |            [ ] Ignore future problems of this program version.  |
         |                                                                 |
-        | [ Show Details ]                                   [ Continue ] |
+        | [ Show Details ]                      [ Don't send ]   [ Send ] |
         +-----------------------------------------------------------------+
         '''
         # pretend we did not get called through run_crashes(), thus no offer_restart
@@ -270,19 +293,28 @@
         self.assertEqual(self.app.w('dialog_crash_new').get_title(), self.distro)
         self.assertEqual(self.app.w('title_label').get_text(),
                          _('The application Apport has closed unexpectedly.'))
+        self.assertTrue(self.app.w('send_problem_notice_label').get_property('visible'))
+        remember_send_error_report = self.app.w('remember_send_report_choice')
+        self.assertTrue(remember_send_error_report.get_property('visible'))
+        self.assertFalse(remember_send_error_report.get_active())
+        self.assertTrue(self.app.w('show_details').get_property('visible'))
+        self.assertTrue(self.app.w('dont_send_button').get_property('visible'))
         self.assertTrue(self.app.w('continue_button').get_property('visible'))
         self.assertEqual(self.app.w('continue_button').get_label(),
-                         _('Continue'))
-        self.assertFalse(self.app.w('closed_button').get_property('visible'))
+                         _('Send'))
 
     def test_hang_layout(self):
         '''
         +-----------------------------------------------------------------+
         | [ apport ] The application Apport has stopped responding.       |
-        |                                                                 |
-        |            [x] Send an error report to help fix this problem.   |
-        |                                                                 |
-        | [ Show Details ]                 [ Force Closed ]  [ Relaunch ] |
+        |            Send problem report to the developers?               |
+        |            You can wait to see if it wakes up, or close, or     |
+        |            relaunch it.                                         |
+        |                                                                 |
+        |            [ ] Remember this in future                          |
+        |            [X] Relaunch this application                        |
+        |                                                                 |
+        | [ Show Details ]                      [ Don't send ]   [ Send ] |
         +-----------------------------------------------------------------+
         '''
         # pretend we got called through run_crashes() which sets offer_restart
@@ -305,16 +337,15 @@
         self.assertEqual(self.app.w('subtitle_label').get_text(),
                          _('You can wait to see if it wakes up, or close or '
                            'relaunch it.'))
-        send_error_report = self.app.w('send_error_report')
-        self.assertTrue(send_error_report.get_property('visible'))
-        self.assertTrue(send_error_report.get_active())
+        self.assertTrue(self.app.w('send_problem_notice_label').get_property('visible'))
+        remember_send_error_report = self.app.w('remember_send_report_choice')
+        self.assertTrue(remember_send_error_report.get_property('visible'))
+        self.assertFalse(remember_send_error_report.get_active())
         self.assertTrue(self.app.w('show_details').get_property('visible'))
+        self.assertTrue(self.app.w('dont_send_button').get_property('visible'))
         self.assertTrue(self.app.w('continue_button').get_property('visible'))
         self.assertEqual(self.app.w('continue_button').get_label(),
-                         _('Relaunch'))
-        self.assertTrue(self.app.w('closed_button').get_property('visible'))
-        self.assertEqual(self.app.w('closed_button').get_label(),
-                         _('Force Closed'))
+                         _('Send'))
         self.assertTrue(self.app.w('subtitle_label').get_property('visible'))
         self.assertFalse(self.app.w('ignore_future_problems').get_property('visible'))
 
@@ -322,13 +353,14 @@
         '''
         +---------------------------------------------------------------+
         | [ logo ] Sorry, YourDistro has experienced an internal error. |
+        |          Send problem report to the developers?               |
         |          If you notice further problems, try restarting the   |
         |          computer                                             |
         |                                                               |
-        |            [x] Send an error report to help fix this problem. |
+        |            [ ] Remember this in future                        |
         |            [ ] Ignore future problems of this type.           |
         |                                                               |
-        | [ Show Details ]                                 [ Continue ] |
+        | [ Show Details ]                    [ Don't send ]   [ Send ] |
         +---------------------------------------------------------------+
         '''
         self.app.report['ProblemType'] = 'Crash'
@@ -342,14 +374,15 @@
         self.assertEqual(self.app.w('subtitle_label').get_text(),
                          _('If you notice further problems, try restarting the computer.'))
         self.assertTrue(self.app.w('subtitle_label').get_property('visible'))
-        send_error_report = self.app.w('send_error_report')
-        self.assertTrue(send_error_report.get_property('visible'))
-        self.assertTrue(send_error_report.get_active())
+        self.assertTrue(self.app.w('send_problem_notice_label').get_property('visible'))
+        remember_send_error_report = self.app.w('remember_send_report_choice')
+        self.assertTrue(remember_send_error_report.get_property('visible'))
+        self.assertFalse(remember_send_error_report.get_active())
         self.assertTrue(self.app.w('show_details').get_property('visible'))
+        self.assertTrue(self.app.w('dont_send_button').get_property('visible'))
         self.assertTrue(self.app.w('continue_button').get_property('visible'))
         self.assertEqual(self.app.w('continue_button').get_label(),
-                         _('Continue'))
-        self.assertFalse(self.app.w('closed_button').get_property('visible'))
+                         _('Send'))
         self.assertTrue(self.app.w('ignore_future_problems').get_property('visible'))
         self.assertTrue(self.app.w('ignore_future_problems').get_label().endswith(
             'of this type'))
@@ -358,12 +391,13 @@
         '''
         +-------------------------------------------------------------------+
         | [ ubuntu ] Sorry, the application apport has closed unexpectedly. |
+        |            Send problem report to the developers?                 |
         |            If you notice further problems, try restarting the     |
         |            computer                                               |
         |                                                                   |
-        |            [x] Send an error report to help fix this problem.     |
+        |            [ ] Remember this in future                            |
         |                                                                   |
-        | [ Show Details ]                                     [ Continue ] |
+        | [ Show Details ]                      [ Don't send ]   [ Send ]   |
         +-------------------------------------------------------------------+
         '''
         self.app.report['ProblemType'] = 'Crash'
@@ -382,14 +416,15 @@
         self.assertEqual(self.app.w('subtitle_label').get_text(),
                          _('If you notice further problems, try restarting the computer.'))
         self.assertTrue(self.app.w('subtitle_label').get_property('visible'))
-        send_error_report = self.app.w('send_error_report')
-        self.assertTrue(send_error_report.get_property('visible'))
-        self.assertTrue(send_error_report.get_active())
+        self.assertTrue(self.app.w('send_problem_notice_label').get_property('visible'))
+        remember_send_error_report = self.app.w('remember_send_report_choice')
+        self.assertTrue(remember_send_error_report.get_property('visible'))
+        self.assertFalse(remember_send_error_report.get_active())
         self.assertTrue(self.app.w('show_details').get_property('visible'))
+        self.assertTrue(self.app.w('dont_send_button').get_property('visible'))
         self.assertTrue(self.app.w('continue_button').get_property('visible'))
         self.assertEqual(self.app.w('continue_button').get_label(),
-                         _('Continue'))
-        self.assertFalse(self.app.w('closed_button').get_property('visible'))
+                         _('Send'))
 
         del self.app.report['ExecutablePath']
         GLib.idle_add(Gtk.main_quit)
@@ -405,10 +440,11 @@
         '''
         +---------------------------------------------------------------------+
         | [ apport ] The application Apport has closed unexpectedly.          |
-        |                                                                     |
-        |            [x] Send an error report to help fix this problem.       |
-        |                                                                     |
-        | [ Show Details ] [ Examine locally ]  [ Leave Closed ] [ Relaunch ] |
+        |            Send problem report to the developers?                   |
+        |                                                                     |
+        |            [ ] Remember this in future                              |
+        |                                                                     |
+        | [ Show Details ] [ Examine locally ]      [ Don't send ]   [ Send ] |
         +---------------------------------------------------------------------+
         '''
         self.app.report['ProblemType'] = 'Crash'
@@ -435,7 +471,7 @@
         |            | ...                                                | |
         |            +----------------------------------------------------+ |
         |                                                                   |
-        | [ Cancel ]                                               [ Send ] |
+        |                                         [ Don't send ]   [ Send ] |
         +-------------------------------------------------------------------+
         '''
         self.app.report_file = None
@@ -444,15 +480,15 @@
         self.assertEqual(self.app.w('title_label').get_text(),
                          _('Send problem report to the developers?'))
         self.assertFalse(self.app.w('subtitle_label').get_property('visible'))
-        send_error_report = self.app.w('send_error_report')
-        self.assertFalse(send_error_report.get_property('visible'))
-        self.assertTrue(send_error_report.get_active())
+        self.assertFalse(self.app.w('send_problem_notice_label').get_property('visible'))
+        remember_send_error_report = self.app.w('remember_send_report_choice')
+        self.assertFalse(remember_send_error_report.get_property('visible'))
+        self.assertFalse(remember_send_error_report.get_active())
         self.assertFalse(self.app.w('show_details').get_property('visible'))
         self.assertTrue(self.app.w('continue_button').get_property('visible'))
         self.assertEqual(self.app.w('continue_button').get_label(),
                          _('Send'))
-        self.assertFalse(self.app.w('closed_button').get_property('visible'))
-        self.assertTrue(self.app.w('cancel_button').get_property('visible'))
+        self.assertTrue(self.app.w('dont_send_button').get_property('visible'))
         self.assertTrue(self.app.w('details_scrolledwindow').get_property('visible'))
         self.assertTrue(self.app.w('dialog_crash_new').get_resizable())
 
@@ -469,15 +505,15 @@
         self.assertEqual(self.app.w('title_label').get_text(),
                          _('Send problem report to the developers?'))
         self.assertFalse(self.app.w('subtitle_label').get_property('visible'))
-        send_error_report = self.app.w('send_error_report')
-        self.assertFalse(send_error_report.get_property('visible'))
-        self.assertTrue(send_error_report.get_active())
+        self.assertFalse(self.app.w('send_problem_notice_label').get_property('visible'))
+        remember_send_error_report = self.app.w('remember_send_report_choice')
+        self.assertFalse(remember_send_error_report.get_property('visible'))
+        self.assertFalse(remember_send_error_report.get_active())
         self.assertFalse(self.app.w('show_details').get_property('visible'))
         self.assertTrue(self.app.w('continue_button').get_property('visible'))
         self.assertEqual(self.app.w('continue_button').get_label(),
                          _('Send'))
-        self.assertFalse(self.app.w('closed_button').get_property('visible'))
-        self.assertTrue(self.app.w('cancel_button').get_property('visible'))
+        self.assertTrue(self.app.w('dont_send_button').get_property('visible'))
         self.assertTrue(self.app.w('details_scrolledwindow').get_property('visible'))
         self.assertTrue(self.app.w('dialog_crash_new').get_resizable())
 
@@ -485,11 +521,12 @@
         '''
         +-----------------------------------------------------------------+
         | [ logo ] The application Foo has experienced an internal error. |
+        |            Send problem report to the developers?               |
         |          Developer-specified error text.                        |
         |                                                                 |
-        |            [x] Send an error report to help fix this problem.   |
+        |            [ ] Remember this in future                          |
         |                                                                 |
-        | [ Show Details ]                                   [ Continue ] |
+        | [ Show Details ]                      [ Don't send ]   [ Send ] |
         +-----------------------------------------------------------------+
         '''
         self.app.report['ProblemType'] = 'RecoverableProblem'
@@ -511,21 +548,22 @@
         msg = 'Some developer-specified error text.'
         self.assertEqual(self.app.w('subtitle_label').get_text(), msg)
         self.assertTrue(self.app.w('subtitle_label').get_property('visible'))
-        send_error_report = self.app.w('send_error_report')
-        self.assertTrue(send_error_report.get_property('visible'))
-        self.assertTrue(send_error_report.get_active())
+        self.assertTrue(self.app.w('send_problem_notice_label').get_property('visible'))
+        remember_send_error_report = self.app.w('remember_send_report_choice')
+        self.assertTrue(remember_send_error_report.get_property('visible'))
+        self.assertFalse(remember_send_error_report.get_active())
         self.assertTrue(self.app.w('show_details').get_property('visible'))
         self.assertTrue(self.app.w('continue_button').get_property('visible'))
         self.assertEqual(self.app.w('continue_button').get_label(),
-                         _('Continue'))
-        self.assertFalse(self.app.w('closed_button').get_property('visible'))
+                         _('Send'))
 
     def test_administrator_disabled_reporting(self):
         GLib.idle_add(Gtk.main_quit)
         self.app.ui_present_report_details(False)
-        send_error_report = self.app.w('send_error_report')
-        self.assertFalse(send_error_report.get_property('visible'))
-        self.assertFalse(send_error_report.get_active())
+        self.assertFalse(self.app.w('send_problem_notice_label').get_property('visible'))
+        remember_send_error_report = self.app.w('remember_send_report_choice')
+        self.assertFalse(remember_send_error_report.get_property('visible'))
+        self.assertFalse(remember_send_error_report.get_active())
 
     @patch.object(GTKUserInterface, 'open_url')
     @patch.object(GTKUserInterface, 'ui_start_upload_progress')
@@ -759,9 +797,9 @@
         '''Bug report for installed package'''
 
         def c(*args):
-            if not self.app.w('cancel_button').get_visible():
+            if not self.app.w('dont_send_button').get_visible():
                 return True
-            self.app.w('cancel_button').clicked()
+            self.app.w('dont_send_button').clicked()
             return False
 
         self.app.report_file = None
@@ -778,9 +816,9 @@
         '''Bug report for uninstalled package'''
 
         def c(*args):
-            if not self.app.w('cancel_button').get_visible():
+            if not self.app.w('dont_send_button').get_visible():
                 return True
-            self.app.w('cancel_button').clicked()
+            self.app.w('dont_send_button').clicked()
             return False
 
         pkg = apport.packaging.get_uninstalled_package()


Follow ups