# HG changeset patch # User Goffi # Date 1482187777 -3600 # Node ID fbeeba721954ec10f9433cddb41ee4c44257be0f # Parent ad88808591ef4ab1d7f4fa1ebd532777ec01f246 plugin android: first draft: - the plugin cancel its own import if it's not launched on Android platform - this plugin show a notification when a non MUC message is received when Cagou is not active - the device also optionally vibrate on notification diff -r ad88808591ef -r fbeeba721954 src/core/sat_main.py --- a/src/core/sat_main.py Sun Dec 18 20:21:31 2016 +0100 +++ b/src/core/sat_main.py Mon Dec 19 23:49:37 2016 +0100 @@ -177,6 +177,9 @@ log.warning(u"Can't import plugin [{path}] because of an unavailale third party module:\n{msg}".format( path=plugin_path, msg=e)) continue + except exceptions.CancelError as e: + log.info(u"Plugin [{path}] cancelled its own import: {msg}".format(path=plugin_path, msg=e)) + continue except Exception as e: import traceback log.error(_(u"Can't import plugin [{path}]:\n{error}").format(path=plugin_path, error=traceback.format_exc())) diff -r ad88808591ef -r fbeeba721954 src/plugins/plugin_misc_android.py --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/plugins/plugin_misc_android.py Mon Dec 19 23:49:37 2016 +0100 @@ -0,0 +1,100 @@ +#!/usr/bin/env python2 +# -*- coding: utf-8 -*- + +# SAT plugin for file tansfer +# Copyright (C) 2009-2016 Jérôme Poisson (goffi@goffi.org) + +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. + +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see . + +from sat.core.i18n import _, D_ +from sat.core.constants import Const as C +from sat.core.log import getLogger +log = getLogger(__name__) +from sat.core import exceptions +import sys +import mmap + + +PLUGIN_INFO = { + "name": "Android ", + "import_name": "android", + "type": C.PLUG_TYPE_MISC, + "main": "AndroidPlugin", + "handler": "no", + "description": D_("""Manage Android platform specificities, like pause or notifications""") +} + +if sys.platform != "android": + raise exceptions.CancelError(u"this module is not needed on this platform") + +from plyer import notification, vibrator + +PARAM_VIBRATE_CATEGORY = "Notifications" +PARAM_VIBRATE_NAME = "vibrate" +PARAM_VIBRATE_LABEL = D_(u"Vibrate on notifications") + +class AndroidPlugin(object): + + params = """ + + + + + + + + """.format( + category_name = PARAM_VIBRATE_CATEGORY, + category_label = D_(PARAM_VIBRATE_CATEGORY), + param_name = PARAM_VIBRATE_NAME, + param_label = PARAM_VIBRATE_LABEL, + ) + + def __init__(self, host): + log.info(_("plugin Android initialization")) + self.host = host + host.memory.updateParams(self.params) + self.cagou_status_fd = open('.cagou_status', 'rb') + self.cagou_status = mmap.mmap(self.cagou_status_fd.fileno(), 1, prot=mmap.PROT_READ) + # we set a low priority because we want the notification to be sent after all plugins have done their job + host.trigger.add("MessageReceived", self.messageReceivedTrigger, priority=-1000) + + @property + def cagou_active(self): + # 'R' status means Cagou is running in front + return self.cagou_status[0] == 'R' + + def _notifyMessage(self, mess_data, client): + # send notification if there is a message and it is not a groupchat + if mess_data['message'] and mess_data['type'] != C.MESS_TYPE_GROUPCHAT: + message = mess_data['message'].itervalues().next() + try: + subject = mess_data['subject'].itervalues().next() + except StopIteration: + subject = u'Cagou new message' + + notification.notify( + title = subject, + message = message + ) + if self.host.memory.getParamA(PARAM_VIBRATE_NAME, PARAM_VIBRATE_CATEGORY, profile_key=client.profile): + vibrator.vibrate() + return mess_data + + def messageReceivedTrigger(self, client, message_elt, post_treat): + if not self.cagou_active: + # we only send notification is the frontend is not displayed + post_treat.addCallback(self._notifyMessage, client) + + return True