Beispiel #1
0
class MycroftHomescreen(MycroftSkill):
    # The constructor of the skill, which calls MycroftSkill's constructor
    def __init__(self):
        super(MycroftHomescreen, self).__init__(name="MycroftHomescreen")
        self.skill_manager = None
        self.notifications_model = []
        self.notifications_storage_model = []
        self.wallpaper_folder = path.dirname(__file__) + '/ui/wallpapers/'
        self.selected_wallpaper = self.settings.get("wallpaper", "default.png")
        self.wallpaper_collection = []

    def initialize(self):
        now = datetime.datetime.now()
        callback_time = datetime.datetime(
            now.year, now.month, now.day, now.hour,
            now.minute) + datetime.timedelta(seconds=60)
        self.schedule_repeating_event(self.update_dt, callback_time, 10)
        self.skill_manager = SkillManager(self.bus)

        # Handler Registeration For Notifications
        self.add_event("homescreen.notification.set",
                       self.handle_display_notification)
        self.gui.register_handler("homescreen.notification.set",
                                  self.handle_display_notification)
        self.gui.register_handler("homescreen.notification.pop.clear",
                                  self.handle_clear_notification_data)
        self.gui.register_handler("homescreen.notification.pop.clear.delete",
                                  self.handle_clear_delete_notification_data)
        self.gui.register_handler("homescreen.notification.storage.clear",
                                  self.handle_clear_notification_storage)
        self.gui.register_handler("homescreen.notification.storage.item.rm",
                                  self.handle_clear_notification_storage_item)

        self.collect_wallpapers()

        # Import Date Time Skill As Date Time Provider
        # TODO - replace with Skills API call in 21.02
        root_dir = self.root_dir.rsplit("/", 1)[0]
        try:
            time_date_path = str(
                root_dir) + "/mycroft-date-time.mycroftai/__init__.py"
            time_date_id = "datetimeskill"
            datetimeskill = load_skill_module(time_date_path, time_date_id)
            from datetimeskill import TimeSkill

            self.dt_skill = TimeSkill()
        except:
            self.log.info("Failed To Import DateTime Skill")

    #####################################################################
    # Homescreen Registeration & Handling

    @resting_screen_handler("Mycroft Homescreen")
    def handle_idle(self, _):
        self.log.debug('Activating Time/Date resting page')
        self.gui['time_string'] = self.dt_skill.get_display_current_time()
        self.gui['date_string'] = self.dt_skill.get_display_date()
        self.gui['weekday_string'] = self.dt_skill.get_weekday()
        self.gui['month_string'] = self.dt_skill.get_month_date()
        self.gui['year_string'] = self.dt_skill.get_year()
        self.gui['build_date'] = self.build_info.get('build_date', '')
        self.gui['selected_wallpaper'] = self.selected_wallpaper
        self.gui['notification'] = {}
        self.gui["notification_model"] = {
            "storedmodel": self.notifications_storage_model,
            "count": len(self.notifications_storage_model),
        }
        self.gui.show_page("idle.qml")

    def handle_idle_update_time(self):
        self.gui["time_string"] = self.dt_skill.get_display_current_time()
        self.gui["date_string"] = self.dt_skill.get_display_date()
        self.gui["weekday_string"] = self.dt_skill.get_weekday()
        self.gui["month_string"] = self.dt_skill.get_month_date()
        self.gui["year_string"] = self.dt_skill.get_year()

    def update_dt(self):
        self.gui["time_string"] = self.dt_skill.get_display_current_time()
        self.gui["date_string"] = self.dt_skill.get_display_date()
        self.gui["weekday_string"] = self.dt_skill.get_weekday()
        self.gui["month_string"] = self.dt_skill.get_month_date()
        self.gui["year_string"] = self.dt_skill.get_year()

    #####################################################################
    # Build Info

    @property
    def build_info(self):
        """The /etc/mycroft/build-info.json file as a Dict."""
        data = {}
        filename = "/etc/mycroft/build-info.json"
        if (self.config_core["enclosure"].get("development_device")
                and Path(filename).is_file()):
            with open(filename, "r") as build_info:
                data = json.loads(build_info.read())
        return data

    #####################################################################
    # Wallpaper Manager

    def collect_wallpapers(self):
        for dirname, dirnames, filenames in os.walk(self.wallpaper_folder):
            self.wallpaper_collection = filenames

    @intent_file_handler("change.wallpaper.intent")
    def change_wallpaper(self, message):
        # Get Current Wallpaper idx
        current_idx = self.get_wallpaper_idx(self.selected_wallpaper)
        collection_length = len(self.wallpaper_collection) - 1
        if not current_idx == collection_length:
            fidx = current_idx + 1
            self.selected_wallpaper = self.wallpaper_collection[fidx]
            self.settings["wallpaper"] = self.wallpaper_collection[fidx]

        else:
            self.selected_wallpaper = self.wallpaper_collection[0]
            self.settings["wallpaper"] = self.wallpaper_collection[0]

        self.gui['selected_wallpaper'] = self.selected_wallpaper

    def get_wallpaper_idx(self, filename):
        try:
            index_element = self.wallpaper_collection.index(filename)
            return index_element
        except ValueError:
            return None

    #####################################################################
    # Manage notifications

    def handle_display_notification(self, message):
        """ Get Notification & Action """
        notification_message = {
            "sender": message.data.get("sender", ""),
            "text": message.data.get("text", ""),
            "action": message.data.get("action", ""),
            "type": message.data.get("type", ""),
        }
        if notification_message not in self.notifications_model:
            self.notifications_model.append(notification_message)
            self.gui["notifcation_counter"] = len(self.notifications_model)
            self.gui["notification"] = notification_message
            time.sleep(2)
            self.bus.emit(Message("homescreen.notification.show"))

    def handle_clear_notification_data(self, message):
        """ Clear Pop Notification """
        notification_data = message.data.get("notification", "")
        self.notifications_storage_model.append(notification_data)
        for i in range(len(self.notifications_model)):
            if (self.notifications_model[i]["sender"]
                    == notification_data["sender"]
                    and self.notifications_model[i]["text"]
                    == notification_data["text"]):
                if not len(self.notifications_model) > 0:
                    del self.notifications_model[i]
                    self.notifications_model = []
                else:
                    del self.notifications_model[i]
                break

        self.gui["notification_model"] = {
            "storedmodel": self.notifications_storage_model,
            "count": len(self.notifications_storage_model),
        }
        self.gui["notification"] = {}

    def handle_clear_delete_notification_data(self, message):
        """ Clear Pop Notification & Delete Notification Data """
        notification_data = message.data.get("notification", "")
        for i in range(len(self.notifications_model)):
            if (self.notifications_model[i]["sender"]
                    == notification_data["sender"]
                    and self.notifications_model[i]["text"]
                    == notification_data["text"]):
                if not len(self.notifications_model) > 0:
                    del self.notifications_model[i]
                    self.notifications_model = []
                else:
                    del self.notifications_model[i]
                break

    def handle_clear_notification_storage(self, _):
        """ Clear All Notification Storage Model """
        self.notifications_storage_model = []
        self.gui["notification_model"] = {
            "storedmodel": self.notifications_storage_model,
            "count": len(self.notifications_storage_model),
        }

    def handle_clear_notification_storage_item(self, message):
        """ Clear Single Item From Notification Storage Model """
        notification_data = message.data.get("notification", "")
        for i in range(len(self.notifications_storage_model)):
            if (self.notifications_storage_model[i]["sender"]
                    == notification_data["sender"]
                    and self.notifications_storage_model[i]["text"]
                    == notification_data["text"]):
                self.notifications_storage_model.pop(i)
                self.gui["notification_model"] = {
                    "storedmodel": self.notifications_storage_model,
                    "count": len(self.notifications_storage_model),
                }

    def stop(self):
        pass
