Mercurial > libervia-desktop-kivy
annotate cagou/core/platform_/android.py @ 380:9d3481663964
android: handle new SàT specific "action" dict which may be attach to an intent:
this data is used with notifications to tell the frontend which widget/target to open.
author | Goffi <goffi@goffi.org> |
---|---|
date | Tue, 04 Feb 2020 20:47:17 +0100 |
parents | 4d660b252487 |
children | eb3f622d8791 |
rev | line source |
---|---|
322
e2b51663d8b8
core, android: new share widget + added Cagou to "share" menu:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
1 #!/usr/bin/env python3 |
e2b51663d8b8
core, android: new share widget + added Cagou to "share" menu:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
2 |
e2b51663d8b8
core, android: new share widget + added Cagou to "share" menu:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
3 # Cagou: desktop/mobile frontend for Salut à Toi XMPP client |
378 | 4 # Copyright (C) 2016-2020 Jérôme Poisson (goffi@goffi.org) |
322
e2b51663d8b8
core, android: new share widget + added Cagou to "share" menu:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
5 |
e2b51663d8b8
core, android: new share widget + added Cagou to "share" menu:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
6 # This program is free software: you can redistribute it and/or modify |
e2b51663d8b8
core, android: new share widget + added Cagou to "share" menu:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
7 # it under the terms of the GNU Affero General Public License as published by |
e2b51663d8b8
core, android: new share widget + added Cagou to "share" menu:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
8 # the Free Software Foundation, either version 3 of the License, or |
e2b51663d8b8
core, android: new share widget + added Cagou to "share" menu:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
9 # (at your option) any later version. |
e2b51663d8b8
core, android: new share widget + added Cagou to "share" menu:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
10 |
e2b51663d8b8
core, android: new share widget + added Cagou to "share" menu:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
11 # This program is distributed in the hope that it will be useful, |
e2b51663d8b8
core, android: new share widget + added Cagou to "share" menu:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
12 # but WITHOUT ANY WARRANTY; without even the implied warranty of |
e2b51663d8b8
core, android: new share widget + added Cagou to "share" menu:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
13 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
e2b51663d8b8
core, android: new share widget + added Cagou to "share" menu:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
14 # GNU Affero General Public License for more details. |
e2b51663d8b8
core, android: new share widget + added Cagou to "share" menu:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
15 |
e2b51663d8b8
core, android: new share widget + added Cagou to "share" menu:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
16 # You should have received a copy of the GNU Affero General Public License |
e2b51663d8b8
core, android: new share widget + added Cagou to "share" menu:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
17 # along with this program. If not, see <http://www.gnu.org/licenses/>. |
e2b51663d8b8
core, android: new share widget + added Cagou to "share" menu:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
18 |
e2b51663d8b8
core, android: new share widget + added Cagou to "share" menu:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
19 import sys |
342
89799148f894
core: use classes and factory to handle platform specific behaviours in a generic way
Goffi <goffi@goffi.org>
parents:
322
diff
changeset
|
20 import os |
89799148f894
core: use classes and factory to handle platform specific behaviours in a generic way
Goffi <goffi@goffi.org>
parents:
322
diff
changeset
|
21 import socket |
380
9d3481663964
android: handle new SàT specific "action" dict which may be attach to an intent:
Goffi <goffi@goffi.org>
parents:
378
diff
changeset
|
22 import json |
377
b2a87239af25
android: platform specific menu to disconnect profile:
Goffi <goffi@goffi.org>
parents:
373
diff
changeset
|
23 from functools import partial |
380
9d3481663964
android: handle new SàT specific "action" dict which may be attach to an intent:
Goffi <goffi@goffi.org>
parents:
378
diff
changeset
|
24 from urllib.parse import urlparse |
322
e2b51663d8b8
core, android: new share widget + added Cagou to "share" menu:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
25 from jnius import autoclass, cast |
e2b51663d8b8
core, android: new share widget + added Cagou to "share" menu:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
26 from android import activity |
377
b2a87239af25
android: platform specific menu to disconnect profile:
Goffi <goffi@goffi.org>
parents:
373
diff
changeset
|
27 from sat.core.i18n import _ |
322
e2b51663d8b8
core, android: new share widget + added Cagou to "share" menu:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
28 from sat.core import log as logging |
380
9d3481663964
android: handle new SàT specific "action" dict which may be attach to an intent:
Goffi <goffi@goffi.org>
parents:
378
diff
changeset
|
29 from sat_frontends.tools import jid |
322
e2b51663d8b8
core, android: new share widget + added Cagou to "share" menu:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
30 from cagou.core.constants import Const as C |
377
b2a87239af25
android: platform specific menu to disconnect profile:
Goffi <goffi@goffi.org>
parents:
373
diff
changeset
|
31 from cagou.core import dialog |
322
e2b51663d8b8
core, android: new share widget + added Cagou to "share" menu:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
32 from cagou import G |
e2b51663d8b8
core, android: new share widget + added Cagou to "share" menu:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
33 from kivy.clock import Clock |
342
89799148f894
core: use classes and factory to handle platform specific behaviours in a generic way
Goffi <goffi@goffi.org>
parents:
322
diff
changeset
|
34 from .base import Platform as BasePlatform |
322
e2b51663d8b8
core, android: new share widget + added Cagou to "share" menu:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
35 |
e2b51663d8b8
core, android: new share widget + added Cagou to "share" menu:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
36 |
e2b51663d8b8
core, android: new share widget + added Cagou to "share" menu:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
37 log = logging.getLogger(__name__) |
e2b51663d8b8
core, android: new share widget + added Cagou to "share" menu:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
38 |
e2b51663d8b8
core, android: new share widget + added Cagou to "share" menu:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
39 service = autoclass('org.salutatoi.cagou.ServiceBackend') |
357
4d3a0c4f2430
core: better back key (ESC) management:
Goffi <goffi@goffi.org>
parents:
345
diff
changeset
|
40 PythonActivity = autoclass('org.kivy.android.PythonActivity') |
4d3a0c4f2430
core: better back key (ESC) management:
Goffi <goffi@goffi.org>
parents:
345
diff
changeset
|
41 mActivity = PythonActivity.mActivity |
345
a3cefa7158dc
android: open "geo:" URL using an Intent
Goffi <goffi@goffi.org>
parents:
342
diff
changeset
|
42 Intent = autoclass('android.content.Intent') |
a3cefa7158dc
android: open "geo:" URL using an Intent
Goffi <goffi@goffi.org>
parents:
342
diff
changeset
|
43 AndroidString = autoclass('java.lang.String') |
a3cefa7158dc
android: open "geo:" URL using an Intent
Goffi <goffi@goffi.org>
parents:
342
diff
changeset
|
44 Uri = autoclass('android.net.Uri') |
322
e2b51663d8b8
core, android: new share widget + added Cagou to "share" menu:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
45 ImagesMedia = autoclass('android.provider.MediaStore$Images$Media') |
e2b51663d8b8
core, android: new share widget + added Cagou to "share" menu:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
46 AudioMedia = autoclass('android.provider.MediaStore$Audio$Media') |
e2b51663d8b8
core, android: new share widget + added Cagou to "share" menu:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
47 VideoMedia = autoclass('android.provider.MediaStore$Video$Media') |
345
a3cefa7158dc
android: open "geo:" URL using an Intent
Goffi <goffi@goffi.org>
parents:
342
diff
changeset
|
48 |
322
e2b51663d8b8
core, android: new share widget + added Cagou to "share" menu:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
49 DATA = '_data' |
e2b51663d8b8
core, android: new share widget + added Cagou to "share" menu:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
50 |
e2b51663d8b8
core, android: new share widget + added Cagou to "share" menu:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
51 |
e2b51663d8b8
core, android: new share widget + added Cagou to "share" menu:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
52 STATE_RUNNING = b"running" |
e2b51663d8b8
core, android: new share widget + added Cagou to "share" menu:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
53 STATE_PAUSED = b"paused" |
e2b51663d8b8
core, android: new share widget + added Cagou to "share" menu:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
54 STATE_STOPPED = b"stopped" |
e2b51663d8b8
core, android: new share widget + added Cagou to "share" menu:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
55 SOCKET_DIR = "/data/data/org.salutatoi.cagou/" |
e2b51663d8b8
core, android: new share widget + added Cagou to "share" menu:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
56 SOCKET_FILE = ".socket" |
380
9d3481663964
android: handle new SàT specific "action" dict which may be attach to an intent:
Goffi <goffi@goffi.org>
parents:
378
diff
changeset
|
57 INTENT_EXTRA_ACTION = AndroidString("org.salut-a-toi.IntentAction") |
322
e2b51663d8b8
core, android: new share widget + added Cagou to "share" menu:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
58 |
342
89799148f894
core: use classes and factory to handle platform specific behaviours in a generic way
Goffi <goffi@goffi.org>
parents:
322
diff
changeset
|
59 |
89799148f894
core: use classes and factory to handle platform specific behaviours in a generic way
Goffi <goffi@goffi.org>
parents:
322
diff
changeset
|
60 class Platform(BasePlatform): |
89799148f894
core: use classes and factory to handle platform specific behaviours in a generic way
Goffi <goffi@goffi.org>
parents:
322
diff
changeset
|
61 |
89799148f894
core: use classes and factory to handle platform specific behaviours in a generic way
Goffi <goffi@goffi.org>
parents:
322
diff
changeset
|
62 def __init__(self): |
89799148f894
core: use classes and factory to handle platform specific behaviours in a generic way
Goffi <goffi@goffi.org>
parents:
322
diff
changeset
|
63 super().__init__() |
89799148f894
core: use classes and factory to handle platform specific behaviours in a generic way
Goffi <goffi@goffi.org>
parents:
322
diff
changeset
|
64 # cache for callbacks to run when profile is plugged |
89799148f894
core: use classes and factory to handle platform specific behaviours in a generic way
Goffi <goffi@goffi.org>
parents:
322
diff
changeset
|
65 self.cache = [] |
89799148f894
core: use classes and factory to handle platform specific behaviours in a generic way
Goffi <goffi@goffi.org>
parents:
322
diff
changeset
|
66 |
89799148f894
core: use classes and factory to handle platform specific behaviours in a generic way
Goffi <goffi@goffi.org>
parents:
322
diff
changeset
|
67 def init_platform(self): |
89799148f894
core: use classes and factory to handle platform specific behaviours in a generic way
Goffi <goffi@goffi.org>
parents:
322
diff
changeset
|
68 # sys.platform is "linux" on android by default |
89799148f894
core: use classes and factory to handle platform specific behaviours in a generic way
Goffi <goffi@goffi.org>
parents:
322
diff
changeset
|
69 # so we change it to allow backend to detect android |
89799148f894
core: use classes and factory to handle platform specific behaviours in a generic way
Goffi <goffi@goffi.org>
parents:
322
diff
changeset
|
70 sys.platform = "android" |
89799148f894
core: use classes and factory to handle platform specific behaviours in a generic way
Goffi <goffi@goffi.org>
parents:
322
diff
changeset
|
71 C.PLUGIN_EXT = 'pyc' |
89799148f894
core: use classes and factory to handle platform specific behaviours in a generic way
Goffi <goffi@goffi.org>
parents:
322
diff
changeset
|
72 |
89799148f894
core: use classes and factory to handle platform specific behaviours in a generic way
Goffi <goffi@goffi.org>
parents:
322
diff
changeset
|
73 def on_host_init(self, host): |
89799148f894
core: use classes and factory to handle platform specific behaviours in a generic way
Goffi <goffi@goffi.org>
parents:
322
diff
changeset
|
74 argument = '' |
89799148f894
core: use classes and factory to handle platform specific behaviours in a generic way
Goffi <goffi@goffi.org>
parents:
322
diff
changeset
|
75 service.start(mActivity, argument) |
322
e2b51663d8b8
core, android: new share widget + added Cagou to "share" menu:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
76 |
342
89799148f894
core: use classes and factory to handle platform specific behaviours in a generic way
Goffi <goffi@goffi.org>
parents:
322
diff
changeset
|
77 activity.bind(on_new_intent=self.on_new_intent) |
89799148f894
core: use classes and factory to handle platform specific behaviours in a generic way
Goffi <goffi@goffi.org>
parents:
322
diff
changeset
|
78 self.cache.append((self.on_new_intent, mActivity.getIntent())) |
89799148f894
core: use classes and factory to handle platform specific behaviours in a generic way
Goffi <goffi@goffi.org>
parents:
322
diff
changeset
|
79 host.addListener('profilePlugged', self.onProfilePlugged) |
89799148f894
core: use classes and factory to handle platform specific behaviours in a generic way
Goffi <goffi@goffi.org>
parents:
322
diff
changeset
|
80 |
89799148f894
core: use classes and factory to handle platform specific behaviours in a generic way
Goffi <goffi@goffi.org>
parents:
322
diff
changeset
|
81 def on_initFrontendState(self): |
89799148f894
core: use classes and factory to handle platform specific behaviours in a generic way
Goffi <goffi@goffi.org>
parents:
322
diff
changeset
|
82 # XXX: we use a separated socket instead of bridge because if we |
89799148f894
core: use classes and factory to handle platform specific behaviours in a generic way
Goffi <goffi@goffi.org>
parents:
322
diff
changeset
|
83 # try to call a bridge method in on_pause method, the call data |
89799148f894
core: use classes and factory to handle platform specific behaviours in a generic way
Goffi <goffi@goffi.org>
parents:
322
diff
changeset
|
84 # is not written before the actual pause |
370
1a12bbd80943
android: autoconnect profile using the new `profileAutoconnectGet` backend method:
Goffi <goffi@goffi.org>
parents:
357
diff
changeset
|
85 s = self._frontend_status_socket = socket.socket( |
1a12bbd80943
android: autoconnect profile using the new `profileAutoconnectGet` backend method:
Goffi <goffi@goffi.org>
parents:
357
diff
changeset
|
86 socket.AF_UNIX, socket.SOCK_STREAM) |
342
89799148f894
core: use classes and factory to handle platform specific behaviours in a generic way
Goffi <goffi@goffi.org>
parents:
322
diff
changeset
|
87 s.connect(os.path.join(SOCKET_DIR, SOCKET_FILE)) |
89799148f894
core: use classes and factory to handle platform specific behaviours in a generic way
Goffi <goffi@goffi.org>
parents:
322
diff
changeset
|
88 s.sendall(STATE_RUNNING) |
89799148f894
core: use classes and factory to handle platform specific behaviours in a generic way
Goffi <goffi@goffi.org>
parents:
322
diff
changeset
|
89 |
370
1a12bbd80943
android: autoconnect profile using the new `profileAutoconnectGet` backend method:
Goffi <goffi@goffi.org>
parents:
357
diff
changeset
|
90 def profileAutoconnectGetCb(self, profile=None): |
1a12bbd80943
android: autoconnect profile using the new `profileAutoconnectGet` backend method:
Goffi <goffi@goffi.org>
parents:
357
diff
changeset
|
91 if profile is not None: |
1a12bbd80943
android: autoconnect profile using the new `profileAutoconnectGet` backend method:
Goffi <goffi@goffi.org>
parents:
357
diff
changeset
|
92 G.host.options.profile = profile |
1a12bbd80943
android: autoconnect profile using the new `profileAutoconnectGet` backend method:
Goffi <goffi@goffi.org>
parents:
357
diff
changeset
|
93 G.host.postInit() |
1a12bbd80943
android: autoconnect profile using the new `profileAutoconnectGet` backend method:
Goffi <goffi@goffi.org>
parents:
357
diff
changeset
|
94 |
1a12bbd80943
android: autoconnect profile using the new `profileAutoconnectGet` backend method:
Goffi <goffi@goffi.org>
parents:
357
diff
changeset
|
95 def profileAutoconnectGetEb(self, failure_): |
1a12bbd80943
android: autoconnect profile using the new `profileAutoconnectGet` backend method:
Goffi <goffi@goffi.org>
parents:
357
diff
changeset
|
96 log.error(f"Error while getting profile to autoconnect: {failure_}") |
1a12bbd80943
android: autoconnect profile using the new `profileAutoconnectGet` backend method:
Goffi <goffi@goffi.org>
parents:
357
diff
changeset
|
97 G.host.postInit() |
1a12bbd80943
android: autoconnect profile using the new `profileAutoconnectGet` backend method:
Goffi <goffi@goffi.org>
parents:
357
diff
changeset
|
98 |
1a12bbd80943
android: autoconnect profile using the new `profileAutoconnectGet` backend method:
Goffi <goffi@goffi.org>
parents:
357
diff
changeset
|
99 def do_postInit(self): |
1a12bbd80943
android: autoconnect profile using the new `profileAutoconnectGet` backend method:
Goffi <goffi@goffi.org>
parents:
357
diff
changeset
|
100 G.host.bridge.profileAutoconnectGet( |
1a12bbd80943
android: autoconnect profile using the new `profileAutoconnectGet` backend method:
Goffi <goffi@goffi.org>
parents:
357
diff
changeset
|
101 callback=self.profileAutoconnectGetCb, |
1a12bbd80943
android: autoconnect profile using the new `profileAutoconnectGet` backend method:
Goffi <goffi@goffi.org>
parents:
357
diff
changeset
|
102 errback=self.profileAutoconnectGetEb |
1a12bbd80943
android: autoconnect profile using the new `profileAutoconnectGet` backend method:
Goffi <goffi@goffi.org>
parents:
357
diff
changeset
|
103 ) |
1a12bbd80943
android: autoconnect profile using the new `profileAutoconnectGet` backend method:
Goffi <goffi@goffi.org>
parents:
357
diff
changeset
|
104 return False |
1a12bbd80943
android: autoconnect profile using the new `profileAutoconnectGet` backend method:
Goffi <goffi@goffi.org>
parents:
357
diff
changeset
|
105 |
342
89799148f894
core: use classes and factory to handle platform specific behaviours in a generic way
Goffi <goffi@goffi.org>
parents:
322
diff
changeset
|
106 def onProfilePlugged(self, profile): |
89799148f894
core: use classes and factory to handle platform specific behaviours in a generic way
Goffi <goffi@goffi.org>
parents:
322
diff
changeset
|
107 log.debug("ANDROID profilePlugged") |
370
1a12bbd80943
android: autoconnect profile using the new `profileAutoconnectGet` backend method:
Goffi <goffi@goffi.org>
parents:
357
diff
changeset
|
108 G.host.bridge.setParam( |
1a12bbd80943
android: autoconnect profile using the new `profileAutoconnectGet` backend method:
Goffi <goffi@goffi.org>
parents:
357
diff
changeset
|
109 "autoconnect_backend", C.BOOL_TRUE, "Connection", -1, profile, |
377
b2a87239af25
android: platform specific menu to disconnect profile:
Goffi <goffi@goffi.org>
parents:
373
diff
changeset
|
110 callback=lambda: log.info(f"profile {profile} autoconnection set"), |
b2a87239af25
android: platform specific menu to disconnect profile:
Goffi <goffi@goffi.org>
parents:
373
diff
changeset
|
111 errback=lambda: log.error(f"can't set {profile} autoconnection")) |
342
89799148f894
core: use classes and factory to handle platform specific behaviours in a generic way
Goffi <goffi@goffi.org>
parents:
322
diff
changeset
|
112 for method, *args in self.cache: |
89799148f894
core: use classes and factory to handle platform specific behaviours in a generic way
Goffi <goffi@goffi.org>
parents:
322
diff
changeset
|
113 method(*args) |
89799148f894
core: use classes and factory to handle platform specific behaviours in a generic way
Goffi <goffi@goffi.org>
parents:
322
diff
changeset
|
114 del self.cache |
89799148f894
core: use classes and factory to handle platform specific behaviours in a generic way
Goffi <goffi@goffi.org>
parents:
322
diff
changeset
|
115 G.host.removeListener("profilePlugged", self.onProfilePlugged) |
89799148f894
core: use classes and factory to handle platform specific behaviours in a generic way
Goffi <goffi@goffi.org>
parents:
322
diff
changeset
|
116 |
89799148f894
core: use classes and factory to handle platform specific behaviours in a generic way
Goffi <goffi@goffi.org>
parents:
322
diff
changeset
|
117 def on_pause(self): |
89799148f894
core: use classes and factory to handle platform specific behaviours in a generic way
Goffi <goffi@goffi.org>
parents:
322
diff
changeset
|
118 G.host.sync = False |
89799148f894
core: use classes and factory to handle platform specific behaviours in a generic way
Goffi <goffi@goffi.org>
parents:
322
diff
changeset
|
119 self._frontend_status_socket.sendall(STATE_PAUSED) |
89799148f894
core: use classes and factory to handle platform specific behaviours in a generic way
Goffi <goffi@goffi.org>
parents:
322
diff
changeset
|
120 return True |
322
e2b51663d8b8
core, android: new share widget + added Cagou to "share" menu:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
121 |
342
89799148f894
core: use classes and factory to handle platform specific behaviours in a generic way
Goffi <goffi@goffi.org>
parents:
322
diff
changeset
|
122 def on_resume(self): |
89799148f894
core: use classes and factory to handle platform specific behaviours in a generic way
Goffi <goffi@goffi.org>
parents:
322
diff
changeset
|
123 self._frontend_status_socket.sendall(STATE_RUNNING) |
89799148f894
core: use classes and factory to handle platform specific behaviours in a generic way
Goffi <goffi@goffi.org>
parents:
322
diff
changeset
|
124 G.host.sync = True |
89799148f894
core: use classes and factory to handle platform specific behaviours in a generic way
Goffi <goffi@goffi.org>
parents:
322
diff
changeset
|
125 |
89799148f894
core: use classes and factory to handle platform specific behaviours in a generic way
Goffi <goffi@goffi.org>
parents:
322
diff
changeset
|
126 def on_stop(self): |
89799148f894
core: use classes and factory to handle platform specific behaviours in a generic way
Goffi <goffi@goffi.org>
parents:
322
diff
changeset
|
127 self._frontend_status_socket.sendall(STATE_STOPPED) |
89799148f894
core: use classes and factory to handle platform specific behaviours in a generic way
Goffi <goffi@goffi.org>
parents:
322
diff
changeset
|
128 self._frontend_status_socket.close() |
89799148f894
core: use classes and factory to handle platform specific behaviours in a generic way
Goffi <goffi@goffi.org>
parents:
322
diff
changeset
|
129 |
357
4d3a0c4f2430
core: better back key (ESC) management:
Goffi <goffi@goffi.org>
parents:
345
diff
changeset
|
130 def on_key_back_root(self): |
4d3a0c4f2430
core: better back key (ESC) management:
Goffi <goffi@goffi.org>
parents:
345
diff
changeset
|
131 PythonActivity.moveTaskToBack(True) |
4d3a0c4f2430
core: better back key (ESC) management:
Goffi <goffi@goffi.org>
parents:
345
diff
changeset
|
132 return True |
4d3a0c4f2430
core: better back key (ESC) management:
Goffi <goffi@goffi.org>
parents:
345
diff
changeset
|
133 |
4d3a0c4f2430
core: better back key (ESC) management:
Goffi <goffi@goffi.org>
parents:
345
diff
changeset
|
134 def on_key_back_share(self, share_widget): |
4d3a0c4f2430
core: better back key (ESC) management:
Goffi <goffi@goffi.org>
parents:
345
diff
changeset
|
135 share_widget.close() |
4d3a0c4f2430
core: better back key (ESC) management:
Goffi <goffi@goffi.org>
parents:
345
diff
changeset
|
136 PythonActivity.moveTaskToBack(True) |
4d3a0c4f2430
core: better back key (ESC) management:
Goffi <goffi@goffi.org>
parents:
345
diff
changeset
|
137 return True |
4d3a0c4f2430
core: better back key (ESC) management:
Goffi <goffi@goffi.org>
parents:
345
diff
changeset
|
138 |
377
b2a87239af25
android: platform specific menu to disconnect profile:
Goffi <goffi@goffi.org>
parents:
373
diff
changeset
|
139 def _disconnect(self, profile): |
b2a87239af25
android: platform specific menu to disconnect profile:
Goffi <goffi@goffi.org>
parents:
373
diff
changeset
|
140 G.host.bridge.setParam( |
b2a87239af25
android: platform specific menu to disconnect profile:
Goffi <goffi@goffi.org>
parents:
373
diff
changeset
|
141 "autoconnect_backend", C.BOOL_FALSE, "Connection", -1, profile, |
b2a87239af25
android: platform specific menu to disconnect profile:
Goffi <goffi@goffi.org>
parents:
373
diff
changeset
|
142 callback=lambda: log.info(f"profile {profile} autoconnection unset"), |
b2a87239af25
android: platform specific menu to disconnect profile:
Goffi <goffi@goffi.org>
parents:
373
diff
changeset
|
143 errback=lambda: log.error(f"can't unset {profile} autoconnection")) |
b2a87239af25
android: platform specific menu to disconnect profile:
Goffi <goffi@goffi.org>
parents:
373
diff
changeset
|
144 G.host.profiles.unplug(profile) |
b2a87239af25
android: platform specific menu to disconnect profile:
Goffi <goffi@goffi.org>
parents:
373
diff
changeset
|
145 G.host.bridge.disconnect(profile) |
b2a87239af25
android: platform specific menu to disconnect profile:
Goffi <goffi@goffi.org>
parents:
373
diff
changeset
|
146 G.host.app.showProfileManager() |
b2a87239af25
android: platform specific menu to disconnect profile:
Goffi <goffi@goffi.org>
parents:
373
diff
changeset
|
147 G.host.closeUI() |
b2a87239af25
android: platform specific menu to disconnect profile:
Goffi <goffi@goffi.org>
parents:
373
diff
changeset
|
148 |
b2a87239af25
android: platform specific menu to disconnect profile:
Goffi <goffi@goffi.org>
parents:
373
diff
changeset
|
149 def _on_disconnect(self): |
b2a87239af25
android: platform specific menu to disconnect profile:
Goffi <goffi@goffi.org>
parents:
373
diff
changeset
|
150 current_profile = next(iter(G.host.profiles)) |
b2a87239af25
android: platform specific menu to disconnect profile:
Goffi <goffi@goffi.org>
parents:
373
diff
changeset
|
151 wid = dialog.ConfirmDialog( |
b2a87239af25
android: platform specific menu to disconnect profile:
Goffi <goffi@goffi.org>
parents:
373
diff
changeset
|
152 title=_("Are you sure to disconnect?"), |
b2a87239af25
android: platform specific menu to disconnect profile:
Goffi <goffi@goffi.org>
parents:
373
diff
changeset
|
153 message=_( |
b2a87239af25
android: platform specific menu to disconnect profile:
Goffi <goffi@goffi.org>
parents:
373
diff
changeset
|
154 "If you disconnect the current user ({profile}), you won't receive " |
b2a87239af25
android: platform specific menu to disconnect profile:
Goffi <goffi@goffi.org>
parents:
373
diff
changeset
|
155 "any notification until you connect it again, is this really what you " |
b2a87239af25
android: platform specific menu to disconnect profile:
Goffi <goffi@goffi.org>
parents:
373
diff
changeset
|
156 "want?").format(profile=current_profile), |
b2a87239af25
android: platform specific menu to disconnect profile:
Goffi <goffi@goffi.org>
parents:
373
diff
changeset
|
157 yes_cb=partial(self._disconnect, profile=current_profile), |
b2a87239af25
android: platform specific menu to disconnect profile:
Goffi <goffi@goffi.org>
parents:
373
diff
changeset
|
158 no_cb=G.host.closeUI, |
b2a87239af25
android: platform specific menu to disconnect profile:
Goffi <goffi@goffi.org>
parents:
373
diff
changeset
|
159 ) |
b2a87239af25
android: platform specific menu to disconnect profile:
Goffi <goffi@goffi.org>
parents:
373
diff
changeset
|
160 G.host.showExtraUI(wid) |
b2a87239af25
android: platform specific menu to disconnect profile:
Goffi <goffi@goffi.org>
parents:
373
diff
changeset
|
161 |
b2a87239af25
android: platform specific menu to disconnect profile:
Goffi <goffi@goffi.org>
parents:
373
diff
changeset
|
162 def on_extra_menu_init(self, extra_menu): |
b2a87239af25
android: platform specific menu to disconnect profile:
Goffi <goffi@goffi.org>
parents:
373
diff
changeset
|
163 extra_menu.addItem(_('disconnect'), self._on_disconnect) |
b2a87239af25
android: platform specific menu to disconnect profile:
Goffi <goffi@goffi.org>
parents:
373
diff
changeset
|
164 |
372
1481f09c9175
settings (android): don't expose autoconnect parameters:
Goffi <goffi@goffi.org>
parents:
370
diff
changeset
|
165 def updateParamsExtra(self, extra): |
1481f09c9175
settings (android): don't expose autoconnect parameters:
Goffi <goffi@goffi.org>
parents:
370
diff
changeset
|
166 # on Android, we handle autoconnection automatically, |
1481f09c9175
settings (android): don't expose autoconnect parameters:
Goffi <goffi@goffi.org>
parents:
370
diff
changeset
|
167 # user must not modify those parameters |
1481f09c9175
settings (android): don't expose autoconnect parameters:
Goffi <goffi@goffi.org>
parents:
370
diff
changeset
|
168 extra.update( |
1481f09c9175
settings (android): don't expose autoconnect parameters:
Goffi <goffi@goffi.org>
parents:
370
diff
changeset
|
169 { |
1481f09c9175
settings (android): don't expose autoconnect parameters:
Goffi <goffi@goffi.org>
parents:
370
diff
changeset
|
170 "ignore": [ |
1481f09c9175
settings (android): don't expose autoconnect parameters:
Goffi <goffi@goffi.org>
parents:
370
diff
changeset
|
171 ["Connection", "autoconnect_backend"], |
1481f09c9175
settings (android): don't expose autoconnect parameters:
Goffi <goffi@goffi.org>
parents:
370
diff
changeset
|
172 ["Connection", "autoconnect"], |
1481f09c9175
settings (android): don't expose autoconnect parameters:
Goffi <goffi@goffi.org>
parents:
370
diff
changeset
|
173 ["Connection", "autodisconnect"], |
1481f09c9175
settings (android): don't expose autoconnect parameters:
Goffi <goffi@goffi.org>
parents:
370
diff
changeset
|
174 ], |
1481f09c9175
settings (android): don't expose autoconnect parameters:
Goffi <goffi@goffi.org>
parents:
370
diff
changeset
|
175 } |
1481f09c9175
settings (android): don't expose autoconnect parameters:
Goffi <goffi@goffi.org>
parents:
370
diff
changeset
|
176 ) |
1481f09c9175
settings (android): don't expose autoconnect parameters:
Goffi <goffi@goffi.org>
parents:
370
diff
changeset
|
177 |
342
89799148f894
core: use classes and factory to handle platform specific behaviours in a generic way
Goffi <goffi@goffi.org>
parents:
322
diff
changeset
|
178 def getPathFromUri(self, uri): |
89799148f894
core: use classes and factory to handle platform specific behaviours in a generic way
Goffi <goffi@goffi.org>
parents:
322
diff
changeset
|
179 cursor = mActivity.getContentResolver().query(uri, None, None, None, None) |
89799148f894
core: use classes and factory to handle platform specific behaviours in a generic way
Goffi <goffi@goffi.org>
parents:
322
diff
changeset
|
180 if cursor is None: |
89799148f894
core: use classes and factory to handle platform specific behaviours in a generic way
Goffi <goffi@goffi.org>
parents:
322
diff
changeset
|
181 return uri.getPath() |
322
e2b51663d8b8
core, android: new share widget + added Cagou to "share" menu:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
182 else: |
342
89799148f894
core: use classes and factory to handle platform specific behaviours in a generic way
Goffi <goffi@goffi.org>
parents:
322
diff
changeset
|
183 cursor.moveToFirst() |
89799148f894
core: use classes and factory to handle platform specific behaviours in a generic way
Goffi <goffi@goffi.org>
parents:
322
diff
changeset
|
184 # FIXME: using DATA is not recommended (and DATA is deprecated) |
89799148f894
core: use classes and factory to handle platform specific behaviours in a generic way
Goffi <goffi@goffi.org>
parents:
322
diff
changeset
|
185 # we should read directly the file with |
89799148f894
core: use classes and factory to handle platform specific behaviours in a generic way
Goffi <goffi@goffi.org>
parents:
322
diff
changeset
|
186 # ContentResolver#openFileDescriptor(Uri, String) |
89799148f894
core: use classes and factory to handle platform specific behaviours in a generic way
Goffi <goffi@goffi.org>
parents:
322
diff
changeset
|
187 col_idx = cursor.getColumnIndex(DATA); |
89799148f894
core: use classes and factory to handle platform specific behaviours in a generic way
Goffi <goffi@goffi.org>
parents:
322
diff
changeset
|
188 if col_idx == -1: |
89799148f894
core: use classes and factory to handle platform specific behaviours in a generic way
Goffi <goffi@goffi.org>
parents:
322
diff
changeset
|
189 return uri.getPath() |
89799148f894
core: use classes and factory to handle platform specific behaviours in a generic way
Goffi <goffi@goffi.org>
parents:
322
diff
changeset
|
190 return cursor.getString(col_idx) |
89799148f894
core: use classes and factory to handle platform specific behaviours in a generic way
Goffi <goffi@goffi.org>
parents:
322
diff
changeset
|
191 |
89799148f894
core: use classes and factory to handle platform specific behaviours in a generic way
Goffi <goffi@goffi.org>
parents:
322
diff
changeset
|
192 def on_new_intent(self, intent): |
89799148f894
core: use classes and factory to handle platform specific behaviours in a generic way
Goffi <goffi@goffi.org>
parents:
322
diff
changeset
|
193 log.debug("on_new_intent") |
89799148f894
core: use classes and factory to handle platform specific behaviours in a generic way
Goffi <goffi@goffi.org>
parents:
322
diff
changeset
|
194 action = intent.getAction(); |
89799148f894
core: use classes and factory to handle platform specific behaviours in a generic way
Goffi <goffi@goffi.org>
parents:
322
diff
changeset
|
195 intent_type = intent.getType(); |
380
9d3481663964
android: handle new SàT specific "action" dict which may be attach to an intent:
Goffi <goffi@goffi.org>
parents:
378
diff
changeset
|
196 if action == Intent.ACTION_MAIN: |
9d3481663964
android: handle new SàT specific "action" dict which may be attach to an intent:
Goffi <goffi@goffi.org>
parents:
378
diff
changeset
|
197 action_str = intent.getStringExtra(INTENT_EXTRA_ACTION) |
9d3481663964
android: handle new SàT specific "action" dict which may be attach to an intent:
Goffi <goffi@goffi.org>
parents:
378
diff
changeset
|
198 if action_str is not None: |
9d3481663964
android: handle new SàT specific "action" dict which may be attach to an intent:
Goffi <goffi@goffi.org>
parents:
378
diff
changeset
|
199 action = json.loads(action_str) |
9d3481663964
android: handle new SàT specific "action" dict which may be attach to an intent:
Goffi <goffi@goffi.org>
parents:
378
diff
changeset
|
200 log.debug(f"Extra action found: {action}") |
9d3481663964
android: handle new SàT specific "action" dict which may be attach to an intent:
Goffi <goffi@goffi.org>
parents:
378
diff
changeset
|
201 action_type = action.get('type') |
9d3481663964
android: handle new SàT specific "action" dict which may be attach to an intent:
Goffi <goffi@goffi.org>
parents:
378
diff
changeset
|
202 if action_type == "open": |
9d3481663964
android: handle new SàT specific "action" dict which may be attach to an intent:
Goffi <goffi@goffi.org>
parents:
378
diff
changeset
|
203 try: |
9d3481663964
android: handle new SàT specific "action" dict which may be attach to an intent:
Goffi <goffi@goffi.org>
parents:
378
diff
changeset
|
204 widget = action['widget'] |
9d3481663964
android: handle new SàT specific "action" dict which may be attach to an intent:
Goffi <goffi@goffi.org>
parents:
378
diff
changeset
|
205 target = action['target'] |
9d3481663964
android: handle new SàT specific "action" dict which may be attach to an intent:
Goffi <goffi@goffi.org>
parents:
378
diff
changeset
|
206 except KeyError as e: |
9d3481663964
android: handle new SàT specific "action" dict which may be attach to an intent:
Goffi <goffi@goffi.org>
parents:
378
diff
changeset
|
207 log.warning(f"incomplete action {action}: {e}") |
9d3481663964
android: handle new SàT specific "action" dict which may be attach to an intent:
Goffi <goffi@goffi.org>
parents:
378
diff
changeset
|
208 else: |
9d3481663964
android: handle new SàT specific "action" dict which may be attach to an intent:
Goffi <goffi@goffi.org>
parents:
378
diff
changeset
|
209 current_profile = next(iter(G.host.profiles)) |
9d3481663964
android: handle new SàT specific "action" dict which may be attach to an intent:
Goffi <goffi@goffi.org>
parents:
378
diff
changeset
|
210 Clock.schedule_once( |
9d3481663964
android: handle new SàT specific "action" dict which may be attach to an intent:
Goffi <goffi@goffi.org>
parents:
378
diff
changeset
|
211 lambda *args: G.host.doAction( |
9d3481663964
android: handle new SàT specific "action" dict which may be attach to an intent:
Goffi <goffi@goffi.org>
parents:
378
diff
changeset
|
212 widget, jid.JID(target), [current_profile]), |
9d3481663964
android: handle new SàT specific "action" dict which may be attach to an intent:
Goffi <goffi@goffi.org>
parents:
378
diff
changeset
|
213 0) |
9d3481663964
android: handle new SàT specific "action" dict which may be attach to an intent:
Goffi <goffi@goffi.org>
parents:
378
diff
changeset
|
214 else: |
9d3481663964
android: handle new SàT specific "action" dict which may be attach to an intent:
Goffi <goffi@goffi.org>
parents:
378
diff
changeset
|
215 log.warning(f"unexpected action: {action}") |
9d3481663964
android: handle new SàT specific "action" dict which may be attach to an intent:
Goffi <goffi@goffi.org>
parents:
378
diff
changeset
|
216 |
9d3481663964
android: handle new SàT specific "action" dict which may be attach to an intent:
Goffi <goffi@goffi.org>
parents:
378
diff
changeset
|
217 text = None |
9d3481663964
android: handle new SàT specific "action" dict which may be attach to an intent:
Goffi <goffi@goffi.org>
parents:
378
diff
changeset
|
218 uri = None |
9d3481663964
android: handle new SàT specific "action" dict which may be attach to an intent:
Goffi <goffi@goffi.org>
parents:
378
diff
changeset
|
219 path = None |
9d3481663964
android: handle new SàT specific "action" dict which may be attach to an intent:
Goffi <goffi@goffi.org>
parents:
378
diff
changeset
|
220 elif action == Intent.ACTION_SEND: |
342
89799148f894
core: use classes and factory to handle platform specific behaviours in a generic way
Goffi <goffi@goffi.org>
parents:
322
diff
changeset
|
221 # we have receiving data to share, we parse the intent data |
89799148f894
core: use classes and factory to handle platform specific behaviours in a generic way
Goffi <goffi@goffi.org>
parents:
322
diff
changeset
|
222 # and show the share widget |
89799148f894
core: use classes and factory to handle platform specific behaviours in a generic way
Goffi <goffi@goffi.org>
parents:
322
diff
changeset
|
223 data = {} |
89799148f894
core: use classes and factory to handle platform specific behaviours in a generic way
Goffi <goffi@goffi.org>
parents:
322
diff
changeset
|
224 text = intent.getStringExtra(Intent.EXTRA_TEXT) |
89799148f894
core: use classes and factory to handle platform specific behaviours in a generic way
Goffi <goffi@goffi.org>
parents:
322
diff
changeset
|
225 if text is not None: |
89799148f894
core: use classes and factory to handle platform specific behaviours in a generic way
Goffi <goffi@goffi.org>
parents:
322
diff
changeset
|
226 data['text'] = text |
89799148f894
core: use classes and factory to handle platform specific behaviours in a generic way
Goffi <goffi@goffi.org>
parents:
322
diff
changeset
|
227 item = intent.getParcelableExtra(Intent.EXTRA_STREAM) |
89799148f894
core: use classes and factory to handle platform specific behaviours in a generic way
Goffi <goffi@goffi.org>
parents:
322
diff
changeset
|
228 if item is not None: |
89799148f894
core: use classes and factory to handle platform specific behaviours in a generic way
Goffi <goffi@goffi.org>
parents:
322
diff
changeset
|
229 uri = cast('android.net.Uri', item) |
89799148f894
core: use classes and factory to handle platform specific behaviours in a generic way
Goffi <goffi@goffi.org>
parents:
322
diff
changeset
|
230 data['uri'] = uri.toString() |
89799148f894
core: use classes and factory to handle platform specific behaviours in a generic way
Goffi <goffi@goffi.org>
parents:
322
diff
changeset
|
231 path = self.getPathFromUri(uri) |
89799148f894
core: use classes and factory to handle platform specific behaviours in a generic way
Goffi <goffi@goffi.org>
parents:
322
diff
changeset
|
232 if path is not None: |
89799148f894
core: use classes and factory to handle platform specific behaviours in a generic way
Goffi <goffi@goffi.org>
parents:
322
diff
changeset
|
233 data['path'] = path |
89799148f894
core: use classes and factory to handle platform specific behaviours in a generic way
Goffi <goffi@goffi.org>
parents:
322
diff
changeset
|
234 else: |
89799148f894
core: use classes and factory to handle platform specific behaviours in a generic way
Goffi <goffi@goffi.org>
parents:
322
diff
changeset
|
235 uri = None |
89799148f894
core: use classes and factory to handle platform specific behaviours in a generic way
Goffi <goffi@goffi.org>
parents:
322
diff
changeset
|
236 path = None |
89799148f894
core: use classes and factory to handle platform specific behaviours in a generic way
Goffi <goffi@goffi.org>
parents:
322
diff
changeset
|
237 |
89799148f894
core: use classes and factory to handle platform specific behaviours in a generic way
Goffi <goffi@goffi.org>
parents:
322
diff
changeset
|
238 Clock.schedule_once(lambda *args: G.host.share(intent_type, data), 0) |
89799148f894
core: use classes and factory to handle platform specific behaviours in a generic way
Goffi <goffi@goffi.org>
parents:
322
diff
changeset
|
239 else: |
89799148f894
core: use classes and factory to handle platform specific behaviours in a generic way
Goffi <goffi@goffi.org>
parents:
322
diff
changeset
|
240 text = None |
322
e2b51663d8b8
core, android: new share widget + added Cagou to "share" menu:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
241 uri = None |
e2b51663d8b8
core, android: new share widget + added Cagou to "share" menu:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
242 path = None |
e2b51663d8b8
core, android: new share widget + added Cagou to "share" menu:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
243 |
342
89799148f894
core: use classes and factory to handle platform specific behaviours in a generic way
Goffi <goffi@goffi.org>
parents:
322
diff
changeset
|
244 msg = (f"NEW INTENT RECEIVED\n" |
89799148f894
core: use classes and factory to handle platform specific behaviours in a generic way
Goffi <goffi@goffi.org>
parents:
322
diff
changeset
|
245 f"type: {intent_type}\n" |
89799148f894
core: use classes and factory to handle platform specific behaviours in a generic way
Goffi <goffi@goffi.org>
parents:
322
diff
changeset
|
246 f"action: {action}\n" |
89799148f894
core: use classes and factory to handle platform specific behaviours in a generic way
Goffi <goffi@goffi.org>
parents:
322
diff
changeset
|
247 f"text: {text}\n" |
89799148f894
core: use classes and factory to handle platform specific behaviours in a generic way
Goffi <goffi@goffi.org>
parents:
322
diff
changeset
|
248 f"uri: {uri}\n" |
89799148f894
core: use classes and factory to handle platform specific behaviours in a generic way
Goffi <goffi@goffi.org>
parents:
322
diff
changeset
|
249 f"path: {path}") |
322
e2b51663d8b8
core, android: new share widget + added Cagou to "share" menu:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
250 |
342
89799148f894
core: use classes and factory to handle platform specific behaviours in a generic way
Goffi <goffi@goffi.org>
parents:
322
diff
changeset
|
251 log.debug(msg) |
345
a3cefa7158dc
android: open "geo:" URL using an Intent
Goffi <goffi@goffi.org>
parents:
342
diff
changeset
|
252 |
a3cefa7158dc
android: open "geo:" URL using an Intent
Goffi <goffi@goffi.org>
parents:
342
diff
changeset
|
253 def open_url(self, url, wid=None): |
a3cefa7158dc
android: open "geo:" URL using an Intent
Goffi <goffi@goffi.org>
parents:
342
diff
changeset
|
254 parsed_url = urlparse(url) |
a3cefa7158dc
android: open "geo:" URL using an Intent
Goffi <goffi@goffi.org>
parents:
342
diff
changeset
|
255 if parsed_url.scheme == "geo": |
a3cefa7158dc
android: open "geo:" URL using an Intent
Goffi <goffi@goffi.org>
parents:
342
diff
changeset
|
256 intent = Intent(Intent.ACTION_VIEW) |
a3cefa7158dc
android: open "geo:" URL using an Intent
Goffi <goffi@goffi.org>
parents:
342
diff
changeset
|
257 intent.setData(Uri.parse(url)) |
a3cefa7158dc
android: open "geo:" URL using an Intent
Goffi <goffi@goffi.org>
parents:
342
diff
changeset
|
258 if mActivity.getPackageManager() is not None: |
a3cefa7158dc
android: open "geo:" URL using an Intent
Goffi <goffi@goffi.org>
parents:
342
diff
changeset
|
259 activity = cast('android.app.Activity', mActivity) |
a3cefa7158dc
android: open "geo:" URL using an Intent
Goffi <goffi@goffi.org>
parents:
342
diff
changeset
|
260 activity.startActivity(intent) |
a3cefa7158dc
android: open "geo:" URL using an Intent
Goffi <goffi@goffi.org>
parents:
342
diff
changeset
|
261 else: |
a3cefa7158dc
android: open "geo:" URL using an Intent
Goffi <goffi@goffi.org>
parents:
342
diff
changeset
|
262 super().open_url(self, url, wid) |