示例#1
0
    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()