Beispiel #2
0
class AndroidHomescreen(MycroftSkill):

    # The constructor of the skill, which calls MycroftSkill's constructor
    def __init__(self):
        super(AndroidHomescreen, self).__init__(name="AndroidHomescreen")
        self.allSkills = []
        self.enabledAndroidSkills = []
        self.androidSkillsList = []
        self.androidSkillObject = {}
        self.skill_manager = None

    def initialize(self):
        self.add_event("pixabay.gallery.set_wallpaper", self.set_wallpaper)
        now = datetime.datetime.now()
        callback_time = (datetime.datetime(now.year, now.month, now.day,
                                           now.hour, now.minute) +
                         datetime.timedelta(seconds=60))
        self.schedule_repeating_event(self.update_dt, callback_time, 10)
        self.skill_manager = SkillManager(self.bus)

        # Make Import For TimeData
        root_dir = self.root_dir.rsplit('/', 1)[0]
        try:
            time_date_path = str(
                root_dir) + "/mycroft-date-time.mycroftai/__init__.py"
            time_date_id = "datetimeskill"
            datetimeskill = load_skill_module(time_date_path, time_date_id)
            from datetimeskill import TimeSkill
            self.dt_skill = TimeSkill()
        except:
            print("Failed To Import DateTime Skill")

    @resting_screen_handler('AndroidHomescreen')
    def handle_idle(self, message):
        self.gui.clear()
        self.generate_homescreen_icons()
        self.log.debug('Activating Time/Date resting page')
        self.gui['time_string'] = self.dt_skill.get_display_current_time()
        self.gui['ampm_string'] = ''
        self.gui['date_string'] = self.dt_skill.get_display_date()
        self.gui['weekday_string'] = self.dt_skill.get_weekday()
        self.gui['month_string'] = self.dt_skill.get_month_date()
        self.gui['year_string'] = self.dt_skill.get_year()
        self.gui['skillLauncher'] = self.androidSkillObject
        self.gui.show_page('homescreen.qml')

    def handle_idle_update_time(self):
        self.gui['time_string'] = self.dt_skill.get_display_current_time()

    def generate_homescreen_icons(self):
        self.androidSkillsList.clear()
        skill_directories = self.skill_manager._get_skill_directories()
        print(skill_directories)
        for x in range(len(skill_directories)):
            if skill_directories[x] not in self.allSkills:
                self.allSkills.append(skill_directories[x])

        for x in range(len(self.allSkills)):
            skill_dir = self.allSkills[x]
            skill_android_file_resource = skill_dir + "/android.json"
            if path.exists(skill_android_file_resource) and path.isfile(
                    skill_android_file_resource):
                with open(skill_android_file_resource) as f:
                    print("I AM IN EXPAND ANDROID RESOURCE FILE")
                    expand_file = json.load(f)
                    icon_path = skill_dir + expand_file["android_icon"]
                    display_name = expand_file["android_name"]
                    invoke_handler = expand_file["android_handler"]
                    if not any(
                            d.get('skillPath', None) == skill_dir
                            for d in self.androidSkillsList):
                        self.androidSkillsList.append({
                            "skillPath":
                            skill_dir,
                            "skillIconPath":
                            icon_path,
                            "skillDisplayName":
                            display_name,
                            "skillHandler":
                            invoke_handler
                        })
                        print(self.androidSkillsList)

                    try:
                        sort_on = "skillDisplayName"
                        decorated = [(dict_[sort_on], dict_)
                                     for dict_ in self.androidSkillsList]
                        decorated.sort()
                        result = [dict_ for (key, dict_) in decorated]
                        print(result)
                    except Exception:
                        print("Error Sorting Application List")

        try:
            self.androidSkillObject["skillList"] = result
        except Exception:
            print("Error Getting Application List")

    def update_dt(self):
        self.gui['time_string'] = self.dt_skill.get_display_current_time()
        self.gui['date_string'] = self.dt_skill.get_display_date()

    def set_wallpaper(self, message):
        self.gui['wallpaper_path'] = message.data["imagePath"]

    def set_default_wallpaper(self, message):
        self.gui['wallpaper_path'] = self.root_dir + "/ui/img/seaside.jpg"

    def stop(self):
        pass