Mercurial > libervia-backend
annotate sat/plugins/plugin_misc_android.py @ 3528:849374e59178
component file sharing: quotas implementation:
quotas can now be specified using the `quotas_json` option of `component file_sharing`
section in settings. This must be a dict where:
- `users` key contains default quotas for all users
- `admins` key contains quotas for administrators (not implemented yet)
- `jids` contain bare JID to quota mapping, to have user-specific quota
The value can be either a int for quota in bytes, or a case insensitive string with an
optional multiplier symbol (e.g. "500 Mio"). `None` can be used for explicit unlimited
quota (which is the default is `users` is not set).
When a file size is too big for quota, upload is refused with an error message indicating
allowed quota, used space, and the size of the file that user wants to upload.
author | Goffi <goffi@goffi.org> |
---|---|
date | Wed, 05 May 2021 15:37:33 +0200 |
parents | 7550ae9cfbac |
children | 3910ad643e9d |
rev | line source |
---|---|
3028 | 1 #!/usr/bin/env python3 |
3137 | 2 |
2100 | 3 # SAT plugin for file tansfer |
3479 | 4 # Copyright (C) 2009-2021 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 |
3245
2a0a16b906ac
plugin android: use `certifi` SSL root certicates
Goffi <goffi@goffi.org>
parents:
3172
diff
changeset
|
24 from zope.interface import implementer |
3162
b5c058c7692e
core (xmpp), plugin android: fixed DNS, SRV handling on Android:
Goffi <goffi@goffi.org>
parents:
3154
diff
changeset
|
25 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
|
26 from twisted.python.procutils import which |
3124
b86060901278
plugin android: added a `profileAutoconnectGet` method:
Goffi <goffi@goffi.org>
parents:
3106
diff
changeset
|
27 from twisted.internet import defer |
2841
90115cf4e731
plugin android: improved state handling:
Goffi <goffi@goffi.org>
parents:
2771
diff
changeset
|
28 from twisted.internet import reactor |
90115cf4e731
plugin android: improved state handling:
Goffi <goffi@goffi.org>
parents:
2771
diff
changeset
|
29 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
|
30 from twisted.internet import abstract |
2841
90115cf4e731
plugin android: improved state handling:
Goffi <goffi@goffi.org>
parents:
2771
diff
changeset
|
31 from twisted.internet import error as int_error |
3245
2a0a16b906ac
plugin android: use `certifi` SSL root certicates
Goffi <goffi@goffi.org>
parents:
3172
diff
changeset
|
32 from twisted.internet import _sslverify |
2a0a16b906ac
plugin android: use `certifi` SSL root certicates
Goffi <goffi@goffi.org>
parents:
3172
diff
changeset
|
33 from sat.core.i18n import _, D_ |
2a0a16b906ac
plugin android: use `certifi` SSL root certicates
Goffi <goffi@goffi.org>
parents:
3172
diff
changeset
|
34 from sat.core.constants import Const as C |
2a0a16b906ac
plugin android: use `certifi` SSL root certicates
Goffi <goffi@goffi.org>
parents:
3172
diff
changeset
|
35 from sat.core.log import getLogger |
2a0a16b906ac
plugin android: use `certifi` SSL root certicates
Goffi <goffi@goffi.org>
parents:
3172
diff
changeset
|
36 from sat.core import exceptions |
2a0a16b906ac
plugin android: use `certifi` SSL root certicates
Goffi <goffi@goffi.org>
parents:
3172
diff
changeset
|
37 from sat.tools.common import async_process |
2a0a16b906ac
plugin android: use `certifi` SSL root certicates
Goffi <goffi@goffi.org>
parents:
3172
diff
changeset
|
38 from sat.memory import params |
2a0a16b906ac
plugin android: use `certifi` SSL root certicates
Goffi <goffi@goffi.org>
parents:
3172
diff
changeset
|
39 |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
40 |
2100 | 41 log = getLogger(__name__) |
42 | |
43 PLUGIN_INFO = { | |
3124
b86060901278
plugin android: added a `profileAutoconnectGet` method:
Goffi <goffi@goffi.org>
parents:
3106
diff
changeset
|
44 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
|
45 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
|
46 C.PI_TYPE: C.PLUG_TYPE_MISC, |
3028 | 47 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
|
48 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
|
49 C.PI_HANDLER: "no", |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
50 C.PI_DESCRIPTION: D_( |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
51 """Manage Android platform specificities, like pause or notifications""" |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
52 ), |
2100 | 53 } |
54 | |
55 if sys.platform != "android": | |
3028 | 56 raise exceptions.CancelError("this module is not needed on this platform") |
2100 | 57 |
2872
6b00f88316bf
plugin android: use XEP-0352 to indicate (in)active state:
Goffi <goffi@goffi.org>
parents:
2868
diff
changeset
|
58 |
3162
b5c058c7692e
core (xmpp), plugin android: fixed DNS, SRV handling on Android:
Goffi <goffi@goffi.org>
parents:
3154
diff
changeset
|
59 import re |
3245
2a0a16b906ac
plugin android: use `certifi` SSL root certicates
Goffi <goffi@goffi.org>
parents:
3172
diff
changeset
|
60 import certifi |
3154
f2d3ab4390a3
plugin android: attach an action dict to notification:
Goffi <goffi@goffi.org>
parents:
3137
diff
changeset
|
61 from plyer import vibrator |
3162
b5c058c7692e
core (xmpp), plugin android: fixed DNS, SRV handling on Android:
Goffi <goffi@goffi.org>
parents:
3154
diff
changeset
|
62 from android import api_version |
2887
9aadf11b315b
plugin android: check connectivity
Goffi <goffi@goffi.org>
parents:
2882
diff
changeset
|
63 from plyer.platforms.android import activity |
3154
f2d3ab4390a3
plugin android: attach an action dict to notification:
Goffi <goffi@goffi.org>
parents:
3137
diff
changeset
|
64 from plyer.platforms.android.notification import AndroidNotification |
2887
9aadf11b315b
plugin android: check connectivity
Goffi <goffi@goffi.org>
parents:
2882
diff
changeset
|
65 from jnius import autoclass |
9aadf11b315b
plugin android: check connectivity
Goffi <goffi@goffi.org>
parents:
2882
diff
changeset
|
66 from android.broadcast import BroadcastReceiver |
3154
f2d3ab4390a3
plugin android: attach an action dict to notification:
Goffi <goffi@goffi.org>
parents:
3137
diff
changeset
|
67 from android import python_act |
f2d3ab4390a3
plugin android: attach an action dict to notification:
Goffi <goffi@goffi.org>
parents:
3137
diff
changeset
|
68 |
f2d3ab4390a3
plugin android: attach an action dict to notification:
Goffi <goffi@goffi.org>
parents:
3137
diff
changeset
|
69 |
f2d3ab4390a3
plugin android: attach an action dict to notification:
Goffi <goffi@goffi.org>
parents:
3137
diff
changeset
|
70 Context = autoclass('android.content.Context') |
f2d3ab4390a3
plugin android: attach an action dict to notification:
Goffi <goffi@goffi.org>
parents:
3137
diff
changeset
|
71 ConnectivityManager = autoclass('android.net.ConnectivityManager') |
f2d3ab4390a3
plugin android: attach an action dict to notification:
Goffi <goffi@goffi.org>
parents:
3137
diff
changeset
|
72 MediaPlayer = autoclass('android.media.MediaPlayer') |
f2d3ab4390a3
plugin android: attach an action dict to notification:
Goffi <goffi@goffi.org>
parents:
3137
diff
changeset
|
73 AudioManager = autoclass('android.media.AudioManager') |
f2d3ab4390a3
plugin android: attach an action dict to notification:
Goffi <goffi@goffi.org>
parents:
3137
diff
changeset
|
74 |
f2d3ab4390a3
plugin android: attach an action dict to notification:
Goffi <goffi@goffi.org>
parents:
3137
diff
changeset
|
75 # notifications |
f2d3ab4390a3
plugin android: attach an action dict to notification:
Goffi <goffi@goffi.org>
parents:
3137
diff
changeset
|
76 AndroidString = autoclass('java.lang.String') |
f2d3ab4390a3
plugin android: attach an action dict to notification:
Goffi <goffi@goffi.org>
parents:
3137
diff
changeset
|
77 PendingIntent = autoclass('android.app.PendingIntent') |
f2d3ab4390a3
plugin android: attach an action dict to notification:
Goffi <goffi@goffi.org>
parents:
3137
diff
changeset
|
78 Intent = autoclass('android.content.Intent') |
2100 | 79 |
3162
b5c058c7692e
core (xmpp), plugin android: fixed DNS, SRV handling on Android:
Goffi <goffi@goffi.org>
parents:
3154
diff
changeset
|
80 # DNS |
b5c058c7692e
core (xmpp), plugin android: fixed DNS, SRV handling on Android:
Goffi <goffi@goffi.org>
parents:
3154
diff
changeset
|
81 # 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
|
82 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
|
83 SystemProperties = autoclass('android.os.SystemProperties') |
b5c058c7692e
core (xmpp), plugin android: fixed DNS, SRV handling on Android:
Goffi <goffi@goffi.org>
parents:
3154
diff
changeset
|
84 |
2872
6b00f88316bf
plugin android: use XEP-0352 to indicate (in)active state:
Goffi <goffi@goffi.org>
parents:
2868
diff
changeset
|
85 #: 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
|
86 #: 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
|
87 #: quickly on an other app. |
6b00f88316bf
plugin android: use XEP-0352 to indicate (in)active state:
Goffi <goffi@goffi.org>
parents:
2868
diff
changeset
|
88 CSI_DELAY = 30 |
6b00f88316bf
plugin android: use XEP-0352 to indicate (in)active state:
Goffi <goffi@goffi.org>
parents:
2868
diff
changeset
|
89 |
3106
7f7cdc6ecfd8
plugin android: sound notification + change settings:
Goffi <goffi@goffi.org>
parents:
3095
diff
changeset
|
90 PARAM_RING_CATEGORY = "Notifications" |
7f7cdc6ecfd8
plugin android: sound notification + change settings:
Goffi <goffi@goffi.org>
parents:
3095
diff
changeset
|
91 PARAM_RING_NAME = "sound" |
7f7cdc6ecfd8
plugin android: sound notification + change settings:
Goffi <goffi@goffi.org>
parents:
3095
diff
changeset
|
92 PARAM_RING_LABEL = D_("sound on notifications") |
7f7cdc6ecfd8
plugin android: sound notification + change settings:
Goffi <goffi@goffi.org>
parents:
3095
diff
changeset
|
93 RING_OPTS = { |
7f7cdc6ecfd8
plugin android: sound notification + change settings:
Goffi <goffi@goffi.org>
parents:
3095
diff
changeset
|
94 "normal": D_("Normal"), |
7f7cdc6ecfd8
plugin android: sound notification + change settings:
Goffi <goffi@goffi.org>
parents:
3095
diff
changeset
|
95 "never": D_("Never"), |
7f7cdc6ecfd8
plugin android: sound notification + change settings:
Goffi <goffi@goffi.org>
parents:
3095
diff
changeset
|
96 } |
2100 | 97 PARAM_VIBRATE_CATEGORY = "Notifications" |
98 PARAM_VIBRATE_NAME = "vibrate" | |
3028 | 99 PARAM_VIBRATE_LABEL = D_("Vibrate on notifications") |
3106
7f7cdc6ecfd8
plugin android: sound notification + change settings:
Goffi <goffi@goffi.org>
parents:
3095
diff
changeset
|
100 VIBRATION_OPTS = { |
7f7cdc6ecfd8
plugin android: sound notification + change settings:
Goffi <goffi@goffi.org>
parents:
3095
diff
changeset
|
101 "always": D_("Always"), |
7f7cdc6ecfd8
plugin android: sound notification + change settings:
Goffi <goffi@goffi.org>
parents:
3095
diff
changeset
|
102 "vibrate": D_("In vibrate mode"), |
7f7cdc6ecfd8
plugin android: sound notification + change settings:
Goffi <goffi@goffi.org>
parents:
3095
diff
changeset
|
103 "never": D_("Never"), |
7f7cdc6ecfd8
plugin android: sound notification + change settings:
Goffi <goffi@goffi.org>
parents:
3095
diff
changeset
|
104 } |
3480
7550ae9cfbac
Renamed the project from "Salut à Toi" to "Libervia":
Goffi <goffi@goffi.org>
parents:
3479
diff
changeset
|
105 SOCKET_DIR = "/data/data/org.libervia.cagou/" |
2841
90115cf4e731
plugin android: improved state handling:
Goffi <goffi@goffi.org>
parents:
2771
diff
changeset
|
106 SOCKET_FILE = ".socket" |
3057
f91d0e6d9b13
plugin android: fixed encoding in states after Python 3 port
Goffi <goffi@goffi.org>
parents:
3028
diff
changeset
|
107 STATE_RUNNING = b"running" |
f91d0e6d9b13
plugin android: fixed encoding in states after Python 3 port
Goffi <goffi@goffi.org>
parents:
3028
diff
changeset
|
108 STATE_PAUSED = b"paused" |
f91d0e6d9b13
plugin android: fixed encoding in states after Python 3 port
Goffi <goffi@goffi.org>
parents:
3028
diff
changeset
|
109 STATE_STOPPED = b"stopped" |
2841
90115cf4e731
plugin android: improved state handling:
Goffi <goffi@goffi.org>
parents:
2771
diff
changeset
|
110 STATES = (STATE_RUNNING, STATE_PAUSED, STATE_STOPPED) |
2887
9aadf11b315b
plugin android: check connectivity
Goffi <goffi@goffi.org>
parents:
2882
diff
changeset
|
111 NET_TYPE_NONE = "no network" |
9aadf11b315b
plugin android: check connectivity
Goffi <goffi@goffi.org>
parents:
2882
diff
changeset
|
112 NET_TYPE_WIFI = "wifi" |
9aadf11b315b
plugin android: check connectivity
Goffi <goffi@goffi.org>
parents:
2882
diff
changeset
|
113 NET_TYPE_MOBILE = "mobile" |
9aadf11b315b
plugin android: check connectivity
Goffi <goffi@goffi.org>
parents:
2882
diff
changeset
|
114 NET_TYPE_OTHER = "other" |
3154
f2d3ab4390a3
plugin android: attach an action dict to notification:
Goffi <goffi@goffi.org>
parents:
3137
diff
changeset
|
115 INTENT_EXTRA_ACTION = AndroidString("org.salut-a-toi.IntentAction") |
2887
9aadf11b315b
plugin android: check connectivity
Goffi <goffi@goffi.org>
parents:
2882
diff
changeset
|
116 |
9aadf11b315b
plugin android: check connectivity
Goffi <goffi@goffi.org>
parents:
2882
diff
changeset
|
117 |
3245
2a0a16b906ac
plugin android: use `certifi` SSL root certicates
Goffi <goffi@goffi.org>
parents:
3172
diff
changeset
|
118 @implementer(_sslverify.IOpenSSLTrustRoot) |
2a0a16b906ac
plugin android: use `certifi` SSL root certicates
Goffi <goffi@goffi.org>
parents:
3172
diff
changeset
|
119 class AndroidTrustPaths: |
2a0a16b906ac
plugin android: use `certifi` SSL root certicates
Goffi <goffi@goffi.org>
parents:
3172
diff
changeset
|
120 |
2a0a16b906ac
plugin android: use `certifi` SSL root certicates
Goffi <goffi@goffi.org>
parents:
3172
diff
changeset
|
121 def _addCACertsToContext(self, context): |
2a0a16b906ac
plugin android: use `certifi` SSL root certicates
Goffi <goffi@goffi.org>
parents:
3172
diff
changeset
|
122 # twisted doesn't have access to Android root certificates |
2a0a16b906ac
plugin android: use `certifi` SSL root certicates
Goffi <goffi@goffi.org>
parents:
3172
diff
changeset
|
123 # we use certifi to work around that (same thing is done in Kivy) |
2a0a16b906ac
plugin android: use `certifi` SSL root certicates
Goffi <goffi@goffi.org>
parents:
3172
diff
changeset
|
124 context.load_verify_locations(certifi.where()) |
2a0a16b906ac
plugin android: use `certifi` SSL root certicates
Goffi <goffi@goffi.org>
parents:
3172
diff
changeset
|
125 |
2a0a16b906ac
plugin android: use `certifi` SSL root certicates
Goffi <goffi@goffi.org>
parents:
3172
diff
changeset
|
126 |
2a0a16b906ac
plugin android: use `certifi` SSL root certicates
Goffi <goffi@goffi.org>
parents:
3172
diff
changeset
|
127 def platformTrust(): |
2a0a16b906ac
plugin android: use `certifi` SSL root certicates
Goffi <goffi@goffi.org>
parents:
3172
diff
changeset
|
128 return AndroidTrustPaths() |
2a0a16b906ac
plugin android: use `certifi` SSL root certicates
Goffi <goffi@goffi.org>
parents:
3172
diff
changeset
|
129 |
2a0a16b906ac
plugin android: use `certifi` SSL root certicates
Goffi <goffi@goffi.org>
parents:
3172
diff
changeset
|
130 |
3154
f2d3ab4390a3
plugin android: attach an action dict to notification:
Goffi <goffi@goffi.org>
parents:
3137
diff
changeset
|
131 class Notification(AndroidNotification): |
f2d3ab4390a3
plugin android: attach an action dict to notification:
Goffi <goffi@goffi.org>
parents:
3137
diff
changeset
|
132 # 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
|
133 # 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
|
134 # slightly modify the behaviour. |
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 @staticmethod |
f2d3ab4390a3
plugin android: attach an action dict to notification:
Goffi <goffi@goffi.org>
parents:
3137
diff
changeset
|
137 def _set_open_behavior(notification, sat_action): |
f2d3ab4390a3
plugin android: attach an action dict to notification:
Goffi <goffi@goffi.org>
parents:
3137
diff
changeset
|
138 # 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
|
139 # 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
|
140 |
f2d3ab4390a3
plugin android: attach an action dict to notification:
Goffi <goffi@goffi.org>
parents:
3137
diff
changeset
|
141 app_context = activity.getApplication().getApplicationContext() |
f2d3ab4390a3
plugin android: attach an action dict to notification:
Goffi <goffi@goffi.org>
parents:
3137
diff
changeset
|
142 notification_intent = Intent(app_context, python_act) |
f2d3ab4390a3
plugin android: attach an action dict to notification:
Goffi <goffi@goffi.org>
parents:
3137
diff
changeset
|
143 |
f2d3ab4390a3
plugin android: attach an action dict to notification:
Goffi <goffi@goffi.org>
parents:
3137
diff
changeset
|
144 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
|
145 notification_intent.setAction(Intent.ACTION_MAIN) |
f2d3ab4390a3
plugin android: attach an action dict to notification:
Goffi <goffi@goffi.org>
parents:
3137
diff
changeset
|
146 notification_intent.addCategory(Intent.CATEGORY_LAUNCHER) |
f2d3ab4390a3
plugin android: attach an action dict to notification:
Goffi <goffi@goffi.org>
parents:
3137
diff
changeset
|
147 if sat_action is not None: |
f2d3ab4390a3
plugin android: attach an action dict to notification:
Goffi <goffi@goffi.org>
parents:
3137
diff
changeset
|
148 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
|
149 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
|
150 notification_intent = notification_intent.putExtra( |
f2d3ab4390a3
plugin android: attach an action dict to notification:
Goffi <goffi@goffi.org>
parents:
3137
diff
changeset
|
151 INTENT_EXTRA_ACTION, action_data) |
f2d3ab4390a3
plugin android: attach an action dict to notification:
Goffi <goffi@goffi.org>
parents:
3137
diff
changeset
|
152 |
f2d3ab4390a3
plugin android: attach an action dict to notification:
Goffi <goffi@goffi.org>
parents:
3137
diff
changeset
|
153 # 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
|
154 # 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
|
155 # 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
|
156 pending_intent = PendingIntent.getActivity( |
f2d3ab4390a3
plugin android: attach an action dict to notification:
Goffi <goffi@goffi.org>
parents:
3137
diff
changeset
|
157 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
|
158 ) |
f2d3ab4390a3
plugin android: attach an action dict to notification:
Goffi <goffi@goffi.org>
parents:
3137
diff
changeset
|
159 |
f2d3ab4390a3
plugin android: attach an action dict to notification:
Goffi <goffi@goffi.org>
parents:
3137
diff
changeset
|
160 notification.setContentIntent(pending_intent) |
f2d3ab4390a3
plugin android: attach an action dict to notification:
Goffi <goffi@goffi.org>
parents:
3137
diff
changeset
|
161 notification.setAutoCancel(True) |
f2d3ab4390a3
plugin android: attach an action dict to notification:
Goffi <goffi@goffi.org>
parents:
3137
diff
changeset
|
162 |
f2d3ab4390a3
plugin android: attach an action dict to notification:
Goffi <goffi@goffi.org>
parents:
3137
diff
changeset
|
163 def _notify(self, **kwargs): |
f2d3ab4390a3
plugin android: attach an action dict to notification:
Goffi <goffi@goffi.org>
parents:
3137
diff
changeset
|
164 # 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
|
165 # 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
|
166 # 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
|
167 # 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
|
168 # in the generic "notify" method). |
f2d3ab4390a3
plugin android: attach an action dict to notification:
Goffi <goffi@goffi.org>
parents:
3137
diff
changeset
|
169 sat_action = kwargs.pop("sat_action", None) |
f2d3ab4390a3
plugin android: attach an action dict to notification:
Goffi <goffi@goffi.org>
parents:
3137
diff
changeset
|
170 noti = None |
f2d3ab4390a3
plugin android: attach an action dict to notification:
Goffi <goffi@goffi.org>
parents:
3137
diff
changeset
|
171 message = kwargs.get('message', '').encode('utf-8') |
f2d3ab4390a3
plugin android: attach an action dict to notification:
Goffi <goffi@goffi.org>
parents:
3137
diff
changeset
|
172 ticker = kwargs.get('ticker', '').encode('utf-8') |
f2d3ab4390a3
plugin android: attach an action dict to notification:
Goffi <goffi@goffi.org>
parents:
3137
diff
changeset
|
173 title = AndroidString( |
f2d3ab4390a3
plugin android: attach an action dict to notification:
Goffi <goffi@goffi.org>
parents:
3137
diff
changeset
|
174 kwargs.get('title', '').encode('utf-8') |
f2d3ab4390a3
plugin android: attach an action dict to notification:
Goffi <goffi@goffi.org>
parents:
3137
diff
changeset
|
175 ) |
f2d3ab4390a3
plugin android: attach an action dict to notification:
Goffi <goffi@goffi.org>
parents:
3137
diff
changeset
|
176 icon = kwargs.get('app_icon', '') |
f2d3ab4390a3
plugin android: attach an action dict to notification:
Goffi <goffi@goffi.org>
parents:
3137
diff
changeset
|
177 |
f2d3ab4390a3
plugin android: attach an action dict to notification:
Goffi <goffi@goffi.org>
parents:
3137
diff
changeset
|
178 if kwargs.get('toast', False): |
f2d3ab4390a3
plugin android: attach an action dict to notification:
Goffi <goffi@goffi.org>
parents:
3137
diff
changeset
|
179 self._toast(message) |
f2d3ab4390a3
plugin android: attach an action dict to notification:
Goffi <goffi@goffi.org>
parents:
3137
diff
changeset
|
180 return |
f2d3ab4390a3
plugin android: attach an action dict to notification:
Goffi <goffi@goffi.org>
parents:
3137
diff
changeset
|
181 else: |
f2d3ab4390a3
plugin android: attach an action dict to notification:
Goffi <goffi@goffi.org>
parents:
3137
diff
changeset
|
182 noti = self._build_notification(title) |
f2d3ab4390a3
plugin android: attach an action dict to notification:
Goffi <goffi@goffi.org>
parents:
3137
diff
changeset
|
183 |
f2d3ab4390a3
plugin android: attach an action dict to notification:
Goffi <goffi@goffi.org>
parents:
3137
diff
changeset
|
184 noti.setContentTitle(title) |
f2d3ab4390a3
plugin android: attach an action dict to notification:
Goffi <goffi@goffi.org>
parents:
3137
diff
changeset
|
185 noti.setContentText(AndroidString(message)) |
f2d3ab4390a3
plugin android: attach an action dict to notification:
Goffi <goffi@goffi.org>
parents:
3137
diff
changeset
|
186 noti.setTicker(AndroidString(ticker)) |
f2d3ab4390a3
plugin android: attach an action dict to notification:
Goffi <goffi@goffi.org>
parents:
3137
diff
changeset
|
187 |
f2d3ab4390a3
plugin android: attach an action dict to notification:
Goffi <goffi@goffi.org>
parents:
3137
diff
changeset
|
188 self._set_icons(noti, icon=icon) |
f2d3ab4390a3
plugin android: attach an action dict to notification:
Goffi <goffi@goffi.org>
parents:
3137
diff
changeset
|
189 self._set_open_behavior(noti, sat_action) |
f2d3ab4390a3
plugin android: attach an action dict to notification:
Goffi <goffi@goffi.org>
parents:
3137
diff
changeset
|
190 |
f2d3ab4390a3
plugin android: attach an action dict to notification:
Goffi <goffi@goffi.org>
parents:
3137
diff
changeset
|
191 self._open_notification(noti) |
2868
5546613f5007
plugin android: workaround to seek() bug, fixing file upload:
Goffi <goffi@goffi.org>
parents:
2856
diff
changeset
|
192 |
5546613f5007
plugin android: workaround to seek() bug, fixing file upload:
Goffi <goffi@goffi.org>
parents:
2856
diff
changeset
|
193 |
2841
90115cf4e731
plugin android: improved state handling:
Goffi <goffi@goffi.org>
parents:
2771
diff
changeset
|
194 class FrontendStateProtocol(protocol.Protocol): |
90115cf4e731
plugin android: improved state handling:
Goffi <goffi@goffi.org>
parents:
2771
diff
changeset
|
195 |
90115cf4e731
plugin android: improved state handling:
Goffi <goffi@goffi.org>
parents:
2771
diff
changeset
|
196 def __init__(self, android_plugin): |
90115cf4e731
plugin android: improved state handling:
Goffi <goffi@goffi.org>
parents:
2771
diff
changeset
|
197 self.android_plugin = android_plugin |
90115cf4e731
plugin android: improved state handling:
Goffi <goffi@goffi.org>
parents:
2771
diff
changeset
|
198 |
90115cf4e731
plugin android: improved state handling:
Goffi <goffi@goffi.org>
parents:
2771
diff
changeset
|
199 def dataReceived(self, data): |
90115cf4e731
plugin android: improved state handling:
Goffi <goffi@goffi.org>
parents:
2771
diff
changeset
|
200 if data in STATES: |
90115cf4e731
plugin android: improved state handling:
Goffi <goffi@goffi.org>
parents:
2771
diff
changeset
|
201 self.android_plugin.state = data |
90115cf4e731
plugin android: improved state handling:
Goffi <goffi@goffi.org>
parents:
2771
diff
changeset
|
202 else: |
3028 | 203 log.warning("Unexpected data: {data}".format(data=data)) |
2841
90115cf4e731
plugin android: improved state handling:
Goffi <goffi@goffi.org>
parents:
2771
diff
changeset
|
204 |
90115cf4e731
plugin android: improved state handling:
Goffi <goffi@goffi.org>
parents:
2771
diff
changeset
|
205 |
90115cf4e731
plugin android: improved state handling:
Goffi <goffi@goffi.org>
parents:
2771
diff
changeset
|
206 class FrontendStateFactory(protocol.Factory): |
90115cf4e731
plugin android: improved state handling:
Goffi <goffi@goffi.org>
parents:
2771
diff
changeset
|
207 |
90115cf4e731
plugin android: improved state handling:
Goffi <goffi@goffi.org>
parents:
2771
diff
changeset
|
208 def __init__(self, android_plugin): |
90115cf4e731
plugin android: improved state handling:
Goffi <goffi@goffi.org>
parents:
2771
diff
changeset
|
209 self.android_plugin = android_plugin |
90115cf4e731
plugin android: improved state handling:
Goffi <goffi@goffi.org>
parents:
2771
diff
changeset
|
210 |
90115cf4e731
plugin android: improved state handling:
Goffi <goffi@goffi.org>
parents:
2771
diff
changeset
|
211 def buildProtocol(self, addr): |
90115cf4e731
plugin android: improved state handling:
Goffi <goffi@goffi.org>
parents:
2771
diff
changeset
|
212 return FrontendStateProtocol(self.android_plugin) |
90115cf4e731
plugin android: improved state handling:
Goffi <goffi@goffi.org>
parents:
2771
diff
changeset
|
213 |
2100 | 214 |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
215 |
2100 | 216 class AndroidPlugin(object): |
217 | |
218 params = """ | |
219 <params> | |
220 <individual> | |
221 <category name="{category_name}" label="{category_label}"> | |
3106
7f7cdc6ecfd8
plugin android: sound notification + change settings:
Goffi <goffi@goffi.org>
parents:
3095
diff
changeset
|
222 <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
|
223 {ring_options} |
7f7cdc6ecfd8
plugin android: sound notification + change settings:
Goffi <goffi@goffi.org>
parents:
3095
diff
changeset
|
224 </param> |
7f7cdc6ecfd8
plugin android: sound notification + change settings:
Goffi <goffi@goffi.org>
parents:
3095
diff
changeset
|
225 <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
|
226 {vibrate_options} |
7f7cdc6ecfd8
plugin android: sound notification + change settings:
Goffi <goffi@goffi.org>
parents:
3095
diff
changeset
|
227 </param> |
2100 | 228 </category> |
229 </individual> | |
230 </params> | |
231 """.format( | |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
232 category_name=PARAM_VIBRATE_CATEGORY, |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
233 category_label=D_(PARAM_VIBRATE_CATEGORY), |
3106
7f7cdc6ecfd8
plugin android: sound notification + change settings:
Goffi <goffi@goffi.org>
parents:
3095
diff
changeset
|
234 vibrate_param_name=PARAM_VIBRATE_NAME, |
7f7cdc6ecfd8
plugin android: sound notification + change settings:
Goffi <goffi@goffi.org>
parents:
3095
diff
changeset
|
235 vibrate_param_label=PARAM_VIBRATE_LABEL, |
7f7cdc6ecfd8
plugin android: sound notification + change settings:
Goffi <goffi@goffi.org>
parents:
3095
diff
changeset
|
236 vibrate_options=params.makeOptions(VIBRATION_OPTS, "always"), |
7f7cdc6ecfd8
plugin android: sound notification + change settings:
Goffi <goffi@goffi.org>
parents:
3095
diff
changeset
|
237 ring_param_name=PARAM_RING_NAME, |
7f7cdc6ecfd8
plugin android: sound notification + change settings:
Goffi <goffi@goffi.org>
parents:
3095
diff
changeset
|
238 ring_param_label=PARAM_RING_LABEL, |
7f7cdc6ecfd8
plugin android: sound notification + change settings:
Goffi <goffi@goffi.org>
parents:
3095
diff
changeset
|
239 ring_options=params.makeOptions(RING_OPTS, "normal"), |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
240 ) |
2100 | 241 |
242 def __init__(self, host): | |
3028 | 243 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
|
244 log.info(f"using Android API {api_version}") |
2100 | 245 self.host = host |
3028 | 246 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
|
247 self._csi_timer = None |
2100 | 248 host.memory.updateParams(self.params) |
2841
90115cf4e731
plugin android: improved state handling:
Goffi <goffi@goffi.org>
parents:
2771
diff
changeset
|
249 try: |
3028 | 250 os.mkdir(SOCKET_DIR, 0o700) |
2841
90115cf4e731
plugin android: improved state handling:
Goffi <goffi@goffi.org>
parents:
2771
diff
changeset
|
251 except OSError as e: |
90115cf4e731
plugin android: improved state handling:
Goffi <goffi@goffi.org>
parents:
2771
diff
changeset
|
252 if e.errno == 17: |
90115cf4e731
plugin android: improved state handling:
Goffi <goffi@goffi.org>
parents:
2771
diff
changeset
|
253 # dir already exists |
90115cf4e731
plugin android: improved state handling:
Goffi <goffi@goffi.org>
parents:
2771
diff
changeset
|
254 pass |
90115cf4e731
plugin android: improved state handling:
Goffi <goffi@goffi.org>
parents:
2771
diff
changeset
|
255 else: |
90115cf4e731
plugin android: improved state handling:
Goffi <goffi@goffi.org>
parents:
2771
diff
changeset
|
256 raise e |
90115cf4e731
plugin android: improved state handling:
Goffi <goffi@goffi.org>
parents:
2771
diff
changeset
|
257 self._state = None |
90115cf4e731
plugin android: improved state handling:
Goffi <goffi@goffi.org>
parents:
2771
diff
changeset
|
258 factory = FrontendStateFactory(self) |
90115cf4e731
plugin android: improved state handling:
Goffi <goffi@goffi.org>
parents:
2771
diff
changeset
|
259 socket_path = os.path.join(SOCKET_DIR, SOCKET_FILE) |
90115cf4e731
plugin android: improved state handling:
Goffi <goffi@goffi.org>
parents:
2771
diff
changeset
|
260 try: |
90115cf4e731
plugin android: improved state handling:
Goffi <goffi@goffi.org>
parents:
2771
diff
changeset
|
261 reactor.listenUNIX(socket_path, factory) |
90115cf4e731
plugin android: improved state handling:
Goffi <goffi@goffi.org>
parents:
2771
diff
changeset
|
262 except int_error.CannotListenError as e: |
90115cf4e731
plugin android: improved state handling:
Goffi <goffi@goffi.org>
parents:
2771
diff
changeset
|
263 if e.socketError.errno == 98: |
90115cf4e731
plugin android: improved state handling:
Goffi <goffi@goffi.org>
parents:
2771
diff
changeset
|
264 # 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
|
265 os.unlink(socket_path) |
90115cf4e731
plugin android: improved state handling:
Goffi <goffi@goffi.org>
parents:
2771
diff
changeset
|
266 reactor.listenUNIX(socket_path, factory) |
90115cf4e731
plugin android: improved state handling:
Goffi <goffi@goffi.org>
parents:
2771
diff
changeset
|
267 else: |
90115cf4e731
plugin android: improved state handling:
Goffi <goffi@goffi.org>
parents:
2771
diff
changeset
|
268 raise e |
90115cf4e731
plugin android: improved state handling:
Goffi <goffi@goffi.org>
parents:
2771
diff
changeset
|
269 # 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
|
270 # plugins have done their job |
3172
dcebc585c29f
core: renamed "MessageReceived" trigger to "messageReceived" for consistency.
Goffi <goffi@goffi.org>
parents:
3162
diff
changeset
|
271 host.trigger.add("messageReceived", self.messageReceivedTrigger, priority=-1000) |
2100 | 272 |
3124
b86060901278
plugin android: added a `profileAutoconnectGet` method:
Goffi <goffi@goffi.org>
parents:
3106
diff
changeset
|
273 # profiles autoconnection |
b86060901278
plugin android: added a `profileAutoconnectGet` method:
Goffi <goffi@goffi.org>
parents:
3106
diff
changeset
|
274 host.bridge.addMethod( |
b86060901278
plugin android: added a `profileAutoconnectGet` method:
Goffi <goffi@goffi.org>
parents:
3106
diff
changeset
|
275 "profileAutoconnectGet", |
b86060901278
plugin android: added a `profileAutoconnectGet` method:
Goffi <goffi@goffi.org>
parents:
3106
diff
changeset
|
276 ".plugin", |
b86060901278
plugin android: added a `profileAutoconnectGet` method:
Goffi <goffi@goffi.org>
parents:
3106
diff
changeset
|
277 in_sign="", |
b86060901278
plugin android: added a `profileAutoconnectGet` method:
Goffi <goffi@goffi.org>
parents:
3106
diff
changeset
|
278 out_sign="s", |
b86060901278
plugin android: added a `profileAutoconnectGet` method:
Goffi <goffi@goffi.org>
parents:
3106
diff
changeset
|
279 method=self._profileAutoconnectGet, |
b86060901278
plugin android: added a `profileAutoconnectGet` method:
Goffi <goffi@goffi.org>
parents:
3106
diff
changeset
|
280 async_=True, |
b86060901278
plugin android: added a `profileAutoconnectGet` method:
Goffi <goffi@goffi.org>
parents:
3106
diff
changeset
|
281 ) |
b86060901278
plugin android: added a `profileAutoconnectGet` method:
Goffi <goffi@goffi.org>
parents:
3106
diff
changeset
|
282 |
3106
7f7cdc6ecfd8
plugin android: sound notification + change settings:
Goffi <goffi@goffi.org>
parents:
3095
diff
changeset
|
283 # audio manager, to get ring status |
7f7cdc6ecfd8
plugin android: sound notification + change settings:
Goffi <goffi@goffi.org>
parents:
3095
diff
changeset
|
284 self.am = activity.getSystemService(Context.AUDIO_SERVICE) |
7f7cdc6ecfd8
plugin android: sound notification + change settings:
Goffi <goffi@goffi.org>
parents:
3095
diff
changeset
|
285 |
7f7cdc6ecfd8
plugin android: sound notification + change settings:
Goffi <goffi@goffi.org>
parents:
3095
diff
changeset
|
286 # sound notification |
7f7cdc6ecfd8
plugin android: sound notification + change settings:
Goffi <goffi@goffi.org>
parents:
3095
diff
changeset
|
287 media_dir = Path(host.memory.getConfig("", "media_dir")) |
7f7cdc6ecfd8
plugin android: sound notification + change settings:
Goffi <goffi@goffi.org>
parents:
3095
diff
changeset
|
288 assert media_dir is not None |
7f7cdc6ecfd8
plugin android: sound notification + change settings:
Goffi <goffi@goffi.org>
parents:
3095
diff
changeset
|
289 notif_path = media_dir / "sounds" / "notifications" / "music-box.mp3" |
7f7cdc6ecfd8
plugin android: sound notification + change settings:
Goffi <goffi@goffi.org>
parents:
3095
diff
changeset
|
290 self.notif_player = MediaPlayer() |
7f7cdc6ecfd8
plugin android: sound notification + change settings:
Goffi <goffi@goffi.org>
parents:
3095
diff
changeset
|
291 self.notif_player.setDataSource(str(notif_path)) |
7f7cdc6ecfd8
plugin android: sound notification + change settings:
Goffi <goffi@goffi.org>
parents:
3095
diff
changeset
|
292 self.notif_player.setAudioStreamType(AudioManager.STREAM_NOTIFICATION) |
7f7cdc6ecfd8
plugin android: sound notification + change settings:
Goffi <goffi@goffi.org>
parents:
3095
diff
changeset
|
293 self.notif_player.prepare() |
7f7cdc6ecfd8
plugin android: sound notification + change settings:
Goffi <goffi@goffi.org>
parents:
3095
diff
changeset
|
294 |
3245
2a0a16b906ac
plugin android: use `certifi` SSL root certicates
Goffi <goffi@goffi.org>
parents:
3172
diff
changeset
|
295 # SSL fix |
2a0a16b906ac
plugin android: use `certifi` SSL root certicates
Goffi <goffi@goffi.org>
parents:
3172
diff
changeset
|
296 _sslverify.platformTrust = platformTrust |
2a0a16b906ac
plugin android: use `certifi` SSL root certicates
Goffi <goffi@goffi.org>
parents:
3172
diff
changeset
|
297 log.info("SSL Android patch applied") |
2a0a16b906ac
plugin android: use `certifi` SSL root certicates
Goffi <goffi@goffi.org>
parents:
3172
diff
changeset
|
298 |
3162
b5c058c7692e
core (xmpp), plugin android: fixed DNS, SRV handling on Android:
Goffi <goffi@goffi.org>
parents:
3154
diff
changeset
|
299 # DNS fix |
b5c058c7692e
core (xmpp), plugin android: fixed DNS, SRV handling on Android:
Goffi <goffi@goffi.org>
parents:
3154
diff
changeset
|
300 defer.ensureDeferred(self.updateResolver()) |
b5c058c7692e
core (xmpp), plugin android: fixed DNS, SRV handling on Android:
Goffi <goffi@goffi.org>
parents:
3154
diff
changeset
|
301 |
2887
9aadf11b315b
plugin android: check connectivity
Goffi <goffi@goffi.org>
parents:
2882
diff
changeset
|
302 # Connectivity handling |
9aadf11b315b
plugin android: check connectivity
Goffi <goffi@goffi.org>
parents:
2882
diff
changeset
|
303 self.cm = activity.getSystemService(Context.CONNECTIVITY_SERVICE) |
9aadf11b315b
plugin android: check connectivity
Goffi <goffi@goffi.org>
parents:
2882
diff
changeset
|
304 self._net_type = None |
3125
c3ce8c997fdf
plugin android: reconnect profiles with autoconnect if network is activated:
Goffi <goffi@goffi.org>
parents:
3124
diff
changeset
|
305 d = defer.ensureDeferred(self._checkConnectivity()) |
c3ce8c997fdf
plugin android: reconnect profiles with autoconnect if network is activated:
Goffi <goffi@goffi.org>
parents:
3124
diff
changeset
|
306 d.addErrback(host.logErrback) |
c3ce8c997fdf
plugin android: reconnect profiles with autoconnect if network is activated:
Goffi <goffi@goffi.org>
parents:
3124
diff
changeset
|
307 |
2887
9aadf11b315b
plugin android: check connectivity
Goffi <goffi@goffi.org>
parents:
2882
diff
changeset
|
308 # XXX: we need to keep a reference to BroadcastReceiver to avoid |
9aadf11b315b
plugin android: check connectivity
Goffi <goffi@goffi.org>
parents:
2882
diff
changeset
|
309 # "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
|
310 # https://github.com/kivy/pyjnius/issues/59) |
9aadf11b315b
plugin android: check connectivity
Goffi <goffi@goffi.org>
parents:
2882
diff
changeset
|
311 self.br = BroadcastReceiver( |
9aadf11b315b
plugin android: check connectivity
Goffi <goffi@goffi.org>
parents:
2882
diff
changeset
|
312 callback=lambda *args, **kwargs: reactor.callLater(0, |
9aadf11b315b
plugin android: check connectivity
Goffi <goffi@goffi.org>
parents:
2882
diff
changeset
|
313 self.onConnectivityChange), |
3028 | 314 actions=["android.net.conn.CONNECTIVITY_CHANGE"]) |
2887
9aadf11b315b
plugin android: check connectivity
Goffi <goffi@goffi.org>
parents:
2882
diff
changeset
|
315 self.br.start() |
9aadf11b315b
plugin android: check connectivity
Goffi <goffi@goffi.org>
parents:
2882
diff
changeset
|
316 |
2100 | 317 @property |
2841
90115cf4e731
plugin android: improved state handling:
Goffi <goffi@goffi.org>
parents:
2771
diff
changeset
|
318 def state(self): |
90115cf4e731
plugin android: improved state handling:
Goffi <goffi@goffi.org>
parents:
2771
diff
changeset
|
319 return self._state |
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 @state.setter |
90115cf4e731
plugin android: improved state handling:
Goffi <goffi@goffi.org>
parents:
2771
diff
changeset
|
322 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
|
323 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
|
324 previous_state = self._state |
90115cf4e731
plugin android: improved state handling:
Goffi <goffi@goffi.org>
parents:
2771
diff
changeset
|
325 self._state = new_state |
90115cf4e731
plugin android: improved state handling:
Goffi <goffi@goffi.org>
parents:
2771
diff
changeset
|
326 if new_state == STATE_RUNNING: |
90115cf4e731
plugin android: improved state handling:
Goffi <goffi@goffi.org>
parents:
2771
diff
changeset
|
327 self._onRunning(previous_state) |
90115cf4e731
plugin android: improved state handling:
Goffi <goffi@goffi.org>
parents:
2771
diff
changeset
|
328 elif new_state == STATE_PAUSED: |
90115cf4e731
plugin android: improved state handling:
Goffi <goffi@goffi.org>
parents:
2771
diff
changeset
|
329 self._onPaused(previous_state) |
90115cf4e731
plugin android: improved state handling:
Goffi <goffi@goffi.org>
parents:
2771
diff
changeset
|
330 elif new_state == STATE_STOPPED: |
90115cf4e731
plugin android: improved state handling:
Goffi <goffi@goffi.org>
parents:
2771
diff
changeset
|
331 self._onStopped(previous_state) |
90115cf4e731
plugin android: improved state handling:
Goffi <goffi@goffi.org>
parents:
2771
diff
changeset
|
332 |
90115cf4e731
plugin android: improved state handling:
Goffi <goffi@goffi.org>
parents:
2771
diff
changeset
|
333 @property |
2100 | 334 def cagou_active(self): |
2841
90115cf4e731
plugin android: improved state handling:
Goffi <goffi@goffi.org>
parents:
2771
diff
changeset
|
335 return self._state == STATE_RUNNING |
90115cf4e731
plugin android: improved state handling:
Goffi <goffi@goffi.org>
parents:
2771
diff
changeset
|
336 |
90115cf4e731
plugin android: improved state handling:
Goffi <goffi@goffi.org>
parents:
2771
diff
changeset
|
337 def _onRunning(self, previous_state): |
90115cf4e731
plugin android: improved state handling:
Goffi <goffi@goffi.org>
parents:
2771
diff
changeset
|
338 if previous_state is not None: |
90115cf4e731
plugin android: improved state handling:
Goffi <goffi@goffi.org>
parents:
2771
diff
changeset
|
339 self.host.bridge.bridgeReactivateSignals() |
2872
6b00f88316bf
plugin android: use XEP-0352 to indicate (in)active state:
Goffi <goffi@goffi.org>
parents:
2868
diff
changeset
|
340 self.setActive() |
2841
90115cf4e731
plugin android: improved state handling:
Goffi <goffi@goffi.org>
parents:
2771
diff
changeset
|
341 |
90115cf4e731
plugin android: improved state handling:
Goffi <goffi@goffi.org>
parents:
2771
diff
changeset
|
342 def _onPaused(self, previous_state): |
90115cf4e731
plugin android: improved state handling:
Goffi <goffi@goffi.org>
parents:
2771
diff
changeset
|
343 self.host.bridge.bridgeDeactivateSignals() |
2872
6b00f88316bf
plugin android: use XEP-0352 to indicate (in)active state:
Goffi <goffi@goffi.org>
parents:
2868
diff
changeset
|
344 self.setInactive() |
2841
90115cf4e731
plugin android: improved state handling:
Goffi <goffi@goffi.org>
parents:
2771
diff
changeset
|
345 |
90115cf4e731
plugin android: improved state handling:
Goffi <goffi@goffi.org>
parents:
2771
diff
changeset
|
346 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
|
347 self.setInactive() |
2100 | 348 |
349 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
|
350 """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
|
351 |
26d6ac4e4a66
plugin android: don't send notification if message comes from ourself (from an other device)
Goffi <goffi@goffi.org>
parents:
2841
diff
changeset
|
352 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
|
353 - 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
|
354 - 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
|
355 """ |
26d6ac4e4a66
plugin android: don't send notification if message comes from ourself (from an other device)
Goffi <goffi@goffi.org>
parents:
2841
diff
changeset
|
356 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
|
357 and not mess_data["from"].userhostJID() == client.jid.userhostJID()): |
3028 | 358 message = next(iter(mess_data["message"].values())) |
2100 | 359 try: |
3028 | 360 subject = next(iter(mess_data["subject"].values())) |
2100 | 361 except StopIteration: |
3154
f2d3ab4390a3
plugin android: attach an action dict to notification:
Goffi <goffi@goffi.org>
parents:
3137
diff
changeset
|
362 subject = D_("new message from {contact}").format( |
f2d3ab4390a3
plugin android: attach an action dict to notification:
Goffi <goffi@goffi.org>
parents:
3137
diff
changeset
|
363 contact = mess_data['from']) |
2100 | 364 |
3154
f2d3ab4390a3
plugin android: attach an action dict to notification:
Goffi <goffi@goffi.org>
parents:
3137
diff
changeset
|
365 notification = Notification() |
f2d3ab4390a3
plugin android: attach an action dict to notification:
Goffi <goffi@goffi.org>
parents:
3137
diff
changeset
|
366 notification._notify( |
f2d3ab4390a3
plugin android: attach an action dict to notification:
Goffi <goffi@goffi.org>
parents:
3137
diff
changeset
|
367 title=subject, |
f2d3ab4390a3
plugin android: attach an action dict to notification:
Goffi <goffi@goffi.org>
parents:
3137
diff
changeset
|
368 message=message, |
f2d3ab4390a3
plugin android: attach an action dict to notification:
Goffi <goffi@goffi.org>
parents:
3137
diff
changeset
|
369 sat_action={ |
f2d3ab4390a3
plugin android: attach an action dict to notification:
Goffi <goffi@goffi.org>
parents:
3137
diff
changeset
|
370 "type": "open", |
f2d3ab4390a3
plugin android: attach an action dict to notification:
Goffi <goffi@goffi.org>
parents:
3137
diff
changeset
|
371 "widget": "chat", |
f2d3ab4390a3
plugin android: attach an action dict to notification:
Goffi <goffi@goffi.org>
parents:
3137
diff
changeset
|
372 "target": mess_data["from"].userhost(), |
f2d3ab4390a3
plugin android: attach an action dict to notification:
Goffi <goffi@goffi.org>
parents:
3137
diff
changeset
|
373 }, |
f2d3ab4390a3
plugin android: attach an action dict to notification:
Goffi <goffi@goffi.org>
parents:
3137
diff
changeset
|
374 ) |
3106
7f7cdc6ecfd8
plugin android: sound notification + change settings:
Goffi <goffi@goffi.org>
parents:
3095
diff
changeset
|
375 |
7f7cdc6ecfd8
plugin android: sound notification + change settings:
Goffi <goffi@goffi.org>
parents:
3095
diff
changeset
|
376 ringer_mode = self.am.getRingerMode() |
7f7cdc6ecfd8
plugin android: sound notification + change settings:
Goffi <goffi@goffi.org>
parents:
3095
diff
changeset
|
377 vibrate_mode = ringer_mode == AudioManager.RINGER_MODE_VIBRATE |
7f7cdc6ecfd8
plugin android: sound notification + change settings:
Goffi <goffi@goffi.org>
parents:
3095
diff
changeset
|
378 |
7f7cdc6ecfd8
plugin android: sound notification + change settings:
Goffi <goffi@goffi.org>
parents:
3095
diff
changeset
|
379 ring_setting = self.host.memory.getParamA( |
7f7cdc6ecfd8
plugin android: sound notification + change settings:
Goffi <goffi@goffi.org>
parents:
3095
diff
changeset
|
380 PARAM_RING_NAME, |
7f7cdc6ecfd8
plugin android: sound notification + change settings:
Goffi <goffi@goffi.org>
parents:
3095
diff
changeset
|
381 PARAM_RING_CATEGORY, |
7f7cdc6ecfd8
plugin android: sound notification + change settings:
Goffi <goffi@goffi.org>
parents:
3095
diff
changeset
|
382 profile_key=client.profile |
7f7cdc6ecfd8
plugin android: sound notification + change settings:
Goffi <goffi@goffi.org>
parents:
3095
diff
changeset
|
383 ) |
7f7cdc6ecfd8
plugin android: sound notification + change settings:
Goffi <goffi@goffi.org>
parents:
3095
diff
changeset
|
384 |
7f7cdc6ecfd8
plugin android: sound notification + change settings:
Goffi <goffi@goffi.org>
parents:
3095
diff
changeset
|
385 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
|
386 self.notif_player.start() |
7f7cdc6ecfd8
plugin android: sound notification + change settings:
Goffi <goffi@goffi.org>
parents:
3095
diff
changeset
|
387 |
7f7cdc6ecfd8
plugin android: sound notification + change settings:
Goffi <goffi@goffi.org>
parents:
3095
diff
changeset
|
388 vibration_setting = self.host.memory.getParamA( |
7f7cdc6ecfd8
plugin android: sound notification + change settings:
Goffi <goffi@goffi.org>
parents:
3095
diff
changeset
|
389 PARAM_VIBRATE_NAME, |
7f7cdc6ecfd8
plugin android: sound notification + change settings:
Goffi <goffi@goffi.org>
parents:
3095
diff
changeset
|
390 PARAM_VIBRATE_CATEGORY, |
7f7cdc6ecfd8
plugin android: sound notification + change settings:
Goffi <goffi@goffi.org>
parents:
3095
diff
changeset
|
391 profile_key=client.profile |
7f7cdc6ecfd8
plugin android: sound notification + change settings:
Goffi <goffi@goffi.org>
parents:
3095
diff
changeset
|
392 ) |
7f7cdc6ecfd8
plugin android: sound notification + change settings:
Goffi <goffi@goffi.org>
parents:
3095
diff
changeset
|
393 if (vibration_setting == 'always' |
7f7cdc6ecfd8
plugin android: sound notification + change settings:
Goffi <goffi@goffi.org>
parents:
3095
diff
changeset
|
394 or vibration_setting == 'vibrate' and vibrate_mode): |
7f7cdc6ecfd8
plugin android: sound notification + change settings:
Goffi <goffi@goffi.org>
parents:
3095
diff
changeset
|
395 try: |
7f7cdc6ecfd8
plugin android: sound notification + change settings:
Goffi <goffi@goffi.org>
parents:
3095
diff
changeset
|
396 vibrator.vibrate() |
7f7cdc6ecfd8
plugin android: sound notification + change settings:
Goffi <goffi@goffi.org>
parents:
3095
diff
changeset
|
397 except Exception as e: |
7f7cdc6ecfd8
plugin android: sound notification + change settings:
Goffi <goffi@goffi.org>
parents:
3095
diff
changeset
|
398 log.warning("Can't use vibrator: {e}".format(e=e)) |
2100 | 399 return mess_data |
400 | |
401 def messageReceivedTrigger(self, client, message_elt, post_treat): | |
402 if not self.cagou_active: | |
403 # we only send notification is the frontend is not displayed | |
404 post_treat.addCallback(self._notifyMessage, client) | |
405 | |
406 return True | |
2872
6b00f88316bf
plugin android: use XEP-0352 to indicate (in)active state:
Goffi <goffi@goffi.org>
parents:
2868
diff
changeset
|
407 |
3124
b86060901278
plugin android: added a `profileAutoconnectGet` method:
Goffi <goffi@goffi.org>
parents:
3106
diff
changeset
|
408 # Profile autoconnection |
b86060901278
plugin android: added a `profileAutoconnectGet` method:
Goffi <goffi@goffi.org>
parents:
3106
diff
changeset
|
409 |
b86060901278
plugin android: added a `profileAutoconnectGet` method:
Goffi <goffi@goffi.org>
parents:
3106
diff
changeset
|
410 def _profileAutoconnectGet(self): |
b86060901278
plugin android: added a `profileAutoconnectGet` method:
Goffi <goffi@goffi.org>
parents:
3106
diff
changeset
|
411 return defer.ensureDeferred(self.profileAutoconnectGet()) |
b86060901278
plugin android: added a `profileAutoconnectGet` method:
Goffi <goffi@goffi.org>
parents:
3106
diff
changeset
|
412 |
3125
c3ce8c997fdf
plugin android: reconnect profiles with autoconnect if network is activated:
Goffi <goffi@goffi.org>
parents:
3124
diff
changeset
|
413 async def _getProfilesAutoconnect(self): |
3124
b86060901278
plugin android: added a `profileAutoconnectGet` method:
Goffi <goffi@goffi.org>
parents:
3106
diff
changeset
|
414 autoconnect_dict = await self.host.memory.storage.getIndParamValues( |
b86060901278
plugin android: added a `profileAutoconnectGet` method:
Goffi <goffi@goffi.org>
parents:
3106
diff
changeset
|
415 category='Connection', name='autoconnect_backend', |
b86060901278
plugin android: added a `profileAutoconnectGet` method:
Goffi <goffi@goffi.org>
parents:
3106
diff
changeset
|
416 ) |
3125
c3ce8c997fdf
plugin android: reconnect profiles with autoconnect if network is activated:
Goffi <goffi@goffi.org>
parents:
3124
diff
changeset
|
417 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
|
418 |
c3ce8c997fdf
plugin android: reconnect profiles with autoconnect if network is activated:
Goffi <goffi@goffi.org>
parents:
3124
diff
changeset
|
419 async def profileAutoconnectGet(self): |
c3ce8c997fdf
plugin android: reconnect profiles with autoconnect if network is activated:
Goffi <goffi@goffi.org>
parents:
3124
diff
changeset
|
420 """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
|
421 profiles_autoconnect = await self._getProfilesAutoconnect() |
3124
b86060901278
plugin android: added a `profileAutoconnectGet` method:
Goffi <goffi@goffi.org>
parents:
3106
diff
changeset
|
422 if not profiles_autoconnect: |
b86060901278
plugin android: added a `profileAutoconnectGet` method:
Goffi <goffi@goffi.org>
parents:
3106
diff
changeset
|
423 return None |
b86060901278
plugin android: added a `profileAutoconnectGet` method:
Goffi <goffi@goffi.org>
parents:
3106
diff
changeset
|
424 if len(profiles_autoconnect) > 1: |
b86060901278
plugin android: added a `profileAutoconnectGet` method:
Goffi <goffi@goffi.org>
parents:
3106
diff
changeset
|
425 log.warning( |
b86060901278
plugin android: added a `profileAutoconnectGet` method:
Goffi <goffi@goffi.org>
parents:
3106
diff
changeset
|
426 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
|
427 f"up first one (full list: {profiles_autoconnect!r})") |
b86060901278
plugin android: added a `profileAutoconnectGet` method:
Goffi <goffi@goffi.org>
parents:
3106
diff
changeset
|
428 return profiles_autoconnect[0] |
b86060901278
plugin android: added a `profileAutoconnectGet` method:
Goffi <goffi@goffi.org>
parents:
3106
diff
changeset
|
429 |
2872
6b00f88316bf
plugin android: use XEP-0352 to indicate (in)active state:
Goffi <goffi@goffi.org>
parents:
2868
diff
changeset
|
430 # CSI |
6b00f88316bf
plugin android: use XEP-0352 to indicate (in)active state:
Goffi <goffi@goffi.org>
parents:
2868
diff
changeset
|
431 |
6b00f88316bf
plugin android: use XEP-0352 to indicate (in)active state:
Goffi <goffi@goffi.org>
parents:
2868
diff
changeset
|
432 def _setInactive(self): |
6b00f88316bf
plugin android: use XEP-0352 to indicate (in)active state:
Goffi <goffi@goffi.org>
parents:
2868
diff
changeset
|
433 self._csi_timer = None |
6b00f88316bf
plugin android: use XEP-0352 to indicate (in)active state:
Goffi <goffi@goffi.org>
parents:
2868
diff
changeset
|
434 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
|
435 self._csi.setInactive(client) |
6b00f88316bf
plugin android: use XEP-0352 to indicate (in)active state:
Goffi <goffi@goffi.org>
parents:
2868
diff
changeset
|
436 |
6b00f88316bf
plugin android: use XEP-0352 to indicate (in)active state:
Goffi <goffi@goffi.org>
parents:
2868
diff
changeset
|
437 def setInactive(self): |
6b00f88316bf
plugin android: use XEP-0352 to indicate (in)active state:
Goffi <goffi@goffi.org>
parents:
2868
diff
changeset
|
438 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
|
439 return |
6b00f88316bf
plugin android: use XEP-0352 to indicate (in)active state:
Goffi <goffi@goffi.org>
parents:
2868
diff
changeset
|
440 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
|
441 |
6b00f88316bf
plugin android: use XEP-0352 to indicate (in)active state:
Goffi <goffi@goffi.org>
parents:
2868
diff
changeset
|
442 def setActive(self): |
6b00f88316bf
plugin android: use XEP-0352 to indicate (in)active state:
Goffi <goffi@goffi.org>
parents:
2868
diff
changeset
|
443 if self._csi is None: |
6b00f88316bf
plugin android: use XEP-0352 to indicate (in)active state:
Goffi <goffi@goffi.org>
parents:
2868
diff
changeset
|
444 return |
6b00f88316bf
plugin android: use XEP-0352 to indicate (in)active state:
Goffi <goffi@goffi.org>
parents:
2868
diff
changeset
|
445 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
|
446 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
|
447 self._csi_timer = None |
2872
6b00f88316bf
plugin android: use XEP-0352 to indicate (in)active state:
Goffi <goffi@goffi.org>
parents:
2868
diff
changeset
|
448 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
|
449 self._csi.setActive(client) |
2887
9aadf11b315b
plugin android: check connectivity
Goffi <goffi@goffi.org>
parents:
2882
diff
changeset
|
450 |
9aadf11b315b
plugin android: check connectivity
Goffi <goffi@goffi.org>
parents:
2882
diff
changeset
|
451 # Connectivity |
9aadf11b315b
plugin android: check connectivity
Goffi <goffi@goffi.org>
parents:
2882
diff
changeset
|
452 |
3125
c3ce8c997fdf
plugin android: reconnect profiles with autoconnect if network is activated:
Goffi <goffi@goffi.org>
parents:
3124
diff
changeset
|
453 async def _handleNetworkChange(self, net_type): |
2887
9aadf11b315b
plugin android: check connectivity
Goffi <goffi@goffi.org>
parents:
2882
diff
changeset
|
454 """Notify the clients about network changes. |
9aadf11b315b
plugin android: check connectivity
Goffi <goffi@goffi.org>
parents:
2882
diff
changeset
|
455 |
9aadf11b315b
plugin android: check connectivity
Goffi <goffi@goffi.org>
parents:
2882
diff
changeset
|
456 This way the client can disconnect/reconnect transport, or change delays |
9aadf11b315b
plugin android: check connectivity
Goffi <goffi@goffi.org>
parents:
2882
diff
changeset
|
457 """ |
3125
c3ce8c997fdf
plugin android: reconnect profiles with autoconnect if network is activated:
Goffi <goffi@goffi.org>
parents:
3124
diff
changeset
|
458 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
|
459 if net_type == NET_TYPE_NONE: |
2887
9aadf11b315b
plugin android: check connectivity
Goffi <goffi@goffi.org>
parents:
2882
diff
changeset
|
460 for client in self.host.getClients(C.PROF_KEY_ALL): |
9aadf11b315b
plugin android: check connectivity
Goffi <goffi@goffi.org>
parents:
2882
diff
changeset
|
461 client.networkDisabled() |
3125
c3ce8c997fdf
plugin android: reconnect profiles with autoconnect if network is activated:
Goffi <goffi@goffi.org>
parents:
3124
diff
changeset
|
462 else: |
3162
b5c058c7692e
core (xmpp), plugin android: fixed DNS, SRV handling on Android:
Goffi <goffi@goffi.org>
parents:
3154
diff
changeset
|
463 # DNS servers may have changed |
b5c058c7692e
core (xmpp), plugin android: fixed DNS, SRV handling on Android:
Goffi <goffi@goffi.org>
parents:
3154
diff
changeset
|
464 await self.updateResolver() |
3125
c3ce8c997fdf
plugin android: reconnect profiles with autoconnect if network is activated:
Goffi <goffi@goffi.org>
parents:
3124
diff
changeset
|
465 # 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
|
466 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
|
467 log.debug(f"enabling network for {client.profile}") |
2887
9aadf11b315b
plugin android: check connectivity
Goffi <goffi@goffi.org>
parents:
2882
diff
changeset
|
468 client.networkEnabled() |
9aadf11b315b
plugin android: check connectivity
Goffi <goffi@goffi.org>
parents:
2882
diff
changeset
|
469 |
3125
c3ce8c997fdf
plugin android: reconnect profiles with autoconnect if network is activated:
Goffi <goffi@goffi.org>
parents:
3124
diff
changeset
|
470 # 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
|
471 # to reconnect them in case |
c3ce8c997fdf
plugin android: reconnect profiles with autoconnect if network is activated:
Goffi <goffi@goffi.org>
parents:
3124
diff
changeset
|
472 profiles_autoconnect = await self._getProfilesAutoconnect() |
c3ce8c997fdf
plugin android: reconnect profiles with autoconnect if network is activated:
Goffi <goffi@goffi.org>
parents:
3124
diff
changeset
|
473 for profile in profiles_autoconnect: |
c3ce8c997fdf
plugin android: reconnect profiles with autoconnect if network is activated:
Goffi <goffi@goffi.org>
parents:
3124
diff
changeset
|
474 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
|
475 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
|
476 try: |
c3ce8c997fdf
plugin android: reconnect profiles with autoconnect if network is activated:
Goffi <goffi@goffi.org>
parents:
3124
diff
changeset
|
477 await self.host.connect(profile) |
c3ce8c997fdf
plugin android: reconnect profiles with autoconnect if network is activated:
Goffi <goffi@goffi.org>
parents:
3124
diff
changeset
|
478 except Exception as e: |
c3ce8c997fdf
plugin android: reconnect profiles with autoconnect if network is activated:
Goffi <goffi@goffi.org>
parents:
3124
diff
changeset
|
479 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
|
480 |
c3ce8c997fdf
plugin android: reconnect profiles with autoconnect if network is activated:
Goffi <goffi@goffi.org>
parents:
3124
diff
changeset
|
481 async def _checkConnectivity(self): |
2887
9aadf11b315b
plugin android: check connectivity
Goffi <goffi@goffi.org>
parents:
2882
diff
changeset
|
482 active_network = self.cm.getActiveNetworkInfo() |
9aadf11b315b
plugin android: check connectivity
Goffi <goffi@goffi.org>
parents:
2882
diff
changeset
|
483 if active_network is None: |
9aadf11b315b
plugin android: check connectivity
Goffi <goffi@goffi.org>
parents:
2882
diff
changeset
|
484 net_type = NET_TYPE_NONE |
9aadf11b315b
plugin android: check connectivity
Goffi <goffi@goffi.org>
parents:
2882
diff
changeset
|
485 else: |
9aadf11b315b
plugin android: check connectivity
Goffi <goffi@goffi.org>
parents:
2882
diff
changeset
|
486 net_type_android = active_network.getType() |
9aadf11b315b
plugin android: check connectivity
Goffi <goffi@goffi.org>
parents:
2882
diff
changeset
|
487 if net_type_android == ConnectivityManager.TYPE_WIFI: |
9aadf11b315b
plugin android: check connectivity
Goffi <goffi@goffi.org>
parents:
2882
diff
changeset
|
488 net_type = NET_TYPE_WIFI |
9aadf11b315b
plugin android: check connectivity
Goffi <goffi@goffi.org>
parents:
2882
diff
changeset
|
489 elif net_type_android == ConnectivityManager.TYPE_MOBILE: |
9aadf11b315b
plugin android: check connectivity
Goffi <goffi@goffi.org>
parents:
2882
diff
changeset
|
490 net_type = NET_TYPE_MOBILE |
9aadf11b315b
plugin android: check connectivity
Goffi <goffi@goffi.org>
parents:
2882
diff
changeset
|
491 else: |
9aadf11b315b
plugin android: check connectivity
Goffi <goffi@goffi.org>
parents:
2882
diff
changeset
|
492 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
|
493 |
2887
9aadf11b315b
plugin android: check connectivity
Goffi <goffi@goffi.org>
parents:
2882
diff
changeset
|
494 if net_type != self._net_type: |
3028 | 495 log.info("connectivity has changed") |
2887
9aadf11b315b
plugin android: check connectivity
Goffi <goffi@goffi.org>
parents:
2882
diff
changeset
|
496 self._net_type = net_type |
9aadf11b315b
plugin android: check connectivity
Goffi <goffi@goffi.org>
parents:
2882
diff
changeset
|
497 if net_type == NET_TYPE_NONE: |
3028 | 498 log.info("no network active") |
2887
9aadf11b315b
plugin android: check connectivity
Goffi <goffi@goffi.org>
parents:
2882
diff
changeset
|
499 elif net_type == NET_TYPE_WIFI: |
3028 | 500 log.info("WIFI activated") |
2887
9aadf11b315b
plugin android: check connectivity
Goffi <goffi@goffi.org>
parents:
2882
diff
changeset
|
501 elif net_type == NET_TYPE_MOBILE: |
3028 | 502 log.info("mobile data activated") |
2887
9aadf11b315b
plugin android: check connectivity
Goffi <goffi@goffi.org>
parents:
2882
diff
changeset
|
503 else: |
3028 | 504 log.info("network activated (type={net_type_android})" |
2887
9aadf11b315b
plugin android: check connectivity
Goffi <goffi@goffi.org>
parents:
2882
diff
changeset
|
505 .format(net_type_android=net_type_android)) |
9aadf11b315b
plugin android: check connectivity
Goffi <goffi@goffi.org>
parents:
2882
diff
changeset
|
506 else: |
3028 | 507 log.debug("_checkConnectivity called without network change ({net_type})" |
2887
9aadf11b315b
plugin android: check connectivity
Goffi <goffi@goffi.org>
parents:
2882
diff
changeset
|
508 .format(net_type = net_type)) |
9aadf11b315b
plugin android: check connectivity
Goffi <goffi@goffi.org>
parents:
2882
diff
changeset
|
509 |
3125
c3ce8c997fdf
plugin android: reconnect profiles with autoconnect if network is activated:
Goffi <goffi@goffi.org>
parents:
3124
diff
changeset
|
510 # 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
|
511 # 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
|
512 await self._handleNetworkChange(net_type) |
c3ce8c997fdf
plugin android: reconnect profiles with autoconnect if network is activated:
Goffi <goffi@goffi.org>
parents:
3124
diff
changeset
|
513 |
2887
9aadf11b315b
plugin android: check connectivity
Goffi <goffi@goffi.org>
parents:
2882
diff
changeset
|
514 |
9aadf11b315b
plugin android: check connectivity
Goffi <goffi@goffi.org>
parents:
2882
diff
changeset
|
515 def onConnectivityChange(self): |
3028 | 516 log.debug("onConnectivityChange called") |
3125
c3ce8c997fdf
plugin android: reconnect profiles with autoconnect if network is activated:
Goffi <goffi@goffi.org>
parents:
3124
diff
changeset
|
517 d = defer.ensureDeferred(self._checkConnectivity()) |
c3ce8c997fdf
plugin android: reconnect profiles with autoconnect if network is activated:
Goffi <goffi@goffi.org>
parents:
3124
diff
changeset
|
518 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
|
519 |
b5c058c7692e
core (xmpp), plugin android: fixed DNS, SRV handling on Android:
Goffi <goffi@goffi.org>
parents:
3154
diff
changeset
|
520 async def updateResolver(self): |
b5c058c7692e
core (xmpp), plugin android: fixed DNS, SRV handling on Android:
Goffi <goffi@goffi.org>
parents:
3154
diff
changeset
|
521 # 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
|
522 # 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
|
523 # updating Twisted's resolver accordingly |
b5c058c7692e
core (xmpp), plugin android: fixed DNS, SRV handling on Android:
Goffi <goffi@goffi.org>
parents:
3154
diff
changeset
|
524 dns_servers = await self.getDNSServers() |
b5c058c7692e
core (xmpp), plugin android: fixed DNS, SRV handling on Android:
Goffi <goffi@goffi.org>
parents:
3154
diff
changeset
|
525 |
b5c058c7692e
core (xmpp), plugin android: fixed DNS, SRV handling on Android:
Goffi <goffi@goffi.org>
parents:
3154
diff
changeset
|
526 log.info( |
b5c058c7692e
core (xmpp), plugin android: fixed DNS, SRV handling on Android:
Goffi <goffi@goffi.org>
parents:
3154
diff
changeset
|
527 "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
|
528 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
|
529 ) |
b5c058c7692e
core (xmpp), plugin android: fixed DNS, SRV handling on Android:
Goffi <goffi@goffi.org>
parents:
3154
diff
changeset
|
530 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
|
531 |
b5c058c7692e
core (xmpp), plugin android: fixed DNS, SRV handling on Android:
Goffi <goffi@goffi.org>
parents:
3154
diff
changeset
|
532 async def getDNSServers(self): |
b5c058c7692e
core (xmpp), plugin android: fixed DNS, SRV handling on Android:
Goffi <goffi@goffi.org>
parents:
3154
diff
changeset
|
533 servers = [] |
b5c058c7692e
core (xmpp), plugin android: fixed DNS, SRV handling on Android:
Goffi <goffi@goffi.org>
parents:
3154
diff
changeset
|
534 |
b5c058c7692e
core (xmpp), plugin android: fixed DNS, SRV handling on Android:
Goffi <goffi@goffi.org>
parents:
3154
diff
changeset
|
535 if api_version < 26: |
b5c058c7692e
core (xmpp), plugin android: fixed DNS, SRV handling on Android:
Goffi <goffi@goffi.org>
parents:
3154
diff
changeset
|
536 # 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
|
537 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
|
538 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
|
539 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
|
540 if abstract.isIPAddress(addr): |
b5c058c7692e
core (xmpp), plugin android: fixed DNS, SRV handling on Android:
Goffi <goffi@goffi.org>
parents:
3154
diff
changeset
|
541 servers.append((addr, 53)) |
b5c058c7692e
core (xmpp), plugin android: fixed DNS, SRV handling on Android:
Goffi <goffi@goffi.org>
parents:
3154
diff
changeset
|
542 else: |
b5c058c7692e
core (xmpp), plugin android: fixed DNS, SRV handling on Android:
Goffi <goffi@goffi.org>
parents:
3154
diff
changeset
|
543 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
|
544 # 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
|
545 # https://stackoverflow.com/q/3070144 |
b5c058c7692e
core (xmpp), plugin android: fixed DNS, SRV handling on Android:
Goffi <goffi@goffi.org>
parents:
3154
diff
changeset
|
546 # 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
|
547 getprop_paths = which('getprop') |
b5c058c7692e
core (xmpp), plugin android: fixed DNS, SRV handling on Android:
Goffi <goffi@goffi.org>
parents:
3154
diff
changeset
|
548 if getprop_paths: |
b5c058c7692e
core (xmpp), plugin android: fixed DNS, SRV handling on Android:
Goffi <goffi@goffi.org>
parents:
3154
diff
changeset
|
549 try: |
b5c058c7692e
core (xmpp), plugin android: fixed DNS, SRV handling on Android:
Goffi <goffi@goffi.org>
parents:
3154
diff
changeset
|
550 getprop_path = getprop_paths[0] |
b5c058c7692e
core (xmpp), plugin android: fixed DNS, SRV handling on Android:
Goffi <goffi@goffi.org>
parents:
3154
diff
changeset
|
551 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
|
552 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
|
553 if abstract.isIPAddress(ip)] |
b5c058c7692e
core (xmpp), plugin android: fixed DNS, SRV handling on Android:
Goffi <goffi@goffi.org>
parents:
3154
diff
changeset
|
554 except Exception as e: |
b5c058c7692e
core (xmpp), plugin android: fixed DNS, SRV handling on Android:
Goffi <goffi@goffi.org>
parents:
3154
diff
changeset
|
555 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
|
556 if not servers: |
b5c058c7692e
core (xmpp), plugin android: fixed DNS, SRV handling on Android:
Goffi <goffi@goffi.org>
parents:
3154
diff
changeset
|
557 # 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
|
558 # checked. |
b5c058c7692e
core (xmpp), plugin android: fixed DNS, SRV handling on Android:
Goffi <goffi@goffi.org>
parents:
3154
diff
changeset
|
559 log.warning( |
b5c058c7692e
core (xmpp), plugin android: fixed DNS, SRV handling on Android:
Goffi <goffi@goffi.org>
parents:
3154
diff
changeset
|
560 "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
|
561 "for privacy" |
b5c058c7692e
core (xmpp), plugin android: fixed DNS, SRV handling on Android:
Goffi <goffi@goffi.org>
parents:
3154
diff
changeset
|
562 ) |
b5c058c7692e
core (xmpp), plugin android: fixed DNS, SRV handling on Android:
Goffi <goffi@goffi.org>
parents:
3154
diff
changeset
|
563 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
|
564 return servers |