Mercurial > libervia-backend
annotate sat/plugins/plugin_misc_android.py @ 3181:5ff2cf7f0aba
plugin attach: first draft:
this plugin handles the uploading of files attached in message data.
author | Goffi <goffi@goffi.org> |
---|---|
date | Sun, 23 Feb 2020 17:48:26 +0100 |
parents | dcebc585c29f |
children | 2a0a16b906ac |
rev | line source |
---|---|
3028 | 1 #!/usr/bin/env python3 |
3137 | 2 |
2100 | 3 # SAT plugin for file tansfer |
3136 | 4 # Copyright (C) 2009-2020 Jérôme Poisson (goffi@goffi.org) |
2100 | 5 |
6 # This program is free software: you can redistribute it and/or modify | |
7 # it under the terms of the GNU Affero General Public License as published by | |
8 # the Free Software Foundation, either version 3 of the License, or | |
9 # (at your option) any later version. | |
10 | |
11 # This program is distributed in the hope that it will be useful, | |
12 # but WITHOUT ANY WARRANTY; without even the implied warranty of | |
13 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
14 # GNU Affero General Public License for more details. | |
15 | |
16 # You should have received a copy of the GNU Affero General Public License | |
17 # along with this program. If not, see <http://www.gnu.org/licenses/>. | |
18 | |
2841
90115cf4e731
plugin android: improved state handling:
Goffi <goffi@goffi.org>
parents:
2771
diff
changeset
|
19 import sys |
90115cf4e731
plugin android: improved state handling:
Goffi <goffi@goffi.org>
parents:
2771
diff
changeset
|
20 import os |
90115cf4e731
plugin android: improved state handling:
Goffi <goffi@goffi.org>
parents:
2771
diff
changeset
|
21 import os.path |
3154
f2d3ab4390a3
plugin android: attach an action dict to notification:
Goffi <goffi@goffi.org>
parents:
3137
diff
changeset
|
22 import json |
3106
7f7cdc6ecfd8
plugin android: sound notification + change settings:
Goffi <goffi@goffi.org>
parents:
3095
diff
changeset
|
23 from pathlib import Path |
2100 | 24 from sat.core.i18n import _, D_ |
25 from sat.core.constants import Const as C | |
26 from sat.core.log import getLogger | |
2841
90115cf4e731
plugin android: improved state handling:
Goffi <goffi@goffi.org>
parents:
2771
diff
changeset
|
27 from sat.core import exceptions |
3162
b5c058c7692e
core (xmpp), plugin android: fixed DNS, SRV handling on Android:
Goffi <goffi@goffi.org>
parents:
3154
diff
changeset
|
28 from sat.tools.common import async_process |
3106
7f7cdc6ecfd8
plugin android: sound notification + change settings:
Goffi <goffi@goffi.org>
parents:
3095
diff
changeset
|
29 from sat.memory import params |
3162
b5c058c7692e
core (xmpp), plugin android: fixed DNS, SRV handling on Android:
Goffi <goffi@goffi.org>
parents:
3154
diff
changeset
|
30 from twisted.names import client as dns_client |
b5c058c7692e
core (xmpp), plugin android: fixed DNS, SRV handling on Android:
Goffi <goffi@goffi.org>
parents:
3154
diff
changeset
|
31 from twisted.python.procutils import which |
3124
b86060901278
plugin android: added a `profileAutoconnectGet` method:
Goffi <goffi@goffi.org>
parents:
3106
diff
changeset
|
32 from twisted.internet import defer |
2841
90115cf4e731
plugin android: improved state handling:
Goffi <goffi@goffi.org>
parents:
2771
diff
changeset
|
33 from twisted.internet import reactor |
90115cf4e731
plugin android: improved state handling:
Goffi <goffi@goffi.org>
parents:
2771
diff
changeset
|
34 from twisted.internet import protocol |
3162
b5c058c7692e
core (xmpp), plugin android: fixed DNS, SRV handling on Android:
Goffi <goffi@goffi.org>
parents:
3154
diff
changeset
|
35 from twisted.internet import abstract |
2841
90115cf4e731
plugin android: improved state handling:
Goffi <goffi@goffi.org>
parents:
2771
diff
changeset
|
36 from twisted.internet import error as int_error |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
37 |
2100 | 38 log = getLogger(__name__) |
39 | |
40 PLUGIN_INFO = { | |
3124
b86060901278
plugin android: added a `profileAutoconnectGet` method:
Goffi <goffi@goffi.org>
parents:
3106
diff
changeset
|
41 C.PI_NAME: "Android", |
2145
33c8c4973743
core (plugins): added missing contants + use of new constants in PLUGIN_INFO
Goffi <goffi@goffi.org>
parents:
2100
diff
changeset
|
42 C.PI_IMPORT_NAME: "android", |
33c8c4973743
core (plugins): added missing contants + use of new constants in PLUGIN_INFO
Goffi <goffi@goffi.org>
parents:
2100
diff
changeset
|
43 C.PI_TYPE: C.PLUG_TYPE_MISC, |
3028 | 44 C.PI_RECOMMENDATIONS: ["XEP-0352"], |
2145
33c8c4973743
core (plugins): added missing contants + use of new constants in PLUGIN_INFO
Goffi <goffi@goffi.org>
parents:
2100
diff
changeset
|
45 C.PI_MAIN: "AndroidPlugin", |
33c8c4973743
core (plugins): added missing contants + use of new constants in PLUGIN_INFO
Goffi <goffi@goffi.org>
parents:
2100
diff
changeset
|
46 C.PI_HANDLER: "no", |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
47 C.PI_DESCRIPTION: D_( |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
48 """Manage Android platform specificities, like pause or notifications""" |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
49 ), |
2100 | 50 } |
51 | |
52 if sys.platform != "android": | |
3028 | 53 raise exceptions.CancelError("this module is not needed on this platform") |
2100 | 54 |
2872
6b00f88316bf
plugin android: use XEP-0352 to indicate (in)active state:
Goffi <goffi@goffi.org>
parents:
2868
diff
changeset
|
55 |
3162
b5c058c7692e
core (xmpp), plugin android: fixed DNS, SRV handling on Android:
Goffi <goffi@goffi.org>
parents:
3154
diff
changeset
|
56 import re |
3154
f2d3ab4390a3
plugin android: attach an action dict to notification:
Goffi <goffi@goffi.org>
parents:
3137
diff
changeset
|
57 from plyer import vibrator |
3162
b5c058c7692e
core (xmpp), plugin android: fixed DNS, SRV handling on Android:
Goffi <goffi@goffi.org>
parents:
3154
diff
changeset
|
58 from android import api_version |
2887
9aadf11b315b
plugin android: check connectivity
Goffi <goffi@goffi.org>
parents:
2882
diff
changeset
|
59 from plyer.platforms.android import activity |
3154
f2d3ab4390a3
plugin android: attach an action dict to notification:
Goffi <goffi@goffi.org>
parents:
3137
diff
changeset
|
60 from plyer.platforms.android.notification import AndroidNotification |
2887
9aadf11b315b
plugin android: check connectivity
Goffi <goffi@goffi.org>
parents:
2882
diff
changeset
|
61 from jnius import autoclass |
9aadf11b315b
plugin android: check connectivity
Goffi <goffi@goffi.org>
parents:
2882
diff
changeset
|
62 from android.broadcast import BroadcastReceiver |
3154
f2d3ab4390a3
plugin android: attach an action dict to notification:
Goffi <goffi@goffi.org>
parents:
3137
diff
changeset
|
63 from android import python_act |
f2d3ab4390a3
plugin android: attach an action dict to notification:
Goffi <goffi@goffi.org>
parents:
3137
diff
changeset
|
64 |
f2d3ab4390a3
plugin android: attach an action dict to notification:
Goffi <goffi@goffi.org>
parents:
3137
diff
changeset
|
65 |
f2d3ab4390a3
plugin android: attach an action dict to notification:
Goffi <goffi@goffi.org>
parents:
3137
diff
changeset
|
66 Context = autoclass('android.content.Context') |
f2d3ab4390a3
plugin android: attach an action dict to notification:
Goffi <goffi@goffi.org>
parents:
3137
diff
changeset
|
67 ConnectivityManager = autoclass('android.net.ConnectivityManager') |
f2d3ab4390a3
plugin android: attach an action dict to notification:
Goffi <goffi@goffi.org>
parents:
3137
diff
changeset
|
68 MediaPlayer = autoclass('android.media.MediaPlayer') |
f2d3ab4390a3
plugin android: attach an action dict to notification:
Goffi <goffi@goffi.org>
parents:
3137
diff
changeset
|
69 AudioManager = autoclass('android.media.AudioManager') |
f2d3ab4390a3
plugin android: attach an action dict to notification:
Goffi <goffi@goffi.org>
parents:
3137
diff
changeset
|
70 |
f2d3ab4390a3
plugin android: attach an action dict to notification:
Goffi <goffi@goffi.org>
parents:
3137
diff
changeset
|
71 # notifications |
f2d3ab4390a3
plugin android: attach an action dict to notification:
Goffi <goffi@goffi.org>
parents:
3137
diff
changeset
|
72 AndroidString = autoclass('java.lang.String') |
f2d3ab4390a3
plugin android: attach an action dict to notification:
Goffi <goffi@goffi.org>
parents:
3137
diff
changeset
|
73 PendingIntent = autoclass('android.app.PendingIntent') |
f2d3ab4390a3
plugin android: attach an action dict to notification:
Goffi <goffi@goffi.org>
parents:
3137
diff
changeset
|
74 Intent = autoclass('android.content.Intent') |
2100 | 75 |
3162
b5c058c7692e
core (xmpp), plugin android: fixed DNS, SRV handling on Android:
Goffi <goffi@goffi.org>
parents:
3154
diff
changeset
|
76 # DNS |
b5c058c7692e
core (xmpp), plugin android: fixed DNS, SRV handling on Android:
Goffi <goffi@goffi.org>
parents:
3154
diff
changeset
|
77 # regex to find dns server prop with "getprop" |
b5c058c7692e
core (xmpp), plugin android: fixed DNS, SRV handling on Android:
Goffi <goffi@goffi.org>
parents:
3154
diff
changeset
|
78 RE_DNS = re.compile(r"^\[net\.[a-z0-9]+\.dns[0-4]\]: \[(.*)\]$", re.MULTILINE) |
b5c058c7692e
core (xmpp), plugin android: fixed DNS, SRV handling on Android:
Goffi <goffi@goffi.org>
parents:
3154
diff
changeset
|
79 SystemProperties = autoclass('android.os.SystemProperties') |
b5c058c7692e
core (xmpp), plugin android: fixed DNS, SRV handling on Android:
Goffi <goffi@goffi.org>
parents:
3154
diff
changeset
|
80 |
2872
6b00f88316bf
plugin android: use XEP-0352 to indicate (in)active state:
Goffi <goffi@goffi.org>
parents:
2868
diff
changeset
|
81 #: delay between a pause event and sending the inactive indication to server, in seconds |
6b00f88316bf
plugin android: use XEP-0352 to indicate (in)active state:
Goffi <goffi@goffi.org>
parents:
2868
diff
changeset
|
82 #: we don't send the indication immediately because user can be just checking something |
6b00f88316bf
plugin android: use XEP-0352 to indicate (in)active state:
Goffi <goffi@goffi.org>
parents:
2868
diff
changeset
|
83 #: quickly on an other app. |
6b00f88316bf
plugin android: use XEP-0352 to indicate (in)active state:
Goffi <goffi@goffi.org>
parents:
2868
diff
changeset
|
84 CSI_DELAY = 30 |
6b00f88316bf
plugin android: use XEP-0352 to indicate (in)active state:
Goffi <goffi@goffi.org>
parents:
2868
diff
changeset
|
85 |
3106
7f7cdc6ecfd8
plugin android: sound notification + change settings:
Goffi <goffi@goffi.org>
parents:
3095
diff
changeset
|
86 PARAM_RING_CATEGORY = "Notifications" |
7f7cdc6ecfd8
plugin android: sound notification + change settings:
Goffi <goffi@goffi.org>
parents:
3095
diff
changeset
|
87 PARAM_RING_NAME = "sound" |
7f7cdc6ecfd8
plugin android: sound notification + change settings:
Goffi <goffi@goffi.org>
parents:
3095
diff
changeset
|
88 PARAM_RING_LABEL = D_("sound on notifications") |
7f7cdc6ecfd8
plugin android: sound notification + change settings:
Goffi <goffi@goffi.org>
parents:
3095
diff
changeset
|
89 RING_OPTS = { |
7f7cdc6ecfd8
plugin android: sound notification + change settings:
Goffi <goffi@goffi.org>
parents:
3095
diff
changeset
|
90 "normal": D_("Normal"), |
7f7cdc6ecfd8
plugin android: sound notification + change settings:
Goffi <goffi@goffi.org>
parents:
3095
diff
changeset
|
91 "never": D_("Never"), |
7f7cdc6ecfd8
plugin android: sound notification + change settings:
Goffi <goffi@goffi.org>
parents:
3095
diff
changeset
|
92 } |
2100 | 93 PARAM_VIBRATE_CATEGORY = "Notifications" |
94 PARAM_VIBRATE_NAME = "vibrate" | |
3028 | 95 PARAM_VIBRATE_LABEL = D_("Vibrate on notifications") |
3106
7f7cdc6ecfd8
plugin android: sound notification + change settings:
Goffi <goffi@goffi.org>
parents:
3095
diff
changeset
|
96 VIBRATION_OPTS = { |
7f7cdc6ecfd8
plugin android: sound notification + change settings:
Goffi <goffi@goffi.org>
parents:
3095
diff
changeset
|
97 "always": D_("Always"), |
7f7cdc6ecfd8
plugin android: sound notification + change settings:
Goffi <goffi@goffi.org>
parents:
3095
diff
changeset
|
98 "vibrate": D_("In vibrate mode"), |
7f7cdc6ecfd8
plugin android: sound notification + change settings:
Goffi <goffi@goffi.org>
parents:
3095
diff
changeset
|
99 "never": D_("Never"), |
7f7cdc6ecfd8
plugin android: sound notification + change settings:
Goffi <goffi@goffi.org>
parents:
3095
diff
changeset
|
100 } |
2841
90115cf4e731
plugin android: improved state handling:
Goffi <goffi@goffi.org>
parents:
2771
diff
changeset
|
101 SOCKET_DIR = "/data/data/org.salutatoi.cagou/" |
90115cf4e731
plugin android: improved state handling:
Goffi <goffi@goffi.org>
parents:
2771
diff
changeset
|
102 SOCKET_FILE = ".socket" |
3057
f91d0e6d9b13
plugin android: fixed encoding in states after Python 3 port
Goffi <goffi@goffi.org>
parents:
3028
diff
changeset
|
103 STATE_RUNNING = b"running" |
f91d0e6d9b13
plugin android: fixed encoding in states after Python 3 port
Goffi <goffi@goffi.org>
parents:
3028
diff
changeset
|
104 STATE_PAUSED = b"paused" |
f91d0e6d9b13
plugin android: fixed encoding in states after Python 3 port
Goffi <goffi@goffi.org>
parents:
3028
diff
changeset
|
105 STATE_STOPPED = b"stopped" |
2841
90115cf4e731
plugin android: improved state handling:
Goffi <goffi@goffi.org>
parents:
2771
diff
changeset
|
106 STATES = (STATE_RUNNING, STATE_PAUSED, STATE_STOPPED) |
2887
9aadf11b315b
plugin android: check connectivity
Goffi <goffi@goffi.org>
parents:
2882
diff
changeset
|
107 NET_TYPE_NONE = "no network" |
9aadf11b315b
plugin android: check connectivity
Goffi <goffi@goffi.org>
parents:
2882
diff
changeset
|
108 NET_TYPE_WIFI = "wifi" |
9aadf11b315b
plugin android: check connectivity
Goffi <goffi@goffi.org>
parents:
2882
diff
changeset
|
109 NET_TYPE_MOBILE = "mobile" |
9aadf11b315b
plugin android: check connectivity
Goffi <goffi@goffi.org>
parents:
2882
diff
changeset
|
110 NET_TYPE_OTHER = "other" |
3154
f2d3ab4390a3
plugin android: attach an action dict to notification:
Goffi <goffi@goffi.org>
parents:
3137
diff
changeset
|
111 INTENT_EXTRA_ACTION = AndroidString("org.salut-a-toi.IntentAction") |
2887
9aadf11b315b
plugin android: check connectivity
Goffi <goffi@goffi.org>
parents:
2882
diff
changeset
|
112 |
9aadf11b315b
plugin android: check connectivity
Goffi <goffi@goffi.org>
parents:
2882
diff
changeset
|
113 |
3154
f2d3ab4390a3
plugin android: attach an action dict to notification:
Goffi <goffi@goffi.org>
parents:
3137
diff
changeset
|
114 class Notification(AndroidNotification): |
f2d3ab4390a3
plugin android: attach an action dict to notification:
Goffi <goffi@goffi.org>
parents:
3137
diff
changeset
|
115 # We extend plyer's AndroidNotification instead of creating directly with jnius |
f2d3ab4390a3
plugin android: attach an action dict to notification:
Goffi <goffi@goffi.org>
parents:
3137
diff
changeset
|
116 # because it already handles issues like backward compatibility, and we just want to |
f2d3ab4390a3
plugin android: attach an action dict to notification:
Goffi <goffi@goffi.org>
parents:
3137
diff
changeset
|
117 # slightly modify the behaviour. |
f2d3ab4390a3
plugin android: attach an action dict to notification:
Goffi <goffi@goffi.org>
parents:
3137
diff
changeset
|
118 |
f2d3ab4390a3
plugin android: attach an action dict to notification:
Goffi <goffi@goffi.org>
parents:
3137
diff
changeset
|
119 @staticmethod |
f2d3ab4390a3
plugin android: attach an action dict to notification:
Goffi <goffi@goffi.org>
parents:
3137
diff
changeset
|
120 def _set_open_behavior(notification, sat_action): |
f2d3ab4390a3
plugin android: attach an action dict to notification:
Goffi <goffi@goffi.org>
parents:
3137
diff
changeset
|
121 # we reproduce plyer's AndroidNotification._set_open_behavior |
f2d3ab4390a3
plugin android: attach an action dict to notification:
Goffi <goffi@goffi.org>
parents:
3137
diff
changeset
|
122 # bu we add SàT specific extra action data |
f2d3ab4390a3
plugin android: attach an action dict to notification:
Goffi <goffi@goffi.org>
parents:
3137
diff
changeset
|
123 |
f2d3ab4390a3
plugin android: attach an action dict to notification:
Goffi <goffi@goffi.org>
parents:
3137
diff
changeset
|
124 app_context = activity.getApplication().getApplicationContext() |
f2d3ab4390a3
plugin android: attach an action dict to notification:
Goffi <goffi@goffi.org>
parents:
3137
diff
changeset
|
125 notification_intent = Intent(app_context, python_act) |
f2d3ab4390a3
plugin android: attach an action dict to notification:
Goffi <goffi@goffi.org>
parents:
3137
diff
changeset
|
126 |
f2d3ab4390a3
plugin android: attach an action dict to notification:
Goffi <goffi@goffi.org>
parents:
3137
diff
changeset
|
127 notification_intent.setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP) |
f2d3ab4390a3
plugin android: attach an action dict to notification:
Goffi <goffi@goffi.org>
parents:
3137
diff
changeset
|
128 notification_intent.setAction(Intent.ACTION_MAIN) |
f2d3ab4390a3
plugin android: attach an action dict to notification:
Goffi <goffi@goffi.org>
parents:
3137
diff
changeset
|
129 notification_intent.addCategory(Intent.CATEGORY_LAUNCHER) |
f2d3ab4390a3
plugin android: attach an action dict to notification:
Goffi <goffi@goffi.org>
parents:
3137
diff
changeset
|
130 if sat_action is not None: |
f2d3ab4390a3
plugin android: attach an action dict to notification:
Goffi <goffi@goffi.org>
parents:
3137
diff
changeset
|
131 action_data = AndroidString(json.dumps(sat_action).encode()) |
f2d3ab4390a3
plugin android: attach an action dict to notification:
Goffi <goffi@goffi.org>
parents:
3137
diff
changeset
|
132 log.debug(f"adding extra {INTENT_EXTRA_ACTION} ==> {action_data}") |
f2d3ab4390a3
plugin android: attach an action dict to notification:
Goffi <goffi@goffi.org>
parents:
3137
diff
changeset
|
133 notification_intent = notification_intent.putExtra( |
f2d3ab4390a3
plugin android: attach an action dict to notification:
Goffi <goffi@goffi.org>
parents:
3137
diff
changeset
|
134 INTENT_EXTRA_ACTION, action_data) |
f2d3ab4390a3
plugin android: attach an action dict to notification:
Goffi <goffi@goffi.org>
parents:
3137
diff
changeset
|
135 |
f2d3ab4390a3
plugin android: attach an action dict to notification:
Goffi <goffi@goffi.org>
parents:
3137
diff
changeset
|
136 # we use PendingIntent.FLAG_UPDATE_CURRENT here, otherwise extra won't be set |
f2d3ab4390a3
plugin android: attach an action dict to notification:
Goffi <goffi@goffi.org>
parents:
3137
diff
changeset
|
137 # in the new intent (the old ACTION_MAIN intent will be reused). This differs |
f2d3ab4390a3
plugin android: attach an action dict to notification:
Goffi <goffi@goffi.org>
parents:
3137
diff
changeset
|
138 # from plyers original behaviour which set no flag here |
f2d3ab4390a3
plugin android: attach an action dict to notification:
Goffi <goffi@goffi.org>
parents:
3137
diff
changeset
|
139 pending_intent = PendingIntent.getActivity( |
f2d3ab4390a3
plugin android: attach an action dict to notification:
Goffi <goffi@goffi.org>
parents:
3137
diff
changeset
|
140 app_context, 0, notification_intent, PendingIntent.FLAG_UPDATE_CURRENT |
f2d3ab4390a3
plugin android: attach an action dict to notification:
Goffi <goffi@goffi.org>
parents:
3137
diff
changeset
|
141 ) |
f2d3ab4390a3
plugin android: attach an action dict to notification:
Goffi <goffi@goffi.org>
parents:
3137
diff
changeset
|
142 |
f2d3ab4390a3
plugin android: attach an action dict to notification:
Goffi <goffi@goffi.org>
parents:
3137
diff
changeset
|
143 notification.setContentIntent(pending_intent) |
f2d3ab4390a3
plugin android: attach an action dict to notification:
Goffi <goffi@goffi.org>
parents:
3137
diff
changeset
|
144 notification.setAutoCancel(True) |
f2d3ab4390a3
plugin android: attach an action dict to notification:
Goffi <goffi@goffi.org>
parents:
3137
diff
changeset
|
145 |
f2d3ab4390a3
plugin android: attach an action dict to notification:
Goffi <goffi@goffi.org>
parents:
3137
diff
changeset
|
146 def _notify(self, **kwargs): |
f2d3ab4390a3
plugin android: attach an action dict to notification:
Goffi <goffi@goffi.org>
parents:
3137
diff
changeset
|
147 # we reproduce plyer's AndroidNotification._notify behaviour here |
f2d3ab4390a3
plugin android: attach an action dict to notification:
Goffi <goffi@goffi.org>
parents:
3137
diff
changeset
|
148 # and we add handling of "sat_action" attribute (SàT specific). |
f2d3ab4390a3
plugin android: attach an action dict to notification:
Goffi <goffi@goffi.org>
parents:
3137
diff
changeset
|
149 # we also set, where suitable, default values to empty string instead of |
f2d3ab4390a3
plugin android: attach an action dict to notification:
Goffi <goffi@goffi.org>
parents:
3137
diff
changeset
|
150 # original None, as a string is expected (in plyer the empty string is used |
f2d3ab4390a3
plugin android: attach an action dict to notification:
Goffi <goffi@goffi.org>
parents:
3137
diff
changeset
|
151 # in the generic "notify" method). |
f2d3ab4390a3
plugin android: attach an action dict to notification:
Goffi <goffi@goffi.org>
parents:
3137
diff
changeset
|
152 sat_action = kwargs.pop("sat_action", None) |
f2d3ab4390a3
plugin android: attach an action dict to notification:
Goffi <goffi@goffi.org>
parents:
3137
diff
changeset
|
153 noti = None |
f2d3ab4390a3
plugin android: attach an action dict to notification:
Goffi <goffi@goffi.org>
parents:
3137
diff
changeset
|
154 message = kwargs.get('message', '').encode('utf-8') |
f2d3ab4390a3
plugin android: attach an action dict to notification:
Goffi <goffi@goffi.org>
parents:
3137
diff
changeset
|
155 ticker = kwargs.get('ticker', '').encode('utf-8') |
f2d3ab4390a3
plugin android: attach an action dict to notification:
Goffi <goffi@goffi.org>
parents:
3137
diff
changeset
|
156 title = AndroidString( |
f2d3ab4390a3
plugin android: attach an action dict to notification:
Goffi <goffi@goffi.org>
parents:
3137
diff
changeset
|
157 kwargs.get('title', '').encode('utf-8') |
f2d3ab4390a3
plugin android: attach an action dict to notification:
Goffi <goffi@goffi.org>
parents:
3137
diff
changeset
|
158 ) |
f2d3ab4390a3
plugin android: attach an action dict to notification:
Goffi <goffi@goffi.org>
parents:
3137
diff
changeset
|
159 icon = kwargs.get('app_icon', '') |
f2d3ab4390a3
plugin android: attach an action dict to notification:
Goffi <goffi@goffi.org>
parents:
3137
diff
changeset
|
160 |
f2d3ab4390a3
plugin android: attach an action dict to notification:
Goffi <goffi@goffi.org>
parents:
3137
diff
changeset
|
161 if kwargs.get('toast', False): |
f2d3ab4390a3
plugin android: attach an action dict to notification:
Goffi <goffi@goffi.org>
parents:
3137
diff
changeset
|
162 self._toast(message) |
f2d3ab4390a3
plugin android: attach an action dict to notification:
Goffi <goffi@goffi.org>
parents:
3137
diff
changeset
|
163 return |
f2d3ab4390a3
plugin android: attach an action dict to notification:
Goffi <goffi@goffi.org>
parents:
3137
diff
changeset
|
164 else: |
f2d3ab4390a3
plugin android: attach an action dict to notification:
Goffi <goffi@goffi.org>
parents:
3137
diff
changeset
|
165 noti = self._build_notification(title) |
f2d3ab4390a3
plugin android: attach an action dict to notification:
Goffi <goffi@goffi.org>
parents:
3137
diff
changeset
|
166 |
f2d3ab4390a3
plugin android: attach an action dict to notification:
Goffi <goffi@goffi.org>
parents:
3137
diff
changeset
|
167 noti.setContentTitle(title) |
f2d3ab4390a3
plugin android: attach an action dict to notification:
Goffi <goffi@goffi.org>
parents:
3137
diff
changeset
|
168 noti.setContentText(AndroidString(message)) |
f2d3ab4390a3
plugin android: attach an action dict to notification:
Goffi <goffi@goffi.org>
parents:
3137
diff
changeset
|
169 noti.setTicker(AndroidString(ticker)) |
f2d3ab4390a3
plugin android: attach an action dict to notification:
Goffi <goffi@goffi.org>
parents:
3137
diff
changeset
|
170 |
f2d3ab4390a3
plugin android: attach an action dict to notification:
Goffi <goffi@goffi.org>
parents:
3137
diff
changeset
|
171 self._set_icons(noti, icon=icon) |
f2d3ab4390a3
plugin android: attach an action dict to notification:
Goffi <goffi@goffi.org>
parents:
3137
diff
changeset
|
172 self._set_open_behavior(noti, sat_action) |
f2d3ab4390a3
plugin android: attach an action dict to notification:
Goffi <goffi@goffi.org>
parents:
3137
diff
changeset
|
173 |
f2d3ab4390a3
plugin android: attach an action dict to notification:
Goffi <goffi@goffi.org>
parents:
3137
diff
changeset
|
174 self._open_notification(noti) |
2868
5546613f5007
plugin android: workaround to seek() bug, fixing file upload:
Goffi <goffi@goffi.org>
parents:
2856
diff
changeset
|
175 |
5546613f5007
plugin android: workaround to seek() bug, fixing file upload:
Goffi <goffi@goffi.org>
parents:
2856
diff
changeset
|
176 |
2841
90115cf4e731
plugin android: improved state handling:
Goffi <goffi@goffi.org>
parents:
2771
diff
changeset
|
177 class FrontendStateProtocol(protocol.Protocol): |
90115cf4e731
plugin android: improved state handling:
Goffi <goffi@goffi.org>
parents:
2771
diff
changeset
|
178 |
90115cf4e731
plugin android: improved state handling:
Goffi <goffi@goffi.org>
parents:
2771
diff
changeset
|
179 def __init__(self, android_plugin): |
90115cf4e731
plugin android: improved state handling:
Goffi <goffi@goffi.org>
parents:
2771
diff
changeset
|
180 self.android_plugin = android_plugin |
90115cf4e731
plugin android: improved state handling:
Goffi <goffi@goffi.org>
parents:
2771
diff
changeset
|
181 |
90115cf4e731
plugin android: improved state handling:
Goffi <goffi@goffi.org>
parents:
2771
diff
changeset
|
182 def dataReceived(self, data): |
90115cf4e731
plugin android: improved state handling:
Goffi <goffi@goffi.org>
parents:
2771
diff
changeset
|
183 if data in STATES: |
90115cf4e731
plugin android: improved state handling:
Goffi <goffi@goffi.org>
parents:
2771
diff
changeset
|
184 self.android_plugin.state = data |
90115cf4e731
plugin android: improved state handling:
Goffi <goffi@goffi.org>
parents:
2771
diff
changeset
|
185 else: |
3028 | 186 log.warning("Unexpected data: {data}".format(data=data)) |
2841
90115cf4e731
plugin android: improved state handling:
Goffi <goffi@goffi.org>
parents:
2771
diff
changeset
|
187 |
90115cf4e731
plugin android: improved state handling:
Goffi <goffi@goffi.org>
parents:
2771
diff
changeset
|
188 |
90115cf4e731
plugin android: improved state handling:
Goffi <goffi@goffi.org>
parents:
2771
diff
changeset
|
189 class FrontendStateFactory(protocol.Factory): |
90115cf4e731
plugin android: improved state handling:
Goffi <goffi@goffi.org>
parents:
2771
diff
changeset
|
190 |
90115cf4e731
plugin android: improved state handling:
Goffi <goffi@goffi.org>
parents:
2771
diff
changeset
|
191 def __init__(self, android_plugin): |
90115cf4e731
plugin android: improved state handling:
Goffi <goffi@goffi.org>
parents:
2771
diff
changeset
|
192 self.android_plugin = android_plugin |
90115cf4e731
plugin android: improved state handling:
Goffi <goffi@goffi.org>
parents:
2771
diff
changeset
|
193 |
90115cf4e731
plugin android: improved state handling:
Goffi <goffi@goffi.org>
parents:
2771
diff
changeset
|
194 def buildProtocol(self, addr): |
90115cf4e731
plugin android: improved state handling:
Goffi <goffi@goffi.org>
parents:
2771
diff
changeset
|
195 return FrontendStateProtocol(self.android_plugin) |
90115cf4e731
plugin android: improved state handling:
Goffi <goffi@goffi.org>
parents:
2771
diff
changeset
|
196 |
2100 | 197 |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
198 |
2100 | 199 class AndroidPlugin(object): |
200 | |
201 params = """ | |
202 <params> | |
203 <individual> | |
204 <category name="{category_name}" label="{category_label}"> | |
3106
7f7cdc6ecfd8
plugin android: sound notification + change settings:
Goffi <goffi@goffi.org>
parents:
3095
diff
changeset
|
205 <param name="{ring_param_name}" label="{ring_param_label}" type="list" security="0"> |
7f7cdc6ecfd8
plugin android: sound notification + change settings:
Goffi <goffi@goffi.org>
parents:
3095
diff
changeset
|
206 {ring_options} |
7f7cdc6ecfd8
plugin android: sound notification + change settings:
Goffi <goffi@goffi.org>
parents:
3095
diff
changeset
|
207 </param> |
7f7cdc6ecfd8
plugin android: sound notification + change settings:
Goffi <goffi@goffi.org>
parents:
3095
diff
changeset
|
208 <param name="{vibrate_param_name}" label="{vibrate_param_label}" type="list" security="0"> |
7f7cdc6ecfd8
plugin android: sound notification + change settings:
Goffi <goffi@goffi.org>
parents:
3095
diff
changeset
|
209 {vibrate_options} |
7f7cdc6ecfd8
plugin android: sound notification + change settings:
Goffi <goffi@goffi.org>
parents:
3095
diff
changeset
|
210 </param> |
2100 | 211 </category> |
212 </individual> | |
213 </params> | |
214 """.format( | |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
215 category_name=PARAM_VIBRATE_CATEGORY, |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
216 category_label=D_(PARAM_VIBRATE_CATEGORY), |
3106
7f7cdc6ecfd8
plugin android: sound notification + change settings:
Goffi <goffi@goffi.org>
parents:
3095
diff
changeset
|
217 vibrate_param_name=PARAM_VIBRATE_NAME, |
7f7cdc6ecfd8
plugin android: sound notification + change settings:
Goffi <goffi@goffi.org>
parents:
3095
diff
changeset
|
218 vibrate_param_label=PARAM_VIBRATE_LABEL, |
7f7cdc6ecfd8
plugin android: sound notification + change settings:
Goffi <goffi@goffi.org>
parents:
3095
diff
changeset
|
219 vibrate_options=params.makeOptions(VIBRATION_OPTS, "always"), |
7f7cdc6ecfd8
plugin android: sound notification + change settings:
Goffi <goffi@goffi.org>
parents:
3095
diff
changeset
|
220 ring_param_name=PARAM_RING_NAME, |
7f7cdc6ecfd8
plugin android: sound notification + change settings:
Goffi <goffi@goffi.org>
parents:
3095
diff
changeset
|
221 ring_param_label=PARAM_RING_LABEL, |
7f7cdc6ecfd8
plugin android: sound notification + change settings:
Goffi <goffi@goffi.org>
parents:
3095
diff
changeset
|
222 ring_options=params.makeOptions(RING_OPTS, "normal"), |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
223 ) |
2100 | 224 |
225 def __init__(self, host): | |
3028 | 226 log.info(_("plugin Android initialization")) |
3162
b5c058c7692e
core (xmpp), plugin android: fixed DNS, SRV handling on Android:
Goffi <goffi@goffi.org>
parents:
3154
diff
changeset
|
227 log.info(f"using Android API {api_version}") |
2100 | 228 self.host = host |
3028 | 229 self._csi = host.plugins.get('XEP-0352') |
2872
6b00f88316bf
plugin android: use XEP-0352 to indicate (in)active state:
Goffi <goffi@goffi.org>
parents:
2868
diff
changeset
|
230 self._csi_timer = None |
2100 | 231 host.memory.updateParams(self.params) |
2841
90115cf4e731
plugin android: improved state handling:
Goffi <goffi@goffi.org>
parents:
2771
diff
changeset
|
232 try: |
3028 | 233 os.mkdir(SOCKET_DIR, 0o700) |
2841
90115cf4e731
plugin android: improved state handling:
Goffi <goffi@goffi.org>
parents:
2771
diff
changeset
|
234 except OSError as e: |
90115cf4e731
plugin android: improved state handling:
Goffi <goffi@goffi.org>
parents:
2771
diff
changeset
|
235 if e.errno == 17: |
90115cf4e731
plugin android: improved state handling:
Goffi <goffi@goffi.org>
parents:
2771
diff
changeset
|
236 # dir already exists |
90115cf4e731
plugin android: improved state handling:
Goffi <goffi@goffi.org>
parents:
2771
diff
changeset
|
237 pass |
90115cf4e731
plugin android: improved state handling:
Goffi <goffi@goffi.org>
parents:
2771
diff
changeset
|
238 else: |
90115cf4e731
plugin android: improved state handling:
Goffi <goffi@goffi.org>
parents:
2771
diff
changeset
|
239 raise e |
90115cf4e731
plugin android: improved state handling:
Goffi <goffi@goffi.org>
parents:
2771
diff
changeset
|
240 self._state = None |
90115cf4e731
plugin android: improved state handling:
Goffi <goffi@goffi.org>
parents:
2771
diff
changeset
|
241 factory = FrontendStateFactory(self) |
90115cf4e731
plugin android: improved state handling:
Goffi <goffi@goffi.org>
parents:
2771
diff
changeset
|
242 socket_path = os.path.join(SOCKET_DIR, SOCKET_FILE) |
90115cf4e731
plugin android: improved state handling:
Goffi <goffi@goffi.org>
parents:
2771
diff
changeset
|
243 try: |
90115cf4e731
plugin android: improved state handling:
Goffi <goffi@goffi.org>
parents:
2771
diff
changeset
|
244 reactor.listenUNIX(socket_path, factory) |
90115cf4e731
plugin android: improved state handling:
Goffi <goffi@goffi.org>
parents:
2771
diff
changeset
|
245 except int_error.CannotListenError as e: |
90115cf4e731
plugin android: improved state handling:
Goffi <goffi@goffi.org>
parents:
2771
diff
changeset
|
246 if e.socketError.errno == 98: |
90115cf4e731
plugin android: improved state handling:
Goffi <goffi@goffi.org>
parents:
2771
diff
changeset
|
247 # the address is already in use, we need to remove it |
90115cf4e731
plugin android: improved state handling:
Goffi <goffi@goffi.org>
parents:
2771
diff
changeset
|
248 os.unlink(socket_path) |
90115cf4e731
plugin android: improved state handling:
Goffi <goffi@goffi.org>
parents:
2771
diff
changeset
|
249 reactor.listenUNIX(socket_path, factory) |
90115cf4e731
plugin android: improved state handling:
Goffi <goffi@goffi.org>
parents:
2771
diff
changeset
|
250 else: |
90115cf4e731
plugin android: improved state handling:
Goffi <goffi@goffi.org>
parents:
2771
diff
changeset
|
251 raise e |
90115cf4e731
plugin android: improved state handling:
Goffi <goffi@goffi.org>
parents:
2771
diff
changeset
|
252 # we set a low priority because we want the notification to be sent after all |
90115cf4e731
plugin android: improved state handling:
Goffi <goffi@goffi.org>
parents:
2771
diff
changeset
|
253 # plugins have done their job |
3172
dcebc585c29f
core: renamed "MessageReceived" trigger to "messageReceived" for consistency.
Goffi <goffi@goffi.org>
parents:
3162
diff
changeset
|
254 host.trigger.add("messageReceived", self.messageReceivedTrigger, priority=-1000) |
2100 | 255 |
3124
b86060901278
plugin android: added a `profileAutoconnectGet` method:
Goffi <goffi@goffi.org>
parents:
3106
diff
changeset
|
256 # profiles autoconnection |
b86060901278
plugin android: added a `profileAutoconnectGet` method:
Goffi <goffi@goffi.org>
parents:
3106
diff
changeset
|
257 host.bridge.addMethod( |
b86060901278
plugin android: added a `profileAutoconnectGet` method:
Goffi <goffi@goffi.org>
parents:
3106
diff
changeset
|
258 "profileAutoconnectGet", |
b86060901278
plugin android: added a `profileAutoconnectGet` method:
Goffi <goffi@goffi.org>
parents:
3106
diff
changeset
|
259 ".plugin", |
b86060901278
plugin android: added a `profileAutoconnectGet` method:
Goffi <goffi@goffi.org>
parents:
3106
diff
changeset
|
260 in_sign="", |
b86060901278
plugin android: added a `profileAutoconnectGet` method:
Goffi <goffi@goffi.org>
parents:
3106
diff
changeset
|
261 out_sign="s", |
b86060901278
plugin android: added a `profileAutoconnectGet` method:
Goffi <goffi@goffi.org>
parents:
3106
diff
changeset
|
262 method=self._profileAutoconnectGet, |
b86060901278
plugin android: added a `profileAutoconnectGet` method:
Goffi <goffi@goffi.org>
parents:
3106
diff
changeset
|
263 async_=True, |
b86060901278
plugin android: added a `profileAutoconnectGet` method:
Goffi <goffi@goffi.org>
parents:
3106
diff
changeset
|
264 ) |
b86060901278
plugin android: added a `profileAutoconnectGet` method:
Goffi <goffi@goffi.org>
parents:
3106
diff
changeset
|
265 |
3106
7f7cdc6ecfd8
plugin android: sound notification + change settings:
Goffi <goffi@goffi.org>
parents:
3095
diff
changeset
|
266 # audio manager, to get ring status |
7f7cdc6ecfd8
plugin android: sound notification + change settings:
Goffi <goffi@goffi.org>
parents:
3095
diff
changeset
|
267 self.am = activity.getSystemService(Context.AUDIO_SERVICE) |
7f7cdc6ecfd8
plugin android: sound notification + change settings:
Goffi <goffi@goffi.org>
parents:
3095
diff
changeset
|
268 |
7f7cdc6ecfd8
plugin android: sound notification + change settings:
Goffi <goffi@goffi.org>
parents:
3095
diff
changeset
|
269 # sound notification |
7f7cdc6ecfd8
plugin android: sound notification + change settings:
Goffi <goffi@goffi.org>
parents:
3095
diff
changeset
|
270 media_dir = Path(host.memory.getConfig("", "media_dir")) |
7f7cdc6ecfd8
plugin android: sound notification + change settings:
Goffi <goffi@goffi.org>
parents:
3095
diff
changeset
|
271 assert media_dir is not None |
7f7cdc6ecfd8
plugin android: sound notification + change settings:
Goffi <goffi@goffi.org>
parents:
3095
diff
changeset
|
272 notif_path = media_dir / "sounds" / "notifications" / "music-box.mp3" |
7f7cdc6ecfd8
plugin android: sound notification + change settings:
Goffi <goffi@goffi.org>
parents:
3095
diff
changeset
|
273 self.notif_player = MediaPlayer() |
7f7cdc6ecfd8
plugin android: sound notification + change settings:
Goffi <goffi@goffi.org>
parents:
3095
diff
changeset
|
274 self.notif_player.setDataSource(str(notif_path)) |
7f7cdc6ecfd8
plugin android: sound notification + change settings:
Goffi <goffi@goffi.org>
parents:
3095
diff
changeset
|
275 self.notif_player.setAudioStreamType(AudioManager.STREAM_NOTIFICATION) |
7f7cdc6ecfd8
plugin android: sound notification + change settings:
Goffi <goffi@goffi.org>
parents:
3095
diff
changeset
|
276 self.notif_player.prepare() |
7f7cdc6ecfd8
plugin android: sound notification + change settings:
Goffi <goffi@goffi.org>
parents:
3095
diff
changeset
|
277 |
3162
b5c058c7692e
core (xmpp), plugin android: fixed DNS, SRV handling on Android:
Goffi <goffi@goffi.org>
parents:
3154
diff
changeset
|
278 # DNS fix |
b5c058c7692e
core (xmpp), plugin android: fixed DNS, SRV handling on Android:
Goffi <goffi@goffi.org>
parents:
3154
diff
changeset
|
279 defer.ensureDeferred(self.updateResolver()) |
b5c058c7692e
core (xmpp), plugin android: fixed DNS, SRV handling on Android:
Goffi <goffi@goffi.org>
parents:
3154
diff
changeset
|
280 |
2887
9aadf11b315b
plugin android: check connectivity
Goffi <goffi@goffi.org>
parents:
2882
diff
changeset
|
281 # Connectivity handling |
9aadf11b315b
plugin android: check connectivity
Goffi <goffi@goffi.org>
parents:
2882
diff
changeset
|
282 self.cm = activity.getSystemService(Context.CONNECTIVITY_SERVICE) |
9aadf11b315b
plugin android: check connectivity
Goffi <goffi@goffi.org>
parents:
2882
diff
changeset
|
283 self._net_type = None |
3125
c3ce8c997fdf
plugin android: reconnect profiles with autoconnect if network is activated:
Goffi <goffi@goffi.org>
parents:
3124
diff
changeset
|
284 d = defer.ensureDeferred(self._checkConnectivity()) |
c3ce8c997fdf
plugin android: reconnect profiles with autoconnect if network is activated:
Goffi <goffi@goffi.org>
parents:
3124
diff
changeset
|
285 d.addErrback(host.logErrback) |
c3ce8c997fdf
plugin android: reconnect profiles with autoconnect if network is activated:
Goffi <goffi@goffi.org>
parents:
3124
diff
changeset
|
286 |
2887
9aadf11b315b
plugin android: check connectivity
Goffi <goffi@goffi.org>
parents:
2882
diff
changeset
|
287 # XXX: we need to keep a reference to BroadcastReceiver to avoid |
9aadf11b315b
plugin android: check connectivity
Goffi <goffi@goffi.org>
parents:
2882
diff
changeset
|
288 # "XXX has no attribute 'invoke'" error (looks like the same issue as |
9aadf11b315b
plugin android: check connectivity
Goffi <goffi@goffi.org>
parents:
2882
diff
changeset
|
289 # https://github.com/kivy/pyjnius/issues/59) |
9aadf11b315b
plugin android: check connectivity
Goffi <goffi@goffi.org>
parents:
2882
diff
changeset
|
290 self.br = BroadcastReceiver( |
9aadf11b315b
plugin android: check connectivity
Goffi <goffi@goffi.org>
parents:
2882
diff
changeset
|
291 callback=lambda *args, **kwargs: reactor.callLater(0, |
9aadf11b315b
plugin android: check connectivity
Goffi <goffi@goffi.org>
parents:
2882
diff
changeset
|
292 self.onConnectivityChange), |
3028 | 293 actions=["android.net.conn.CONNECTIVITY_CHANGE"]) |
2887
9aadf11b315b
plugin android: check connectivity
Goffi <goffi@goffi.org>
parents:
2882
diff
changeset
|
294 self.br.start() |
9aadf11b315b
plugin android: check connectivity
Goffi <goffi@goffi.org>
parents:
2882
diff
changeset
|
295 |
2100 | 296 @property |
2841
90115cf4e731
plugin android: improved state handling:
Goffi <goffi@goffi.org>
parents:
2771
diff
changeset
|
297 def state(self): |
90115cf4e731
plugin android: improved state handling:
Goffi <goffi@goffi.org>
parents:
2771
diff
changeset
|
298 return self._state |
90115cf4e731
plugin android: improved state handling:
Goffi <goffi@goffi.org>
parents:
2771
diff
changeset
|
299 |
90115cf4e731
plugin android: improved state handling:
Goffi <goffi@goffi.org>
parents:
2771
diff
changeset
|
300 @state.setter |
90115cf4e731
plugin android: improved state handling:
Goffi <goffi@goffi.org>
parents:
2771
diff
changeset
|
301 def state(self, new_state): |
3057
f91d0e6d9b13
plugin android: fixed encoding in states after Python 3 port
Goffi <goffi@goffi.org>
parents:
3028
diff
changeset
|
302 log.debug(f"frontend state has changed: {new_state.decode()}") |
2841
90115cf4e731
plugin android: improved state handling:
Goffi <goffi@goffi.org>
parents:
2771
diff
changeset
|
303 previous_state = self._state |
90115cf4e731
plugin android: improved state handling:
Goffi <goffi@goffi.org>
parents:
2771
diff
changeset
|
304 self._state = new_state |
90115cf4e731
plugin android: improved state handling:
Goffi <goffi@goffi.org>
parents:
2771
diff
changeset
|
305 if new_state == STATE_RUNNING: |
90115cf4e731
plugin android: improved state handling:
Goffi <goffi@goffi.org>
parents:
2771
diff
changeset
|
306 self._onRunning(previous_state) |
90115cf4e731
plugin android: improved state handling:
Goffi <goffi@goffi.org>
parents:
2771
diff
changeset
|
307 elif new_state == STATE_PAUSED: |
90115cf4e731
plugin android: improved state handling:
Goffi <goffi@goffi.org>
parents:
2771
diff
changeset
|
308 self._onPaused(previous_state) |
90115cf4e731
plugin android: improved state handling:
Goffi <goffi@goffi.org>
parents:
2771
diff
changeset
|
309 elif new_state == STATE_STOPPED: |
90115cf4e731
plugin android: improved state handling:
Goffi <goffi@goffi.org>
parents:
2771
diff
changeset
|
310 self._onStopped(previous_state) |
90115cf4e731
plugin android: improved state handling:
Goffi <goffi@goffi.org>
parents:
2771
diff
changeset
|
311 |
90115cf4e731
plugin android: improved state handling:
Goffi <goffi@goffi.org>
parents:
2771
diff
changeset
|
312 @property |
2100 | 313 def cagou_active(self): |
2841
90115cf4e731
plugin android: improved state handling:
Goffi <goffi@goffi.org>
parents:
2771
diff
changeset
|
314 return self._state == STATE_RUNNING |
90115cf4e731
plugin android: improved state handling:
Goffi <goffi@goffi.org>
parents:
2771
diff
changeset
|
315 |
90115cf4e731
plugin android: improved state handling:
Goffi <goffi@goffi.org>
parents:
2771
diff
changeset
|
316 def _onRunning(self, previous_state): |
90115cf4e731
plugin android: improved state handling:
Goffi <goffi@goffi.org>
parents:
2771
diff
changeset
|
317 if previous_state is not None: |
90115cf4e731
plugin android: improved state handling:
Goffi <goffi@goffi.org>
parents:
2771
diff
changeset
|
318 self.host.bridge.bridgeReactivateSignals() |
2872
6b00f88316bf
plugin android: use XEP-0352 to indicate (in)active state:
Goffi <goffi@goffi.org>
parents:
2868
diff
changeset
|
319 self.setActive() |
2841
90115cf4e731
plugin android: improved state handling:
Goffi <goffi@goffi.org>
parents:
2771
diff
changeset
|
320 |
90115cf4e731
plugin android: improved state handling:
Goffi <goffi@goffi.org>
parents:
2771
diff
changeset
|
321 def _onPaused(self, previous_state): |
90115cf4e731
plugin android: improved state handling:
Goffi <goffi@goffi.org>
parents:
2771
diff
changeset
|
322 self.host.bridge.bridgeDeactivateSignals() |
2872
6b00f88316bf
plugin android: use XEP-0352 to indicate (in)active state:
Goffi <goffi@goffi.org>
parents:
2868
diff
changeset
|
323 self.setInactive() |
2841
90115cf4e731
plugin android: improved state handling:
Goffi <goffi@goffi.org>
parents:
2771
diff
changeset
|
324 |
90115cf4e731
plugin android: improved state handling:
Goffi <goffi@goffi.org>
parents:
2771
diff
changeset
|
325 def _onStopped(self, previous_state): |
2872
6b00f88316bf
plugin android: use XEP-0352 to indicate (in)active state:
Goffi <goffi@goffi.org>
parents:
2868
diff
changeset
|
326 self.setInactive() |
2100 | 327 |
328 def _notifyMessage(self, mess_data, client): | |
2856
26d6ac4e4a66
plugin android: don't send notification if message comes from ourself (from an other device)
Goffi <goffi@goffi.org>
parents:
2841
diff
changeset
|
329 """Send notification when suitable |
26d6ac4e4a66
plugin android: don't send notification if message comes from ourself (from an other device)
Goffi <goffi@goffi.org>
parents:
2841
diff
changeset
|
330 |
26d6ac4e4a66
plugin android: don't send notification if message comes from ourself (from an other device)
Goffi <goffi@goffi.org>
parents:
2841
diff
changeset
|
331 notification is sent if: |
26d6ac4e4a66
plugin android: don't send notification if message comes from ourself (from an other device)
Goffi <goffi@goffi.org>
parents:
2841
diff
changeset
|
332 - there is a message and it is not a groupchat |
26d6ac4e4a66
plugin android: don't send notification if message comes from ourself (from an other device)
Goffi <goffi@goffi.org>
parents:
2841
diff
changeset
|
333 - message is not coming from ourself |
26d6ac4e4a66
plugin android: don't send notification if message comes from ourself (from an other device)
Goffi <goffi@goffi.org>
parents:
2841
diff
changeset
|
334 """ |
26d6ac4e4a66
plugin android: don't send notification if message comes from ourself (from an other device)
Goffi <goffi@goffi.org>
parents:
2841
diff
changeset
|
335 if (mess_data["message"] and mess_data["type"] != C.MESS_TYPE_GROUPCHAT |
26d6ac4e4a66
plugin android: don't send notification if message comes from ourself (from an other device)
Goffi <goffi@goffi.org>
parents:
2841
diff
changeset
|
336 and not mess_data["from"].userhostJID() == client.jid.userhostJID()): |
3028 | 337 message = next(iter(mess_data["message"].values())) |
2100 | 338 try: |
3028 | 339 subject = next(iter(mess_data["subject"].values())) |
2100 | 340 except StopIteration: |
3154
f2d3ab4390a3
plugin android: attach an action dict to notification:
Goffi <goffi@goffi.org>
parents:
3137
diff
changeset
|
341 subject = D_("new message from {contact}").format( |
f2d3ab4390a3
plugin android: attach an action dict to notification:
Goffi <goffi@goffi.org>
parents:
3137
diff
changeset
|
342 contact = mess_data['from']) |
2100 | 343 |
3154
f2d3ab4390a3
plugin android: attach an action dict to notification:
Goffi <goffi@goffi.org>
parents:
3137
diff
changeset
|
344 notification = Notification() |
f2d3ab4390a3
plugin android: attach an action dict to notification:
Goffi <goffi@goffi.org>
parents:
3137
diff
changeset
|
345 notification._notify( |
f2d3ab4390a3
plugin android: attach an action dict to notification:
Goffi <goffi@goffi.org>
parents:
3137
diff
changeset
|
346 title=subject, |
f2d3ab4390a3
plugin android: attach an action dict to notification:
Goffi <goffi@goffi.org>
parents:
3137
diff
changeset
|
347 message=message, |
f2d3ab4390a3
plugin android: attach an action dict to notification:
Goffi <goffi@goffi.org>
parents:
3137
diff
changeset
|
348 sat_action={ |
f2d3ab4390a3
plugin android: attach an action dict to notification:
Goffi <goffi@goffi.org>
parents:
3137
diff
changeset
|
349 "type": "open", |
f2d3ab4390a3
plugin android: attach an action dict to notification:
Goffi <goffi@goffi.org>
parents:
3137
diff
changeset
|
350 "widget": "chat", |
f2d3ab4390a3
plugin android: attach an action dict to notification:
Goffi <goffi@goffi.org>
parents:
3137
diff
changeset
|
351 "target": mess_data["from"].userhost(), |
f2d3ab4390a3
plugin android: attach an action dict to notification:
Goffi <goffi@goffi.org>
parents:
3137
diff
changeset
|
352 }, |
f2d3ab4390a3
plugin android: attach an action dict to notification:
Goffi <goffi@goffi.org>
parents:
3137
diff
changeset
|
353 ) |
3106
7f7cdc6ecfd8
plugin android: sound notification + change settings:
Goffi <goffi@goffi.org>
parents:
3095
diff
changeset
|
354 |
7f7cdc6ecfd8
plugin android: sound notification + change settings:
Goffi <goffi@goffi.org>
parents:
3095
diff
changeset
|
355 ringer_mode = self.am.getRingerMode() |
7f7cdc6ecfd8
plugin android: sound notification + change settings:
Goffi <goffi@goffi.org>
parents:
3095
diff
changeset
|
356 vibrate_mode = ringer_mode == AudioManager.RINGER_MODE_VIBRATE |
7f7cdc6ecfd8
plugin android: sound notification + change settings:
Goffi <goffi@goffi.org>
parents:
3095
diff
changeset
|
357 |
7f7cdc6ecfd8
plugin android: sound notification + change settings:
Goffi <goffi@goffi.org>
parents:
3095
diff
changeset
|
358 ring_setting = self.host.memory.getParamA( |
7f7cdc6ecfd8
plugin android: sound notification + change settings:
Goffi <goffi@goffi.org>
parents:
3095
diff
changeset
|
359 PARAM_RING_NAME, |
7f7cdc6ecfd8
plugin android: sound notification + change settings:
Goffi <goffi@goffi.org>
parents:
3095
diff
changeset
|
360 PARAM_RING_CATEGORY, |
7f7cdc6ecfd8
plugin android: sound notification + change settings:
Goffi <goffi@goffi.org>
parents:
3095
diff
changeset
|
361 profile_key=client.profile |
7f7cdc6ecfd8
plugin android: sound notification + change settings:
Goffi <goffi@goffi.org>
parents:
3095
diff
changeset
|
362 ) |
7f7cdc6ecfd8
plugin android: sound notification + change settings:
Goffi <goffi@goffi.org>
parents:
3095
diff
changeset
|
363 |
7f7cdc6ecfd8
plugin android: sound notification + change settings:
Goffi <goffi@goffi.org>
parents:
3095
diff
changeset
|
364 if ring_setting != 'never' and ringer_mode == AudioManager.RINGER_MODE_NORMAL: |
7f7cdc6ecfd8
plugin android: sound notification + change settings:
Goffi <goffi@goffi.org>
parents:
3095
diff
changeset
|
365 self.notif_player.start() |
7f7cdc6ecfd8
plugin android: sound notification + change settings:
Goffi <goffi@goffi.org>
parents:
3095
diff
changeset
|
366 |
7f7cdc6ecfd8
plugin android: sound notification + change settings:
Goffi <goffi@goffi.org>
parents:
3095
diff
changeset
|
367 vibration_setting = self.host.memory.getParamA( |
7f7cdc6ecfd8
plugin android: sound notification + change settings:
Goffi <goffi@goffi.org>
parents:
3095
diff
changeset
|
368 PARAM_VIBRATE_NAME, |
7f7cdc6ecfd8
plugin android: sound notification + change settings:
Goffi <goffi@goffi.org>
parents:
3095
diff
changeset
|
369 PARAM_VIBRATE_CATEGORY, |
7f7cdc6ecfd8
plugin android: sound notification + change settings:
Goffi <goffi@goffi.org>
parents:
3095
diff
changeset
|
370 profile_key=client.profile |
7f7cdc6ecfd8
plugin android: sound notification + change settings:
Goffi <goffi@goffi.org>
parents:
3095
diff
changeset
|
371 ) |
7f7cdc6ecfd8
plugin android: sound notification + change settings:
Goffi <goffi@goffi.org>
parents:
3095
diff
changeset
|
372 if (vibration_setting == 'always' |
7f7cdc6ecfd8
plugin android: sound notification + change settings:
Goffi <goffi@goffi.org>
parents:
3095
diff
changeset
|
373 or vibration_setting == 'vibrate' and vibrate_mode): |
7f7cdc6ecfd8
plugin android: sound notification + change settings:
Goffi <goffi@goffi.org>
parents:
3095
diff
changeset
|
374 try: |
7f7cdc6ecfd8
plugin android: sound notification + change settings:
Goffi <goffi@goffi.org>
parents:
3095
diff
changeset
|
375 vibrator.vibrate() |
7f7cdc6ecfd8
plugin android: sound notification + change settings:
Goffi <goffi@goffi.org>
parents:
3095
diff
changeset
|
376 except Exception as e: |
7f7cdc6ecfd8
plugin android: sound notification + change settings:
Goffi <goffi@goffi.org>
parents:
3095
diff
changeset
|
377 log.warning("Can't use vibrator: {e}".format(e=e)) |
2100 | 378 return mess_data |
379 | |
380 def messageReceivedTrigger(self, client, message_elt, post_treat): | |
381 if not self.cagou_active: | |
382 # we only send notification is the frontend is not displayed | |
383 post_treat.addCallback(self._notifyMessage, client) | |
384 | |
385 return True | |
2872
6b00f88316bf
plugin android: use XEP-0352 to indicate (in)active state:
Goffi <goffi@goffi.org>
parents:
2868
diff
changeset
|
386 |
3124
b86060901278
plugin android: added a `profileAutoconnectGet` method:
Goffi <goffi@goffi.org>
parents:
3106
diff
changeset
|
387 # Profile autoconnection |
b86060901278
plugin android: added a `profileAutoconnectGet` method:
Goffi <goffi@goffi.org>
parents:
3106
diff
changeset
|
388 |
b86060901278
plugin android: added a `profileAutoconnectGet` method:
Goffi <goffi@goffi.org>
parents:
3106
diff
changeset
|
389 def _profileAutoconnectGet(self): |
b86060901278
plugin android: added a `profileAutoconnectGet` method:
Goffi <goffi@goffi.org>
parents:
3106
diff
changeset
|
390 return defer.ensureDeferred(self.profileAutoconnectGet()) |
b86060901278
plugin android: added a `profileAutoconnectGet` method:
Goffi <goffi@goffi.org>
parents:
3106
diff
changeset
|
391 |
3125
c3ce8c997fdf
plugin android: reconnect profiles with autoconnect if network is activated:
Goffi <goffi@goffi.org>
parents:
3124
diff
changeset
|
392 async def _getProfilesAutoconnect(self): |
3124
b86060901278
plugin android: added a `profileAutoconnectGet` method:
Goffi <goffi@goffi.org>
parents:
3106
diff
changeset
|
393 autoconnect_dict = await self.host.memory.storage.getIndParamValues( |
b86060901278
plugin android: added a `profileAutoconnectGet` method:
Goffi <goffi@goffi.org>
parents:
3106
diff
changeset
|
394 category='Connection', name='autoconnect_backend', |
b86060901278
plugin android: added a `profileAutoconnectGet` method:
Goffi <goffi@goffi.org>
parents:
3106
diff
changeset
|
395 ) |
3125
c3ce8c997fdf
plugin android: reconnect profiles with autoconnect if network is activated:
Goffi <goffi@goffi.org>
parents:
3124
diff
changeset
|
396 return [p for p, v in autoconnect_dict.items() if C.bool(v)] |
c3ce8c997fdf
plugin android: reconnect profiles with autoconnect if network is activated:
Goffi <goffi@goffi.org>
parents:
3124
diff
changeset
|
397 |
c3ce8c997fdf
plugin android: reconnect profiles with autoconnect if network is activated:
Goffi <goffi@goffi.org>
parents:
3124
diff
changeset
|
398 async def profileAutoconnectGet(self): |
c3ce8c997fdf
plugin android: reconnect profiles with autoconnect if network is activated:
Goffi <goffi@goffi.org>
parents:
3124
diff
changeset
|
399 """Return profile to connect automatically by frontend, if any""" |
c3ce8c997fdf
plugin android: reconnect profiles with autoconnect if network is activated:
Goffi <goffi@goffi.org>
parents:
3124
diff
changeset
|
400 profiles_autoconnect = await self._getProfilesAutoconnect() |
3124
b86060901278
plugin android: added a `profileAutoconnectGet` method:
Goffi <goffi@goffi.org>
parents:
3106
diff
changeset
|
401 if not profiles_autoconnect: |
b86060901278
plugin android: added a `profileAutoconnectGet` method:
Goffi <goffi@goffi.org>
parents:
3106
diff
changeset
|
402 return None |
b86060901278
plugin android: added a `profileAutoconnectGet` method:
Goffi <goffi@goffi.org>
parents:
3106
diff
changeset
|
403 if len(profiles_autoconnect) > 1: |
b86060901278
plugin android: added a `profileAutoconnectGet` method:
Goffi <goffi@goffi.org>
parents:
3106
diff
changeset
|
404 log.warning( |
b86060901278
plugin android: added a `profileAutoconnectGet` method:
Goffi <goffi@goffi.org>
parents:
3106
diff
changeset
|
405 f"More that one profiles with backend autoconnection set found, picking " |
b86060901278
plugin android: added a `profileAutoconnectGet` method:
Goffi <goffi@goffi.org>
parents:
3106
diff
changeset
|
406 f"up first one (full list: {profiles_autoconnect!r})") |
b86060901278
plugin android: added a `profileAutoconnectGet` method:
Goffi <goffi@goffi.org>
parents:
3106
diff
changeset
|
407 return profiles_autoconnect[0] |
b86060901278
plugin android: added a `profileAutoconnectGet` method:
Goffi <goffi@goffi.org>
parents:
3106
diff
changeset
|
408 |
2872
6b00f88316bf
plugin android: use XEP-0352 to indicate (in)active state:
Goffi <goffi@goffi.org>
parents:
2868
diff
changeset
|
409 # CSI |
6b00f88316bf
plugin android: use XEP-0352 to indicate (in)active state:
Goffi <goffi@goffi.org>
parents:
2868
diff
changeset
|
410 |
6b00f88316bf
plugin android: use XEP-0352 to indicate (in)active state:
Goffi <goffi@goffi.org>
parents:
2868
diff
changeset
|
411 def _setInactive(self): |
6b00f88316bf
plugin android: use XEP-0352 to indicate (in)active state:
Goffi <goffi@goffi.org>
parents:
2868
diff
changeset
|
412 self._csi_timer = None |
6b00f88316bf
plugin android: use XEP-0352 to indicate (in)active state:
Goffi <goffi@goffi.org>
parents:
2868
diff
changeset
|
413 for client in self.host.getClients(C.PROF_KEY_ALL): |
6b00f88316bf
plugin android: use XEP-0352 to indicate (in)active state:
Goffi <goffi@goffi.org>
parents:
2868
diff
changeset
|
414 self._csi.setInactive(client) |
6b00f88316bf
plugin android: use XEP-0352 to indicate (in)active state:
Goffi <goffi@goffi.org>
parents:
2868
diff
changeset
|
415 |
6b00f88316bf
plugin android: use XEP-0352 to indicate (in)active state:
Goffi <goffi@goffi.org>
parents:
2868
diff
changeset
|
416 def setInactive(self): |
6b00f88316bf
plugin android: use XEP-0352 to indicate (in)active state:
Goffi <goffi@goffi.org>
parents:
2868
diff
changeset
|
417 if self._csi is None or self._csi_timer is not None: |
6b00f88316bf
plugin android: use XEP-0352 to indicate (in)active state:
Goffi <goffi@goffi.org>
parents:
2868
diff
changeset
|
418 return |
6b00f88316bf
plugin android: use XEP-0352 to indicate (in)active state:
Goffi <goffi@goffi.org>
parents:
2868
diff
changeset
|
419 self._csi_timer = reactor.callLater(CSI_DELAY, self._setInactive) |
6b00f88316bf
plugin android: use XEP-0352 to indicate (in)active state:
Goffi <goffi@goffi.org>
parents:
2868
diff
changeset
|
420 |
6b00f88316bf
plugin android: use XEP-0352 to indicate (in)active state:
Goffi <goffi@goffi.org>
parents:
2868
diff
changeset
|
421 def setActive(self): |
6b00f88316bf
plugin android: use XEP-0352 to indicate (in)active state:
Goffi <goffi@goffi.org>
parents:
2868
diff
changeset
|
422 if self._csi is None: |
6b00f88316bf
plugin android: use XEP-0352 to indicate (in)active state:
Goffi <goffi@goffi.org>
parents:
2868
diff
changeset
|
423 return |
6b00f88316bf
plugin android: use XEP-0352 to indicate (in)active state:
Goffi <goffi@goffi.org>
parents:
2868
diff
changeset
|
424 if self._csi_timer is not None: |
6b00f88316bf
plugin android: use XEP-0352 to indicate (in)active state:
Goffi <goffi@goffi.org>
parents:
2868
diff
changeset
|
425 self._csi_timer.cancel() |
2882
0c54970d8e6e
plugin android: fixed csi_timer reset in setActive + crash on call of isActive before session initialisation
Goffi <goffi@goffi.org>
parents:
2872
diff
changeset
|
426 self._csi_timer = None |
2872
6b00f88316bf
plugin android: use XEP-0352 to indicate (in)active state:
Goffi <goffi@goffi.org>
parents:
2868
diff
changeset
|
427 for client in self.host.getClients(C.PROF_KEY_ALL): |
6b00f88316bf
plugin android: use XEP-0352 to indicate (in)active state:
Goffi <goffi@goffi.org>
parents:
2868
diff
changeset
|
428 self._csi.setActive(client) |
2887
9aadf11b315b
plugin android: check connectivity
Goffi <goffi@goffi.org>
parents:
2882
diff
changeset
|
429 |
9aadf11b315b
plugin android: check connectivity
Goffi <goffi@goffi.org>
parents:
2882
diff
changeset
|
430 # Connectivity |
9aadf11b315b
plugin android: check connectivity
Goffi <goffi@goffi.org>
parents:
2882
diff
changeset
|
431 |
3125
c3ce8c997fdf
plugin android: reconnect profiles with autoconnect if network is activated:
Goffi <goffi@goffi.org>
parents:
3124
diff
changeset
|
432 async def _handleNetworkChange(self, net_type): |
2887
9aadf11b315b
plugin android: check connectivity
Goffi <goffi@goffi.org>
parents:
2882
diff
changeset
|
433 """Notify the clients about network changes. |
9aadf11b315b
plugin android: check connectivity
Goffi <goffi@goffi.org>
parents:
2882
diff
changeset
|
434 |
9aadf11b315b
plugin android: check connectivity
Goffi <goffi@goffi.org>
parents:
2882
diff
changeset
|
435 This way the client can disconnect/reconnect transport, or change delays |
9aadf11b315b
plugin android: check connectivity
Goffi <goffi@goffi.org>
parents:
2882
diff
changeset
|
436 """ |
3125
c3ce8c997fdf
plugin android: reconnect profiles with autoconnect if network is activated:
Goffi <goffi@goffi.org>
parents:
3124
diff
changeset
|
437 log.debug(f"handling network change ({net_type})") |
c3ce8c997fdf
plugin android: reconnect profiles with autoconnect if network is activated:
Goffi <goffi@goffi.org>
parents:
3124
diff
changeset
|
438 if net_type == NET_TYPE_NONE: |
2887
9aadf11b315b
plugin android: check connectivity
Goffi <goffi@goffi.org>
parents:
2882
diff
changeset
|
439 for client in self.host.getClients(C.PROF_KEY_ALL): |
9aadf11b315b
plugin android: check connectivity
Goffi <goffi@goffi.org>
parents:
2882
diff
changeset
|
440 client.networkDisabled() |
3125
c3ce8c997fdf
plugin android: reconnect profiles with autoconnect if network is activated:
Goffi <goffi@goffi.org>
parents:
3124
diff
changeset
|
441 else: |
3162
b5c058c7692e
core (xmpp), plugin android: fixed DNS, SRV handling on Android:
Goffi <goffi@goffi.org>
parents:
3154
diff
changeset
|
442 # DNS servers may have changed |
b5c058c7692e
core (xmpp), plugin android: fixed DNS, SRV handling on Android:
Goffi <goffi@goffi.org>
parents:
3154
diff
changeset
|
443 await self.updateResolver() |
3125
c3ce8c997fdf
plugin android: reconnect profiles with autoconnect if network is activated:
Goffi <goffi@goffi.org>
parents:
3124
diff
changeset
|
444 # client may be there but disabled (e.g. with stream management) |
2887
9aadf11b315b
plugin android: check connectivity
Goffi <goffi@goffi.org>
parents:
2882
diff
changeset
|
445 for client in self.host.getClients(C.PROF_KEY_ALL): |
3125
c3ce8c997fdf
plugin android: reconnect profiles with autoconnect if network is activated:
Goffi <goffi@goffi.org>
parents:
3124
diff
changeset
|
446 log.debug(f"enabling network for {client.profile}") |
2887
9aadf11b315b
plugin android: check connectivity
Goffi <goffi@goffi.org>
parents:
2882
diff
changeset
|
447 client.networkEnabled() |
9aadf11b315b
plugin android: check connectivity
Goffi <goffi@goffi.org>
parents:
2882
diff
changeset
|
448 |
3125
c3ce8c997fdf
plugin android: reconnect profiles with autoconnect if network is activated:
Goffi <goffi@goffi.org>
parents:
3124
diff
changeset
|
449 # profiles may have been disconnected and then purged, we try |
c3ce8c997fdf
plugin android: reconnect profiles with autoconnect if network is activated:
Goffi <goffi@goffi.org>
parents:
3124
diff
changeset
|
450 # to reconnect them in case |
c3ce8c997fdf
plugin android: reconnect profiles with autoconnect if network is activated:
Goffi <goffi@goffi.org>
parents:
3124
diff
changeset
|
451 profiles_autoconnect = await self._getProfilesAutoconnect() |
c3ce8c997fdf
plugin android: reconnect profiles with autoconnect if network is activated:
Goffi <goffi@goffi.org>
parents:
3124
diff
changeset
|
452 for profile in profiles_autoconnect: |
c3ce8c997fdf
plugin android: reconnect profiles with autoconnect if network is activated:
Goffi <goffi@goffi.org>
parents:
3124
diff
changeset
|
453 if not self.host.isConnected(profile): |
c3ce8c997fdf
plugin android: reconnect profiles with autoconnect if network is activated:
Goffi <goffi@goffi.org>
parents:
3124
diff
changeset
|
454 log.info(f"{profile} is not connected, reconnecting it") |
c3ce8c997fdf
plugin android: reconnect profiles with autoconnect if network is activated:
Goffi <goffi@goffi.org>
parents:
3124
diff
changeset
|
455 try: |
c3ce8c997fdf
plugin android: reconnect profiles with autoconnect if network is activated:
Goffi <goffi@goffi.org>
parents:
3124
diff
changeset
|
456 await self.host.connect(profile) |
c3ce8c997fdf
plugin android: reconnect profiles with autoconnect if network is activated:
Goffi <goffi@goffi.org>
parents:
3124
diff
changeset
|
457 except Exception as e: |
c3ce8c997fdf
plugin android: reconnect profiles with autoconnect if network is activated:
Goffi <goffi@goffi.org>
parents:
3124
diff
changeset
|
458 log.error(f"Can't connect profile {profile}: {e}") |
c3ce8c997fdf
plugin android: reconnect profiles with autoconnect if network is activated:
Goffi <goffi@goffi.org>
parents:
3124
diff
changeset
|
459 |
c3ce8c997fdf
plugin android: reconnect profiles with autoconnect if network is activated:
Goffi <goffi@goffi.org>
parents:
3124
diff
changeset
|
460 async def _checkConnectivity(self): |
2887
9aadf11b315b
plugin android: check connectivity
Goffi <goffi@goffi.org>
parents:
2882
diff
changeset
|
461 active_network = self.cm.getActiveNetworkInfo() |
9aadf11b315b
plugin android: check connectivity
Goffi <goffi@goffi.org>
parents:
2882
diff
changeset
|
462 if active_network is None: |
9aadf11b315b
plugin android: check connectivity
Goffi <goffi@goffi.org>
parents:
2882
diff
changeset
|
463 net_type = NET_TYPE_NONE |
9aadf11b315b
plugin android: check connectivity
Goffi <goffi@goffi.org>
parents:
2882
diff
changeset
|
464 else: |
9aadf11b315b
plugin android: check connectivity
Goffi <goffi@goffi.org>
parents:
2882
diff
changeset
|
465 net_type_android = active_network.getType() |
9aadf11b315b
plugin android: check connectivity
Goffi <goffi@goffi.org>
parents:
2882
diff
changeset
|
466 if net_type_android == ConnectivityManager.TYPE_WIFI: |
9aadf11b315b
plugin android: check connectivity
Goffi <goffi@goffi.org>
parents:
2882
diff
changeset
|
467 net_type = NET_TYPE_WIFI |
9aadf11b315b
plugin android: check connectivity
Goffi <goffi@goffi.org>
parents:
2882
diff
changeset
|
468 elif net_type_android == ConnectivityManager.TYPE_MOBILE: |
9aadf11b315b
plugin android: check connectivity
Goffi <goffi@goffi.org>
parents:
2882
diff
changeset
|
469 net_type = NET_TYPE_MOBILE |
9aadf11b315b
plugin android: check connectivity
Goffi <goffi@goffi.org>
parents:
2882
diff
changeset
|
470 else: |
9aadf11b315b
plugin android: check connectivity
Goffi <goffi@goffi.org>
parents:
2882
diff
changeset
|
471 net_type = NET_TYPE_OTHER |
3125
c3ce8c997fdf
plugin android: reconnect profiles with autoconnect if network is activated:
Goffi <goffi@goffi.org>
parents:
3124
diff
changeset
|
472 |
2887
9aadf11b315b
plugin android: check connectivity
Goffi <goffi@goffi.org>
parents:
2882
diff
changeset
|
473 if net_type != self._net_type: |
3028 | 474 log.info("connectivity has changed") |
2887
9aadf11b315b
plugin android: check connectivity
Goffi <goffi@goffi.org>
parents:
2882
diff
changeset
|
475 self._net_type = net_type |
9aadf11b315b
plugin android: check connectivity
Goffi <goffi@goffi.org>
parents:
2882
diff
changeset
|
476 if net_type == NET_TYPE_NONE: |
3028 | 477 log.info("no network active") |
2887
9aadf11b315b
plugin android: check connectivity
Goffi <goffi@goffi.org>
parents:
2882
diff
changeset
|
478 elif net_type == NET_TYPE_WIFI: |
3028 | 479 log.info("WIFI activated") |
2887
9aadf11b315b
plugin android: check connectivity
Goffi <goffi@goffi.org>
parents:
2882
diff
changeset
|
480 elif net_type == NET_TYPE_MOBILE: |
3028 | 481 log.info("mobile data activated") |
2887
9aadf11b315b
plugin android: check connectivity
Goffi <goffi@goffi.org>
parents:
2882
diff
changeset
|
482 else: |
3028 | 483 log.info("network activated (type={net_type_android})" |
2887
9aadf11b315b
plugin android: check connectivity
Goffi <goffi@goffi.org>
parents:
2882
diff
changeset
|
484 .format(net_type_android=net_type_android)) |
9aadf11b315b
plugin android: check connectivity
Goffi <goffi@goffi.org>
parents:
2882
diff
changeset
|
485 else: |
3028 | 486 log.debug("_checkConnectivity called without network change ({net_type})" |
2887
9aadf11b315b
plugin android: check connectivity
Goffi <goffi@goffi.org>
parents:
2882
diff
changeset
|
487 .format(net_type = net_type)) |
9aadf11b315b
plugin android: check connectivity
Goffi <goffi@goffi.org>
parents:
2882
diff
changeset
|
488 |
3125
c3ce8c997fdf
plugin android: reconnect profiles with autoconnect if network is activated:
Goffi <goffi@goffi.org>
parents:
3124
diff
changeset
|
489 # we always call _handleNetworkChange even if there is not connectivity change |
c3ce8c997fdf
plugin android: reconnect profiles with autoconnect if network is activated:
Goffi <goffi@goffi.org>
parents:
3124
diff
changeset
|
490 # to be sure to reconnect when necessary |
c3ce8c997fdf
plugin android: reconnect profiles with autoconnect if network is activated:
Goffi <goffi@goffi.org>
parents:
3124
diff
changeset
|
491 await self._handleNetworkChange(net_type) |
c3ce8c997fdf
plugin android: reconnect profiles with autoconnect if network is activated:
Goffi <goffi@goffi.org>
parents:
3124
diff
changeset
|
492 |
2887
9aadf11b315b
plugin android: check connectivity
Goffi <goffi@goffi.org>
parents:
2882
diff
changeset
|
493 |
9aadf11b315b
plugin android: check connectivity
Goffi <goffi@goffi.org>
parents:
2882
diff
changeset
|
494 def onConnectivityChange(self): |
3028 | 495 log.debug("onConnectivityChange called") |
3125
c3ce8c997fdf
plugin android: reconnect profiles with autoconnect if network is activated:
Goffi <goffi@goffi.org>
parents:
3124
diff
changeset
|
496 d = defer.ensureDeferred(self._checkConnectivity()) |
c3ce8c997fdf
plugin android: reconnect profiles with autoconnect if network is activated:
Goffi <goffi@goffi.org>
parents:
3124
diff
changeset
|
497 d.addErrback(self.host.logErrback) |
3162
b5c058c7692e
core (xmpp), plugin android: fixed DNS, SRV handling on Android:
Goffi <goffi@goffi.org>
parents:
3154
diff
changeset
|
498 |
b5c058c7692e
core (xmpp), plugin android: fixed DNS, SRV handling on Android:
Goffi <goffi@goffi.org>
parents:
3154
diff
changeset
|
499 async def updateResolver(self): |
b5c058c7692e
core (xmpp), plugin android: fixed DNS, SRV handling on Android:
Goffi <goffi@goffi.org>
parents:
3154
diff
changeset
|
500 # There is no "/etc/resolv.conf" on Android, which confuse Twisted and makes |
b5c058c7692e
core (xmpp), plugin android: fixed DNS, SRV handling on Android:
Goffi <goffi@goffi.org>
parents:
3154
diff
changeset
|
501 # SRV record checking unusable. We fixe that by checking DNS server used, and |
b5c058c7692e
core (xmpp), plugin android: fixed DNS, SRV handling on Android:
Goffi <goffi@goffi.org>
parents:
3154
diff
changeset
|
502 # updating Twisted's resolver accordingly |
b5c058c7692e
core (xmpp), plugin android: fixed DNS, SRV handling on Android:
Goffi <goffi@goffi.org>
parents:
3154
diff
changeset
|
503 dns_servers = await self.getDNSServers() |
b5c058c7692e
core (xmpp), plugin android: fixed DNS, SRV handling on Android:
Goffi <goffi@goffi.org>
parents:
3154
diff
changeset
|
504 |
b5c058c7692e
core (xmpp), plugin android: fixed DNS, SRV handling on Android:
Goffi <goffi@goffi.org>
parents:
3154
diff
changeset
|
505 log.info( |
b5c058c7692e
core (xmpp), plugin android: fixed DNS, SRV handling on Android:
Goffi <goffi@goffi.org>
parents:
3154
diff
changeset
|
506 "Patching Twisted to use Android DNS resolver ({dns_servers})".format( |
b5c058c7692e
core (xmpp), plugin android: fixed DNS, SRV handling on Android:
Goffi <goffi@goffi.org>
parents:
3154
diff
changeset
|
507 dns_servers=', '.join([s[0] for s in dns_servers])) |
b5c058c7692e
core (xmpp), plugin android: fixed DNS, SRV handling on Android:
Goffi <goffi@goffi.org>
parents:
3154
diff
changeset
|
508 ) |
b5c058c7692e
core (xmpp), plugin android: fixed DNS, SRV handling on Android:
Goffi <goffi@goffi.org>
parents:
3154
diff
changeset
|
509 dns_client.theResolver = dns_client.createResolver(servers=dns_servers) |
b5c058c7692e
core (xmpp), plugin android: fixed DNS, SRV handling on Android:
Goffi <goffi@goffi.org>
parents:
3154
diff
changeset
|
510 |
b5c058c7692e
core (xmpp), plugin android: fixed DNS, SRV handling on Android:
Goffi <goffi@goffi.org>
parents:
3154
diff
changeset
|
511 async def getDNSServers(self): |
b5c058c7692e
core (xmpp), plugin android: fixed DNS, SRV handling on Android:
Goffi <goffi@goffi.org>
parents:
3154
diff
changeset
|
512 servers = [] |
b5c058c7692e
core (xmpp), plugin android: fixed DNS, SRV handling on Android:
Goffi <goffi@goffi.org>
parents:
3154
diff
changeset
|
513 |
b5c058c7692e
core (xmpp), plugin android: fixed DNS, SRV handling on Android:
Goffi <goffi@goffi.org>
parents:
3154
diff
changeset
|
514 if api_version < 26: |
b5c058c7692e
core (xmpp), plugin android: fixed DNS, SRV handling on Android:
Goffi <goffi@goffi.org>
parents:
3154
diff
changeset
|
515 # thanks to A-IV at https://stackoverflow.com/a/11362271 for the way to go |
b5c058c7692e
core (xmpp), plugin android: fixed DNS, SRV handling on Android:
Goffi <goffi@goffi.org>
parents:
3154
diff
changeset
|
516 log.debug("Old API, using SystemProperties to find DNS") |
b5c058c7692e
core (xmpp), plugin android: fixed DNS, SRV handling on Android:
Goffi <goffi@goffi.org>
parents:
3154
diff
changeset
|
517 for idx in range(1, 5): |
b5c058c7692e
core (xmpp), plugin android: fixed DNS, SRV handling on Android:
Goffi <goffi@goffi.org>
parents:
3154
diff
changeset
|
518 addr = SystemProperties.get(f'net.dns{idx}') |
b5c058c7692e
core (xmpp), plugin android: fixed DNS, SRV handling on Android:
Goffi <goffi@goffi.org>
parents:
3154
diff
changeset
|
519 if abstract.isIPAddress(addr): |
b5c058c7692e
core (xmpp), plugin android: fixed DNS, SRV handling on Android:
Goffi <goffi@goffi.org>
parents:
3154
diff
changeset
|
520 servers.append((addr, 53)) |
b5c058c7692e
core (xmpp), plugin android: fixed DNS, SRV handling on Android:
Goffi <goffi@goffi.org>
parents:
3154
diff
changeset
|
521 else: |
b5c058c7692e
core (xmpp), plugin android: fixed DNS, SRV handling on Android:
Goffi <goffi@goffi.org>
parents:
3154
diff
changeset
|
522 log.debug(f"API {api_version} >= 26, using getprop to find DNS") |
b5c058c7692e
core (xmpp), plugin android: fixed DNS, SRV handling on Android:
Goffi <goffi@goffi.org>
parents:
3154
diff
changeset
|
523 # use of getprop inspired by various solutions at |
b5c058c7692e
core (xmpp), plugin android: fixed DNS, SRV handling on Android:
Goffi <goffi@goffi.org>
parents:
3154
diff
changeset
|
524 # https://stackoverflow.com/q/3070144 |
b5c058c7692e
core (xmpp), plugin android: fixed DNS, SRV handling on Android:
Goffi <goffi@goffi.org>
parents:
3154
diff
changeset
|
525 # it's the most simple option, and it fit wells with async_process |
b5c058c7692e
core (xmpp), plugin android: fixed DNS, SRV handling on Android:
Goffi <goffi@goffi.org>
parents:
3154
diff
changeset
|
526 getprop_paths = which('getprop') |
b5c058c7692e
core (xmpp), plugin android: fixed DNS, SRV handling on Android:
Goffi <goffi@goffi.org>
parents:
3154
diff
changeset
|
527 if getprop_paths: |
b5c058c7692e
core (xmpp), plugin android: fixed DNS, SRV handling on Android:
Goffi <goffi@goffi.org>
parents:
3154
diff
changeset
|
528 try: |
b5c058c7692e
core (xmpp), plugin android: fixed DNS, SRV handling on Android:
Goffi <goffi@goffi.org>
parents:
3154
diff
changeset
|
529 getprop_path = getprop_paths[0] |
b5c058c7692e
core (xmpp), plugin android: fixed DNS, SRV handling on Android:
Goffi <goffi@goffi.org>
parents:
3154
diff
changeset
|
530 props = await async_process.run(getprop_path) |
b5c058c7692e
core (xmpp), plugin android: fixed DNS, SRV handling on Android:
Goffi <goffi@goffi.org>
parents:
3154
diff
changeset
|
531 servers = [(ip, 53) for ip in RE_DNS.findall(props.decode()) |
b5c058c7692e
core (xmpp), plugin android: fixed DNS, SRV handling on Android:
Goffi <goffi@goffi.org>
parents:
3154
diff
changeset
|
532 if abstract.isIPAddress(ip)] |
b5c058c7692e
core (xmpp), plugin android: fixed DNS, SRV handling on Android:
Goffi <goffi@goffi.org>
parents:
3154
diff
changeset
|
533 except Exception as e: |
b5c058c7692e
core (xmpp), plugin android: fixed DNS, SRV handling on Android:
Goffi <goffi@goffi.org>
parents:
3154
diff
changeset
|
534 log.warning(f"Can't use \"getprop\" to find DNS server: {e}") |
b5c058c7692e
core (xmpp), plugin android: fixed DNS, SRV handling on Android:
Goffi <goffi@goffi.org>
parents:
3154
diff
changeset
|
535 if not servers: |
b5c058c7692e
core (xmpp), plugin android: fixed DNS, SRV handling on Android:
Goffi <goffi@goffi.org>
parents:
3154
diff
changeset
|
536 # FIXME: Cloudflare's 1.1.1.1 seems to have a better privacy policy, to be |
b5c058c7692e
core (xmpp), plugin android: fixed DNS, SRV handling on Android:
Goffi <goffi@goffi.org>
parents:
3154
diff
changeset
|
537 # checked. |
b5c058c7692e
core (xmpp), plugin android: fixed DNS, SRV handling on Android:
Goffi <goffi@goffi.org>
parents:
3154
diff
changeset
|
538 log.warning( |
b5c058c7692e
core (xmpp), plugin android: fixed DNS, SRV handling on Android:
Goffi <goffi@goffi.org>
parents:
3154
diff
changeset
|
539 "no server found, we have to use factory Google DNS, this is not ideal " |
b5c058c7692e
core (xmpp), plugin android: fixed DNS, SRV handling on Android:
Goffi <goffi@goffi.org>
parents:
3154
diff
changeset
|
540 "for privacy" |
b5c058c7692e
core (xmpp), plugin android: fixed DNS, SRV handling on Android:
Goffi <goffi@goffi.org>
parents:
3154
diff
changeset
|
541 ) |
b5c058c7692e
core (xmpp), plugin android: fixed DNS, SRV handling on Android:
Goffi <goffi@goffi.org>
parents:
3154
diff
changeset
|
542 servers.append(('8.8.8.8', 53), ('8.8.4.4', 53)) |
b5c058c7692e
core (xmpp), plugin android: fixed DNS, SRV handling on Android:
Goffi <goffi@goffi.org>
parents:
3154
diff
changeset
|
543 return servers |