Mercurial > libervia-backend
comparison src/plugins/plugin_misc_android.py @ 2100:fbeeba721954
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
author | Goffi <goffi@goffi.org> |
---|---|
date | Mon, 19 Dec 2016 23:49:37 +0100 |
parents | |
children | 33c8c4973743 |
comparison
equal
deleted
inserted
replaced
2099:ad88808591ef | 2100:fbeeba721954 |
---|---|
1 #!/usr/bin/env python2 | |
2 # -*- coding: utf-8 -*- | |
3 | |
4 # SAT plugin for file tansfer | |
5 # Copyright (C) 2009-2016 Jérôme Poisson (goffi@goffi.org) | |
6 | |
7 # This program is free software: you can redistribute it and/or modify | |
8 # it under the terms of the GNU Affero General Public License as published by | |
9 # the Free Software Foundation, either version 3 of the License, or | |
10 # (at your option) any later version. | |
11 | |
12 # This program is distributed in the hope that it will be useful, | |
13 # but WITHOUT ANY WARRANTY; without even the implied warranty of | |
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
15 # GNU Affero General Public License for more details. | |
16 | |
17 # You should have received a copy of the GNU Affero General Public License | |
18 # along with this program. If not, see <http://www.gnu.org/licenses/>. | |
19 | |
20 from sat.core.i18n import _, D_ | |
21 from sat.core.constants import Const as C | |
22 from sat.core.log import getLogger | |
23 log = getLogger(__name__) | |
24 from sat.core import exceptions | |
25 import sys | |
26 import mmap | |
27 | |
28 | |
29 PLUGIN_INFO = { | |
30 "name": "Android ", | |
31 "import_name": "android", | |
32 "type": C.PLUG_TYPE_MISC, | |
33 "main": "AndroidPlugin", | |
34 "handler": "no", | |
35 "description": D_("""Manage Android platform specificities, like pause or notifications""") | |
36 } | |
37 | |
38 if sys.platform != "android": | |
39 raise exceptions.CancelError(u"this module is not needed on this platform") | |
40 | |
41 from plyer import notification, vibrator | |
42 | |
43 PARAM_VIBRATE_CATEGORY = "Notifications" | |
44 PARAM_VIBRATE_NAME = "vibrate" | |
45 PARAM_VIBRATE_LABEL = D_(u"Vibrate on notifications") | |
46 | |
47 class AndroidPlugin(object): | |
48 | |
49 params = """ | |
50 <params> | |
51 <individual> | |
52 <category name="{category_name}" label="{category_label}"> | |
53 <param name="{param_name}" label="{param_label}" value="true" type="bool" security="0" /> | |
54 </category> | |
55 </individual> | |
56 </params> | |
57 """.format( | |
58 category_name = PARAM_VIBRATE_CATEGORY, | |
59 category_label = D_(PARAM_VIBRATE_CATEGORY), | |
60 param_name = PARAM_VIBRATE_NAME, | |
61 param_label = PARAM_VIBRATE_LABEL, | |
62 ) | |
63 | |
64 def __init__(self, host): | |
65 log.info(_("plugin Android initialization")) | |
66 self.host = host | |
67 host.memory.updateParams(self.params) | |
68 self.cagou_status_fd = open('.cagou_status', 'rb') | |
69 self.cagou_status = mmap.mmap(self.cagou_status_fd.fileno(), 1, prot=mmap.PROT_READ) | |
70 # we set a low priority because we want the notification to be sent after all plugins have done their job | |
71 host.trigger.add("MessageReceived", self.messageReceivedTrigger, priority=-1000) | |
72 | |
73 @property | |
74 def cagou_active(self): | |
75 # 'R' status means Cagou is running in front | |
76 return self.cagou_status[0] == 'R' | |
77 | |
78 def _notifyMessage(self, mess_data, client): | |
79 # send notification if there is a message and it is not a groupchat | |
80 if mess_data['message'] and mess_data['type'] != C.MESS_TYPE_GROUPCHAT: | |
81 message = mess_data['message'].itervalues().next() | |
82 try: | |
83 subject = mess_data['subject'].itervalues().next() | |
84 except StopIteration: | |
85 subject = u'Cagou new message' | |
86 | |
87 notification.notify( | |
88 title = subject, | |
89 message = message | |
90 ) | |
91 if self.host.memory.getParamA(PARAM_VIBRATE_NAME, PARAM_VIBRATE_CATEGORY, profile_key=client.profile): | |
92 vibrator.vibrate() | |
93 return mess_data | |
94 | |
95 def messageReceivedTrigger(self, client, message_elt, post_treat): | |
96 if not self.cagou_active: | |
97 # we only send notification is the frontend is not displayed | |
98 post_treat.addCallback(self._notifyMessage, client) | |
99 | |
100 return True |