def __init__( self, app_id: str, # TODO: replace with config_reader config: Dict, config_reader: ConfigReader, logger: logging.Logger, application_info_matcher: ApplicationInfoMatcher, activity_reader: ActivityReader, files_provider: FilesProvider) -> None: super().__init__() self.logger = logger self.config_reader = config_reader self.connection = Gio.bus_get_sync(Gio.BusType.SESSION, None) self.screen_saver_bus_names = self.__dbus_get_screen_saver_bus_names() self.files_provider = files_provider language = get(config, 'language') or 'en' self.localizator = Localizator(self.files_provider.i18n_dir, language) self.theme = get(config, 'theme') or 'dark' self.active_icon = self.get_icon(IconState.ACTIVE) self.disabled_icon = self.get_icon(IconState.DISABLED) self.tray_icon = TrayIcon(app_id, self.disabled_icon, self.create_tray_menu()) self.screen: Optional[Wnck.Screen] = None self.main_loop: Optional[GObject.MainLoop] = None self.name_changed_handler_id = None self.previous_active_window_name: Optional[str] = None self.previous_wm_class: Optional[str] = None self.overtime_timer = \ Timer('overtime_timer', handler=self.overtime_timer_handler, interval_ms=1 * 60 * 1000, repeat=True) self.break_timer = \ Timer('break_timer', handler=self.break_timer_handler, interval_ms=1 * 60 * 1000, repeat=True) self.distracting_app_timer = \ Timer('distracting_app_timer', handler=self.distracting_app_timer_handler, interval_ms=1 * 60 * 1000, repeat=True) self.event = BaseEventEmitter() self.event.on(ApplicationEvent.DISTRACTING_APP_OVERTIME.value, self.show_distracting_app_overtime_notification) self.start_time = datetime.now() self.is_work_time = False self.is_work_time_update_time = self.start_time self.last_overtime_notification: Optional[Notification] = None self.last_break_notification: Optional[Notification] = None self.last_lock_screen_time: Optional[datetime] = None self.is_lock_screen_activated = False self.has_distracting_app_overtime_notification_shown = False self.is_overtime_notification_allowed_to_show = True self.is_break_notification_allowed_to_show = True self.user_work_time_hour_limit = config_reader.get_work_time_limit() self.user_breaks_interval_hours = get( config, 'time_limits.breaks_interval_hours') or 3 self.user_distracting_apps_mins = config_reader.get_distracting_apps_mins( ) self.writer = ActivityWriter(self.files_provider) self.app_info_matcher = application_info_matcher today_raw_data_file_path = self.files_provider.get_raw_data_file_path( date.today()) self.holder = ActivityStatHolder( activity_reader.read(today_raw_data_file_path)) self.holder.initialize_stats(self.app_info_matcher.detailed_app_infos) self.holder.initialize_stats( self.app_info_matcher.distracting_app_infos) self.current_activity: Optional[Activity] = None self.writer.event.on(ActivityWriter.NEW_DAY_EVENT, self.on_new_day_started) self.logger.debug( f'Set user work time limit to [{self.user_work_time_hour_limit}] hours' ) self.logger.debug( f'Set user user breaks interval to [{self.user_breaks_interval_hours}] hours' ) Notify.init(app_id) self.__dbus_subscribe_to_screen_saver_signals() start_msg = self.localizator.get( 'notification.start', start_time=self.start_time.strftime("%H:%M:%S")) self.logger.debug(start_msg) self.new_notification(msg=start_msg).show()