Mercurial > libervia-desktop
annotate cagou/core/platform_/android.py @ 412:7c6149c249c1
chat: attachment sending:
- files to send are not sent directly anymore, but added to attachment, and linked to the
message when it is sent, this is more user friendly and avoid the accidental sending of
wrong file
- user can remove the attachment before sending the message, using the "close" symbol
- new "Chat.addAtachment" method
- upload progress is shown on the AttachmentItem thanks to the "progress" property
- AttachmentItem stays in the attachments layout until uploaded or an error happens.
Messages can still be sent while the item is being uploaded.
author | Goffi <goffi@goffi.org> |
---|---|
date | Sun, 23 Feb 2020 15:39:03 +0100 |
parents | b0af45a92055 |
children | c466678c57b2 |
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 |
381
eb3f622d8791
android: create/clean a temporary directory on startup:
Goffi <goffi@goffi.org>
parents:
380
diff
changeset
|
25 from pathlib import Path |
eb3f622d8791
android: create/clean a temporary directory on startup:
Goffi <goffi@goffi.org>
parents:
380
diff
changeset
|
26 import shutil |
382
c7f1176cd2a9
android: handle Android specific content (wich `content:` scheme) in intent manager:
Goffi <goffi@goffi.org>
parents:
381
diff
changeset
|
27 import mimetypes |
322
e2b51663d8b8
core, android: new share widget + added Cagou to "share" menu:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
28 from jnius import autoclass, cast |
e2b51663d8b8
core, android: new share widget + added Cagou to "share" menu:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
29 from android import activity |
400
71f51198478c
android: handle runtime permissions:
Goffi <goffi@goffi.org>
parents:
398
diff
changeset
|
30 from android.permissions import request_permissions, Permission |
71f51198478c
android: handle runtime permissions:
Goffi <goffi@goffi.org>
parents:
398
diff
changeset
|
31 from kivy.clock import Clock |
71f51198478c
android: handle runtime permissions:
Goffi <goffi@goffi.org>
parents:
398
diff
changeset
|
32 from kivy.uix.label import Label |
377
b2a87239af25
android: platform specific menu to disconnect profile:
Goffi <goffi@goffi.org>
parents:
373
diff
changeset
|
33 from sat.core.i18n import _ |
322
e2b51663d8b8
core, android: new share widget + added Cagou to "share" menu:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
34 from sat.core import log as logging |
401
788e05d1e2bf
android: store and restore last selected widget
Goffi <goffi@goffi.org>
parents:
400
diff
changeset
|
35 from sat.tools.common import data_format |
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
|
36 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
|
37 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
|
38 from cagou.core import dialog |
322
e2b51663d8b8
core, android: new share widget + added Cagou to "share" menu:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
39 from cagou import G |
342
89799148f894
core: use classes and factory to handle platform specific behaviours in a generic way
Goffi <goffi@goffi.org>
parents:
322
diff
changeset
|
40 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
|
41 |
e2b51663d8b8
core, android: new share widget + added Cagou to "share" menu:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
42 |
e2b51663d8b8
core, android: new share widget + added Cagou to "share" menu:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
43 log = logging.getLogger(__name__) |
e2b51663d8b8
core, android: new share widget + added Cagou to "share" menu:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
44 |
400
71f51198478c
android: handle runtime permissions:
Goffi <goffi@goffi.org>
parents:
398
diff
changeset
|
45 # permission that are necessary to have Cagou running properly |
71f51198478c
android: handle runtime permissions:
Goffi <goffi@goffi.org>
parents:
398
diff
changeset
|
46 PERMISSION_MANDATORY = [ |
71f51198478c
android: handle runtime permissions:
Goffi <goffi@goffi.org>
parents:
398
diff
changeset
|
47 Permission.READ_EXTERNAL_STORAGE, |
71f51198478c
android: handle runtime permissions:
Goffi <goffi@goffi.org>
parents:
398
diff
changeset
|
48 Permission.WRITE_EXTERNAL_STORAGE, |
71f51198478c
android: handle runtime permissions:
Goffi <goffi@goffi.org>
parents:
398
diff
changeset
|
49 ] |
71f51198478c
android: handle runtime permissions:
Goffi <goffi@goffi.org>
parents:
398
diff
changeset
|
50 |
322
e2b51663d8b8
core, android: new share widget + added Cagou to "share" menu:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
51 service = autoclass('org.salutatoi.cagou.ServiceBackend') |
357
4d3a0c4f2430
core: better back key (ESC) management:
Goffi <goffi@goffi.org>
parents:
345
diff
changeset
|
52 PythonActivity = autoclass('org.kivy.android.PythonActivity') |
4d3a0c4f2430
core: better back key (ESC) management:
Goffi <goffi@goffi.org>
parents:
345
diff
changeset
|
53 mActivity = PythonActivity.mActivity |
345
a3cefa7158dc
android: open "geo:" URL using an Intent
Goffi <goffi@goffi.org>
parents:
342
diff
changeset
|
54 Intent = autoclass('android.content.Intent') |
a3cefa7158dc
android: open "geo:" URL using an Intent
Goffi <goffi@goffi.org>
parents:
342
diff
changeset
|
55 AndroidString = autoclass('java.lang.String') |
a3cefa7158dc
android: open "geo:" URL using an Intent
Goffi <goffi@goffi.org>
parents:
342
diff
changeset
|
56 Uri = autoclass('android.net.Uri') |
322
e2b51663d8b8
core, android: new share widget + added Cagou to "share" menu:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
57 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
|
58 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
|
59 VideoMedia = autoclass('android.provider.MediaStore$Video$Media') |
345
a3cefa7158dc
android: open "geo:" URL using an Intent
Goffi <goffi@goffi.org>
parents:
342
diff
changeset
|
60 |
382
c7f1176cd2a9
android: handle Android specific content (wich `content:` scheme) in intent manager:
Goffi <goffi@goffi.org>
parents:
381
diff
changeset
|
61 DISPLAY_NAME = '_display_name' |
322
e2b51663d8b8
core, android: new share widget + added Cagou to "share" menu:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
62 DATA = '_data' |
e2b51663d8b8
core, android: new share widget + added Cagou to "share" menu:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
63 |
e2b51663d8b8
core, android: new share widget + added Cagou to "share" menu:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
64 |
e2b51663d8b8
core, android: new share widget + added Cagou to "share" menu:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
65 STATE_RUNNING = b"running" |
e2b51663d8b8
core, android: new share widget + added Cagou to "share" menu:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
66 STATE_PAUSED = b"paused" |
e2b51663d8b8
core, android: new share widget + added Cagou to "share" menu:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
67 STATE_STOPPED = b"stopped" |
e2b51663d8b8
core, android: new share widget + added Cagou to "share" menu:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
68 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
|
69 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
|
70 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
|
71 |
342
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 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
|
74 |
89799148f894
core: use classes and factory to handle platform specific behaviours in a generic way
Goffi <goffi@goffi.org>
parents:
322
diff
changeset
|
75 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
|
76 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
|
77 # 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
|
78 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
|
79 |
89799148f894
core: use classes and factory to handle platform specific behaviours in a generic way
Goffi <goffi@goffi.org>
parents:
322
diff
changeset
|
80 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
|
81 # 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
|
82 # 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
|
83 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
|
84 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
|
85 |
89799148f894
core: use classes and factory to handle platform specific behaviours in a generic way
Goffi <goffi@goffi.org>
parents:
322
diff
changeset
|
86 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
|
87 argument = '' |
89799148f894
core: use classes and factory to handle platform specific behaviours in a generic way
Goffi <goffi@goffi.org>
parents:
322
diff
changeset
|
88 service.start(mActivity, argument) |
322
e2b51663d8b8
core, android: new share widget + added Cagou to "share" menu:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
89 |
342
89799148f894
core: use classes and factory to handle platform specific behaviours in a generic way
Goffi <goffi@goffi.org>
parents:
322
diff
changeset
|
90 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
|
91 self.cache.append((self.on_new_intent, mActivity.getIntent())) |
401
788e05d1e2bf
android: store and restore last selected widget
Goffi <goffi@goffi.org>
parents:
400
diff
changeset
|
92 self.last_selected_wid = None |
403
b0af45a92055
android: do not restore previously selected widget if an intent contains a widget to create.
Goffi <goffi@goffi.org>
parents:
401
diff
changeset
|
93 self.restore_selected_wid = True |
342
89799148f894
core: use classes and factory to handle platform specific behaviours in a generic way
Goffi <goffi@goffi.org>
parents:
322
diff
changeset
|
94 host.addListener('profilePlugged', self.onProfilePlugged) |
401
788e05d1e2bf
android: store and restore last selected widget
Goffi <goffi@goffi.org>
parents:
400
diff
changeset
|
95 host.addListener('selected', self.onSelectedWidget) |
381
eb3f622d8791
android: create/clean a temporary directory on startup:
Goffi <goffi@goffi.org>
parents:
380
diff
changeset
|
96 local_dir = Path(host.getConfig('', 'local_dir')).resolve() |
eb3f622d8791
android: create/clean a temporary directory on startup:
Goffi <goffi@goffi.org>
parents:
380
diff
changeset
|
97 self.tmp_dir = local_dir / 'tmp' |
eb3f622d8791
android: create/clean a temporary directory on startup:
Goffi <goffi@goffi.org>
parents:
380
diff
changeset
|
98 # we assert to avoid disaster if `/ 'tmp'` is removed by mistake on the line |
eb3f622d8791
android: create/clean a temporary directory on startup:
Goffi <goffi@goffi.org>
parents:
380
diff
changeset
|
99 # above |
eb3f622d8791
android: create/clean a temporary directory on startup:
Goffi <goffi@goffi.org>
parents:
380
diff
changeset
|
100 assert self.tmp_dir.resolve() != local_dir |
eb3f622d8791
android: create/clean a temporary directory on startup:
Goffi <goffi@goffi.org>
parents:
380
diff
changeset
|
101 # we reset tmp dir on each run, to be sure that there is no residual file |
eb3f622d8791
android: create/clean a temporary directory on startup:
Goffi <goffi@goffi.org>
parents:
380
diff
changeset
|
102 if self.tmp_dir.exists(): |
eb3f622d8791
android: create/clean a temporary directory on startup:
Goffi <goffi@goffi.org>
parents:
380
diff
changeset
|
103 shutil.rmtree(self.tmp_dir) |
398
a5457241c17f
android: fixed tmp dir creation if parents don't exist, avoiding a crash.
Goffi <goffi@goffi.org>
parents:
382
diff
changeset
|
104 self.tmp_dir.mkdir(0o700, parents=True) |
342
89799148f894
core: use classes and factory to handle platform specific behaviours in a generic way
Goffi <goffi@goffi.org>
parents:
322
diff
changeset
|
105 |
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 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
|
107 # 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
|
108 # 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
|
109 # 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
|
110 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
|
111 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
|
112 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
|
113 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
|
114 |
370
1a12bbd80943
android: autoconnect profile using the new `profileAutoconnectGet` backend method:
Goffi <goffi@goffi.org>
parents:
357
diff
changeset
|
115 def profileAutoconnectGetCb(self, profile=None): |
1a12bbd80943
android: autoconnect profile using the new `profileAutoconnectGet` backend method:
Goffi <goffi@goffi.org>
parents:
357
diff
changeset
|
116 if profile is not None: |
1a12bbd80943
android: autoconnect profile using the new `profileAutoconnectGet` backend method:
Goffi <goffi@goffi.org>
parents:
357
diff
changeset
|
117 G.host.options.profile = profile |
1a12bbd80943
android: autoconnect profile using the new `profileAutoconnectGet` backend method:
Goffi <goffi@goffi.org>
parents:
357
diff
changeset
|
118 G.host.postInit() |
1a12bbd80943
android: autoconnect profile using the new `profileAutoconnectGet` backend method:
Goffi <goffi@goffi.org>
parents:
357
diff
changeset
|
119 |
1a12bbd80943
android: autoconnect profile using the new `profileAutoconnectGet` backend method:
Goffi <goffi@goffi.org>
parents:
357
diff
changeset
|
120 def profileAutoconnectGetEb(self, failure_): |
1a12bbd80943
android: autoconnect profile using the new `profileAutoconnectGet` backend method:
Goffi <goffi@goffi.org>
parents:
357
diff
changeset
|
121 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
|
122 G.host.postInit() |
1a12bbd80943
android: autoconnect profile using the new `profileAutoconnectGet` backend method:
Goffi <goffi@goffi.org>
parents:
357
diff
changeset
|
123 |
400
71f51198478c
android: handle runtime permissions:
Goffi <goffi@goffi.org>
parents:
398
diff
changeset
|
124 def _show_perm_warning(self, permissions): |
71f51198478c
android: handle runtime permissions:
Goffi <goffi@goffi.org>
parents:
398
diff
changeset
|
125 root_wid = G.host.app.root |
71f51198478c
android: handle runtime permissions:
Goffi <goffi@goffi.org>
parents:
398
diff
changeset
|
126 perm_warning = Label( |
71f51198478c
android: handle runtime permissions:
Goffi <goffi@goffi.org>
parents:
398
diff
changeset
|
127 size_hint=(1, 1), |
71f51198478c
android: handle runtime permissions:
Goffi <goffi@goffi.org>
parents:
398
diff
changeset
|
128 text_size=(root_wid.width, root_wid.height), |
71f51198478c
android: handle runtime permissions:
Goffi <goffi@goffi.org>
parents:
398
diff
changeset
|
129 font_size='22sp', |
71f51198478c
android: handle runtime permissions:
Goffi <goffi@goffi.org>
parents:
398
diff
changeset
|
130 bold=True, |
71f51198478c
android: handle runtime permissions:
Goffi <goffi@goffi.org>
parents:
398
diff
changeset
|
131 color=(0.67, 0, 0, 1), |
71f51198478c
android: handle runtime permissions:
Goffi <goffi@goffi.org>
parents:
398
diff
changeset
|
132 halign='center', |
71f51198478c
android: handle runtime permissions:
Goffi <goffi@goffi.org>
parents:
398
diff
changeset
|
133 valign='center', |
71f51198478c
android: handle runtime permissions:
Goffi <goffi@goffi.org>
parents:
398
diff
changeset
|
134 text=_( |
71f51198478c
android: handle runtime permissions:
Goffi <goffi@goffi.org>
parents:
398
diff
changeset
|
135 "Requested permissions are mandatory to run Cagou, if you don't " |
71f51198478c
android: handle runtime permissions:
Goffi <goffi@goffi.org>
parents:
398
diff
changeset
|
136 "accept them, Cagou can't run properly. Please accept following " |
71f51198478c
android: handle runtime permissions:
Goffi <goffi@goffi.org>
parents:
398
diff
changeset
|
137 "permissions, or set them in Android settings for Cagou:\n" |
71f51198478c
android: handle runtime permissions:
Goffi <goffi@goffi.org>
parents:
398
diff
changeset
|
138 "{permissions}\n\nCagou will be closed in 20 s").format( |
71f51198478c
android: handle runtime permissions:
Goffi <goffi@goffi.org>
parents:
398
diff
changeset
|
139 permissions='\n'.join(p.split('.')[-1] for p in permissions))) |
71f51198478c
android: handle runtime permissions:
Goffi <goffi@goffi.org>
parents:
398
diff
changeset
|
140 root_wid.clear_widgets() |
71f51198478c
android: handle runtime permissions:
Goffi <goffi@goffi.org>
parents:
398
diff
changeset
|
141 root_wid.add_widget(perm_warning) |
71f51198478c
android: handle runtime permissions:
Goffi <goffi@goffi.org>
parents:
398
diff
changeset
|
142 Clock.schedule_once(lambda *args: G.host.app.stop(), 20) |
71f51198478c
android: handle runtime permissions:
Goffi <goffi@goffi.org>
parents:
398
diff
changeset
|
143 |
71f51198478c
android: handle runtime permissions:
Goffi <goffi@goffi.org>
parents:
398
diff
changeset
|
144 def permission_cb(self, permissions, grant_results): |
71f51198478c
android: handle runtime permissions:
Goffi <goffi@goffi.org>
parents:
398
diff
changeset
|
145 if not all(grant_results): |
71f51198478c
android: handle runtime permissions:
Goffi <goffi@goffi.org>
parents:
398
diff
changeset
|
146 # we keep asking until they are accepted, as we can't run properly |
71f51198478c
android: handle runtime permissions:
Goffi <goffi@goffi.org>
parents:
398
diff
changeset
|
147 # without them |
71f51198478c
android: handle runtime permissions:
Goffi <goffi@goffi.org>
parents:
398
diff
changeset
|
148 # TODO: a message explaining why permission is needed should be printed |
71f51198478c
android: handle runtime permissions:
Goffi <goffi@goffi.org>
parents:
398
diff
changeset
|
149 # TODO: the storage permission is mainly used to set download_dir, we should |
71f51198478c
android: handle runtime permissions:
Goffi <goffi@goffi.org>
parents:
398
diff
changeset
|
150 # be able to run Cagou without it. |
71f51198478c
android: handle runtime permissions:
Goffi <goffi@goffi.org>
parents:
398
diff
changeset
|
151 if not hasattr(self, 'perms_counter'): |
71f51198478c
android: handle runtime permissions:
Goffi <goffi@goffi.org>
parents:
398
diff
changeset
|
152 self.perms_counter = 0 |
71f51198478c
android: handle runtime permissions:
Goffi <goffi@goffi.org>
parents:
398
diff
changeset
|
153 self.perms_counter += 1 |
71f51198478c
android: handle runtime permissions:
Goffi <goffi@goffi.org>
parents:
398
diff
changeset
|
154 if self.perms_counter > 5: |
71f51198478c
android: handle runtime permissions:
Goffi <goffi@goffi.org>
parents:
398
diff
changeset
|
155 Clock.schedule_once( |
71f51198478c
android: handle runtime permissions:
Goffi <goffi@goffi.org>
parents:
398
diff
changeset
|
156 lambda *args: self._show_perm_warning(permissions), |
71f51198478c
android: handle runtime permissions:
Goffi <goffi@goffi.org>
parents:
398
diff
changeset
|
157 0) |
71f51198478c
android: handle runtime permissions:
Goffi <goffi@goffi.org>
parents:
398
diff
changeset
|
158 return |
71f51198478c
android: handle runtime permissions:
Goffi <goffi@goffi.org>
parents:
398
diff
changeset
|
159 |
71f51198478c
android: handle runtime permissions:
Goffi <goffi@goffi.org>
parents:
398
diff
changeset
|
160 perm_dict = dict(zip(permissions, grant_results)) |
71f51198478c
android: handle runtime permissions:
Goffi <goffi@goffi.org>
parents:
398
diff
changeset
|
161 log.warning( |
71f51198478c
android: handle runtime permissions:
Goffi <goffi@goffi.org>
parents:
398
diff
changeset
|
162 f"not all mandatory permissions are granted, requesting again: " |
71f51198478c
android: handle runtime permissions:
Goffi <goffi@goffi.org>
parents:
398
diff
changeset
|
163 f"{perm_dict}") |
71f51198478c
android: handle runtime permissions:
Goffi <goffi@goffi.org>
parents:
398
diff
changeset
|
164 request_permissions(PERMISSION_MANDATORY, callback=self.permission_cb) |
71f51198478c
android: handle runtime permissions:
Goffi <goffi@goffi.org>
parents:
398
diff
changeset
|
165 return |
71f51198478c
android: handle runtime permissions:
Goffi <goffi@goffi.org>
parents:
398
diff
changeset
|
166 |
71f51198478c
android: handle runtime permissions:
Goffi <goffi@goffi.org>
parents:
398
diff
changeset
|
167 Clock.schedule_once(lambda *args: G.host.bridge.profileAutoconnectGet( |
370
1a12bbd80943
android: autoconnect profile using the new `profileAutoconnectGet` backend method:
Goffi <goffi@goffi.org>
parents:
357
diff
changeset
|
168 callback=self.profileAutoconnectGetCb, |
400
71f51198478c
android: handle runtime permissions:
Goffi <goffi@goffi.org>
parents:
398
diff
changeset
|
169 errback=self.profileAutoconnectGetEb), |
71f51198478c
android: handle runtime permissions:
Goffi <goffi@goffi.org>
parents:
398
diff
changeset
|
170 0) |
71f51198478c
android: handle runtime permissions:
Goffi <goffi@goffi.org>
parents:
398
diff
changeset
|
171 |
71f51198478c
android: handle runtime permissions:
Goffi <goffi@goffi.org>
parents:
398
diff
changeset
|
172 def do_postInit(self): |
71f51198478c
android: handle runtime permissions:
Goffi <goffi@goffi.org>
parents:
398
diff
changeset
|
173 request_permissions(PERMISSION_MANDATORY, callback=self.permission_cb) |
370
1a12bbd80943
android: autoconnect profile using the new `profileAutoconnectGet` backend method:
Goffi <goffi@goffi.org>
parents:
357
diff
changeset
|
174 return False |
1a12bbd80943
android: autoconnect profile using the new `profileAutoconnectGet` backend method:
Goffi <goffi@goffi.org>
parents:
357
diff
changeset
|
175 |
401
788e05d1e2bf
android: store and restore last selected widget
Goffi <goffi@goffi.org>
parents:
400
diff
changeset
|
176 def privateDataGetCb(self, data_s, profile): |
788e05d1e2bf
android: store and restore last selected widget
Goffi <goffi@goffi.org>
parents:
400
diff
changeset
|
177 data = data_format.deserialise(data_s, type_check=None) |
403
b0af45a92055
android: do not restore previously selected widget if an intent contains a widget to create.
Goffi <goffi@goffi.org>
parents:
401
diff
changeset
|
178 if data is not None and self.restore_selected_wid: |
401
788e05d1e2bf
android: store and restore last selected widget
Goffi <goffi@goffi.org>
parents:
400
diff
changeset
|
179 log.debug(f"restoring previous widget {data}") |
788e05d1e2bf
android: store and restore last selected widget
Goffi <goffi@goffi.org>
parents:
400
diff
changeset
|
180 try: |
788e05d1e2bf
android: store and restore last selected widget
Goffi <goffi@goffi.org>
parents:
400
diff
changeset
|
181 name = data['name'] |
788e05d1e2bf
android: store and restore last selected widget
Goffi <goffi@goffi.org>
parents:
400
diff
changeset
|
182 target = data['target'] |
788e05d1e2bf
android: store and restore last selected widget
Goffi <goffi@goffi.org>
parents:
400
diff
changeset
|
183 except KeyError as e: |
788e05d1e2bf
android: store and restore last selected widget
Goffi <goffi@goffi.org>
parents:
400
diff
changeset
|
184 log.error(f"Bad data format for selected widget: {e}\ndata={data}") |
788e05d1e2bf
android: store and restore last selected widget
Goffi <goffi@goffi.org>
parents:
400
diff
changeset
|
185 return |
788e05d1e2bf
android: store and restore last selected widget
Goffi <goffi@goffi.org>
parents:
400
diff
changeset
|
186 if target: |
788e05d1e2bf
android: store and restore last selected widget
Goffi <goffi@goffi.org>
parents:
400
diff
changeset
|
187 target = jid.JID(data['target']) |
788e05d1e2bf
android: store and restore last selected widget
Goffi <goffi@goffi.org>
parents:
400
diff
changeset
|
188 plugin_info = G.host.getPluginInfo(name=name) |
788e05d1e2bf
android: store and restore last selected widget
Goffi <goffi@goffi.org>
parents:
400
diff
changeset
|
189 if plugin_info is None: |
788e05d1e2bf
android: store and restore last selected widget
Goffi <goffi@goffi.org>
parents:
400
diff
changeset
|
190 log.warning("Can't restore unknown plugin: {name}") |
788e05d1e2bf
android: store and restore last selected widget
Goffi <goffi@goffi.org>
parents:
400
diff
changeset
|
191 return |
788e05d1e2bf
android: store and restore last selected widget
Goffi <goffi@goffi.org>
parents:
400
diff
changeset
|
192 factory = plugin_info['factory'] |
788e05d1e2bf
android: store and restore last selected widget
Goffi <goffi@goffi.org>
parents:
400
diff
changeset
|
193 G.host.switchWidget( |
788e05d1e2bf
android: store and restore last selected widget
Goffi <goffi@goffi.org>
parents:
400
diff
changeset
|
194 None, |
788e05d1e2bf
android: store and restore last selected widget
Goffi <goffi@goffi.org>
parents:
400
diff
changeset
|
195 factory(plugin_info, target=target, profiles=[profile]) |
788e05d1e2bf
android: store and restore last selected widget
Goffi <goffi@goffi.org>
parents:
400
diff
changeset
|
196 ) |
788e05d1e2bf
android: store and restore last selected widget
Goffi <goffi@goffi.org>
parents:
400
diff
changeset
|
197 |
342
89799148f894
core: use classes and factory to handle platform specific behaviours in a generic way
Goffi <goffi@goffi.org>
parents:
322
diff
changeset
|
198 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
|
199 log.debug("ANDROID profilePlugged") |
370
1a12bbd80943
android: autoconnect profile using the new `profileAutoconnectGet` backend method:
Goffi <goffi@goffi.org>
parents:
357
diff
changeset
|
200 G.host.bridge.setParam( |
1a12bbd80943
android: autoconnect profile using the new `profileAutoconnectGet` backend method:
Goffi <goffi@goffi.org>
parents:
357
diff
changeset
|
201 "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
|
202 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
|
203 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
|
204 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
|
205 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
|
206 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
|
207 G.host.removeListener("profilePlugged", self.onProfilePlugged) |
401
788e05d1e2bf
android: store and restore last selected widget
Goffi <goffi@goffi.org>
parents:
400
diff
changeset
|
208 # we restore the stored widget if any |
788e05d1e2bf
android: store and restore last selected widget
Goffi <goffi@goffi.org>
parents:
400
diff
changeset
|
209 # user will then go back to where they was when the frontend was closed |
788e05d1e2bf
android: store and restore last selected widget
Goffi <goffi@goffi.org>
parents:
400
diff
changeset
|
210 G.host.bridge.privateDataGet( |
788e05d1e2bf
android: store and restore last selected widget
Goffi <goffi@goffi.org>
parents:
400
diff
changeset
|
211 "cagou", "selected_widget", profile, |
788e05d1e2bf
android: store and restore last selected widget
Goffi <goffi@goffi.org>
parents:
400
diff
changeset
|
212 callback=partial(self.privateDataGetCb, profile=profile), |
788e05d1e2bf
android: store and restore last selected widget
Goffi <goffi@goffi.org>
parents:
400
diff
changeset
|
213 errback=partial( |
788e05d1e2bf
android: store and restore last selected widget
Goffi <goffi@goffi.org>
parents:
400
diff
changeset
|
214 G.host.errback, |
788e05d1e2bf
android: store and restore last selected widget
Goffi <goffi@goffi.org>
parents:
400
diff
changeset
|
215 title=_("can't get selected widget"), |
788e05d1e2bf
android: store and restore last selected widget
Goffi <goffi@goffi.org>
parents:
400
diff
changeset
|
216 message=_("error while retrieving selected widget: {msg}")) |
788e05d1e2bf
android: store and restore last selected widget
Goffi <goffi@goffi.org>
parents:
400
diff
changeset
|
217 ) |
788e05d1e2bf
android: store and restore last selected widget
Goffi <goffi@goffi.org>
parents:
400
diff
changeset
|
218 |
788e05d1e2bf
android: store and restore last selected widget
Goffi <goffi@goffi.org>
parents:
400
diff
changeset
|
219 def onSelectedWidget(self, wid): |
788e05d1e2bf
android: store and restore last selected widget
Goffi <goffi@goffi.org>
parents:
400
diff
changeset
|
220 """Store selected widget in backend, to restore it on next startup""" |
788e05d1e2bf
android: store and restore last selected widget
Goffi <goffi@goffi.org>
parents:
400
diff
changeset
|
221 if self.last_selected_wid == None: |
788e05d1e2bf
android: store and restore last selected widget
Goffi <goffi@goffi.org>
parents:
400
diff
changeset
|
222 self.last_selected_wid = wid |
788e05d1e2bf
android: store and restore last selected widget
Goffi <goffi@goffi.org>
parents:
400
diff
changeset
|
223 # we skip the first selected widget, as we'll restore stored one if possible |
788e05d1e2bf
android: store and restore last selected widget
Goffi <goffi@goffi.org>
parents:
400
diff
changeset
|
224 return |
788e05d1e2bf
android: store and restore last selected widget
Goffi <goffi@goffi.org>
parents:
400
diff
changeset
|
225 |
788e05d1e2bf
android: store and restore last selected widget
Goffi <goffi@goffi.org>
parents:
400
diff
changeset
|
226 self.last_selected_wid = wid |
788e05d1e2bf
android: store and restore last selected widget
Goffi <goffi@goffi.org>
parents:
400
diff
changeset
|
227 |
788e05d1e2bf
android: store and restore last selected widget
Goffi <goffi@goffi.org>
parents:
400
diff
changeset
|
228 try: |
788e05d1e2bf
android: store and restore last selected widget
Goffi <goffi@goffi.org>
parents:
400
diff
changeset
|
229 plugin_info = wid.plugin_info |
788e05d1e2bf
android: store and restore last selected widget
Goffi <goffi@goffi.org>
parents:
400
diff
changeset
|
230 except AttributeError: |
788e05d1e2bf
android: store and restore last selected widget
Goffi <goffi@goffi.org>
parents:
400
diff
changeset
|
231 log.warning(f"No plugin info found for {wid}, can't store selected widget") |
788e05d1e2bf
android: store and restore last selected widget
Goffi <goffi@goffi.org>
parents:
400
diff
changeset
|
232 return |
788e05d1e2bf
android: store and restore last selected widget
Goffi <goffi@goffi.org>
parents:
400
diff
changeset
|
233 |
788e05d1e2bf
android: store and restore last selected widget
Goffi <goffi@goffi.org>
parents:
400
diff
changeset
|
234 try: |
788e05d1e2bf
android: store and restore last selected widget
Goffi <goffi@goffi.org>
parents:
400
diff
changeset
|
235 profile = next(iter(wid.profiles)) |
788e05d1e2bf
android: store and restore last selected widget
Goffi <goffi@goffi.org>
parents:
400
diff
changeset
|
236 except (AttributeError, StopIteration): |
788e05d1e2bf
android: store and restore last selected widget
Goffi <goffi@goffi.org>
parents:
400
diff
changeset
|
237 profile = None |
788e05d1e2bf
android: store and restore last selected widget
Goffi <goffi@goffi.org>
parents:
400
diff
changeset
|
238 |
788e05d1e2bf
android: store and restore last selected widget
Goffi <goffi@goffi.org>
parents:
400
diff
changeset
|
239 if profile is None: |
788e05d1e2bf
android: store and restore last selected widget
Goffi <goffi@goffi.org>
parents:
400
diff
changeset
|
240 try: |
788e05d1e2bf
android: store and restore last selected widget
Goffi <goffi@goffi.org>
parents:
400
diff
changeset
|
241 profile = next(iter(G.host.profiles)) |
788e05d1e2bf
android: store and restore last selected widget
Goffi <goffi@goffi.org>
parents:
400
diff
changeset
|
242 except StopIteration: |
788e05d1e2bf
android: store and restore last selected widget
Goffi <goffi@goffi.org>
parents:
400
diff
changeset
|
243 log.debug("No profile plugged yet, can't store selected widget") |
788e05d1e2bf
android: store and restore last selected widget
Goffi <goffi@goffi.org>
parents:
400
diff
changeset
|
244 return |
788e05d1e2bf
android: store and restore last selected widget
Goffi <goffi@goffi.org>
parents:
400
diff
changeset
|
245 try: |
788e05d1e2bf
android: store and restore last selected widget
Goffi <goffi@goffi.org>
parents:
400
diff
changeset
|
246 target = wid.target |
788e05d1e2bf
android: store and restore last selected widget
Goffi <goffi@goffi.org>
parents:
400
diff
changeset
|
247 except AttributeError: |
788e05d1e2bf
android: store and restore last selected widget
Goffi <goffi@goffi.org>
parents:
400
diff
changeset
|
248 target = None |
788e05d1e2bf
android: store and restore last selected widget
Goffi <goffi@goffi.org>
parents:
400
diff
changeset
|
249 |
788e05d1e2bf
android: store and restore last selected widget
Goffi <goffi@goffi.org>
parents:
400
diff
changeset
|
250 data = { |
788e05d1e2bf
android: store and restore last selected widget
Goffi <goffi@goffi.org>
parents:
400
diff
changeset
|
251 "name": plugin_info["name"], |
788e05d1e2bf
android: store and restore last selected widget
Goffi <goffi@goffi.org>
parents:
400
diff
changeset
|
252 "target": target, |
788e05d1e2bf
android: store and restore last selected widget
Goffi <goffi@goffi.org>
parents:
400
diff
changeset
|
253 } |
788e05d1e2bf
android: store and restore last selected widget
Goffi <goffi@goffi.org>
parents:
400
diff
changeset
|
254 |
788e05d1e2bf
android: store and restore last selected widget
Goffi <goffi@goffi.org>
parents:
400
diff
changeset
|
255 G.host.bridge.privateDataSet( |
788e05d1e2bf
android: store and restore last selected widget
Goffi <goffi@goffi.org>
parents:
400
diff
changeset
|
256 "cagou", "selected_widget", data_format.serialise(data), profile, |
788e05d1e2bf
android: store and restore last selected widget
Goffi <goffi@goffi.org>
parents:
400
diff
changeset
|
257 errback=partial( |
788e05d1e2bf
android: store and restore last selected widget
Goffi <goffi@goffi.org>
parents:
400
diff
changeset
|
258 G.host.errback, |
788e05d1e2bf
android: store and restore last selected widget
Goffi <goffi@goffi.org>
parents:
400
diff
changeset
|
259 title=_("can set selected widget"), |
788e05d1e2bf
android: store and restore last selected widget
Goffi <goffi@goffi.org>
parents:
400
diff
changeset
|
260 message=_("error while setting selected widget: {msg}")) |
788e05d1e2bf
android: store and restore last selected widget
Goffi <goffi@goffi.org>
parents:
400
diff
changeset
|
261 ) |
342
89799148f894
core: use classes and factory to handle platform specific behaviours in a generic way
Goffi <goffi@goffi.org>
parents:
322
diff
changeset
|
262 |
89799148f894
core: use classes and factory to handle platform specific behaviours in a generic way
Goffi <goffi@goffi.org>
parents:
322
diff
changeset
|
263 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
|
264 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
|
265 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
|
266 return True |
322
e2b51663d8b8
core, android: new share widget + added Cagou to "share" menu:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
267 |
342
89799148f894
core: use classes and factory to handle platform specific behaviours in a generic way
Goffi <goffi@goffi.org>
parents:
322
diff
changeset
|
268 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
|
269 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
|
270 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
|
271 |
89799148f894
core: use classes and factory to handle platform specific behaviours in a generic way
Goffi <goffi@goffi.org>
parents:
322
diff
changeset
|
272 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
|
273 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
|
274 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
|
275 |
357
4d3a0c4f2430
core: better back key (ESC) management:
Goffi <goffi@goffi.org>
parents:
345
diff
changeset
|
276 def on_key_back_root(self): |
4d3a0c4f2430
core: better back key (ESC) management:
Goffi <goffi@goffi.org>
parents:
345
diff
changeset
|
277 PythonActivity.moveTaskToBack(True) |
4d3a0c4f2430
core: better back key (ESC) management:
Goffi <goffi@goffi.org>
parents:
345
diff
changeset
|
278 return True |
4d3a0c4f2430
core: better back key (ESC) management:
Goffi <goffi@goffi.org>
parents:
345
diff
changeset
|
279 |
4d3a0c4f2430
core: better back key (ESC) management:
Goffi <goffi@goffi.org>
parents:
345
diff
changeset
|
280 def on_key_back_share(self, share_widget): |
4d3a0c4f2430
core: better back key (ESC) management:
Goffi <goffi@goffi.org>
parents:
345
diff
changeset
|
281 share_widget.close() |
4d3a0c4f2430
core: better back key (ESC) management:
Goffi <goffi@goffi.org>
parents:
345
diff
changeset
|
282 PythonActivity.moveTaskToBack(True) |
4d3a0c4f2430
core: better back key (ESC) management:
Goffi <goffi@goffi.org>
parents:
345
diff
changeset
|
283 return True |
4d3a0c4f2430
core: better back key (ESC) management:
Goffi <goffi@goffi.org>
parents:
345
diff
changeset
|
284 |
377
b2a87239af25
android: platform specific menu to disconnect profile:
Goffi <goffi@goffi.org>
parents:
373
diff
changeset
|
285 def _disconnect(self, profile): |
b2a87239af25
android: platform specific menu to disconnect profile:
Goffi <goffi@goffi.org>
parents:
373
diff
changeset
|
286 G.host.bridge.setParam( |
b2a87239af25
android: platform specific menu to disconnect profile:
Goffi <goffi@goffi.org>
parents:
373
diff
changeset
|
287 "autoconnect_backend", C.BOOL_FALSE, "Connection", -1, profile, |
b2a87239af25
android: platform specific menu to disconnect profile:
Goffi <goffi@goffi.org>
parents:
373
diff
changeset
|
288 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
|
289 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
|
290 G.host.profiles.unplug(profile) |
b2a87239af25
android: platform specific menu to disconnect profile:
Goffi <goffi@goffi.org>
parents:
373
diff
changeset
|
291 G.host.bridge.disconnect(profile) |
b2a87239af25
android: platform specific menu to disconnect profile:
Goffi <goffi@goffi.org>
parents:
373
diff
changeset
|
292 G.host.app.showProfileManager() |
b2a87239af25
android: platform specific menu to disconnect profile:
Goffi <goffi@goffi.org>
parents:
373
diff
changeset
|
293 G.host.closeUI() |
b2a87239af25
android: platform specific menu to disconnect profile:
Goffi <goffi@goffi.org>
parents:
373
diff
changeset
|
294 |
b2a87239af25
android: platform specific menu to disconnect profile:
Goffi <goffi@goffi.org>
parents:
373
diff
changeset
|
295 def _on_disconnect(self): |
b2a87239af25
android: platform specific menu to disconnect profile:
Goffi <goffi@goffi.org>
parents:
373
diff
changeset
|
296 current_profile = next(iter(G.host.profiles)) |
b2a87239af25
android: platform specific menu to disconnect profile:
Goffi <goffi@goffi.org>
parents:
373
diff
changeset
|
297 wid = dialog.ConfirmDialog( |
b2a87239af25
android: platform specific menu to disconnect profile:
Goffi <goffi@goffi.org>
parents:
373
diff
changeset
|
298 title=_("Are you sure to disconnect?"), |
b2a87239af25
android: platform specific menu to disconnect profile:
Goffi <goffi@goffi.org>
parents:
373
diff
changeset
|
299 message=_( |
b2a87239af25
android: platform specific menu to disconnect profile:
Goffi <goffi@goffi.org>
parents:
373
diff
changeset
|
300 "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
|
301 "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
|
302 "want?").format(profile=current_profile), |
b2a87239af25
android: platform specific menu to disconnect profile:
Goffi <goffi@goffi.org>
parents:
373
diff
changeset
|
303 yes_cb=partial(self._disconnect, profile=current_profile), |
b2a87239af25
android: platform specific menu to disconnect profile:
Goffi <goffi@goffi.org>
parents:
373
diff
changeset
|
304 no_cb=G.host.closeUI, |
b2a87239af25
android: platform specific menu to disconnect profile:
Goffi <goffi@goffi.org>
parents:
373
diff
changeset
|
305 ) |
b2a87239af25
android: platform specific menu to disconnect profile:
Goffi <goffi@goffi.org>
parents:
373
diff
changeset
|
306 G.host.showExtraUI(wid) |
b2a87239af25
android: platform specific menu to disconnect profile:
Goffi <goffi@goffi.org>
parents:
373
diff
changeset
|
307 |
b2a87239af25
android: platform specific menu to disconnect profile:
Goffi <goffi@goffi.org>
parents:
373
diff
changeset
|
308 def on_extra_menu_init(self, extra_menu): |
b2a87239af25
android: platform specific menu to disconnect profile:
Goffi <goffi@goffi.org>
parents:
373
diff
changeset
|
309 extra_menu.addItem(_('disconnect'), self._on_disconnect) |
b2a87239af25
android: platform specific menu to disconnect profile:
Goffi <goffi@goffi.org>
parents:
373
diff
changeset
|
310 |
372
1481f09c9175
settings (android): don't expose autoconnect parameters:
Goffi <goffi@goffi.org>
parents:
370
diff
changeset
|
311 def updateParamsExtra(self, extra): |
1481f09c9175
settings (android): don't expose autoconnect parameters:
Goffi <goffi@goffi.org>
parents:
370
diff
changeset
|
312 # on Android, we handle autoconnection automatically, |
1481f09c9175
settings (android): don't expose autoconnect parameters:
Goffi <goffi@goffi.org>
parents:
370
diff
changeset
|
313 # user must not modify those parameters |
1481f09c9175
settings (android): don't expose autoconnect parameters:
Goffi <goffi@goffi.org>
parents:
370
diff
changeset
|
314 extra.update( |
1481f09c9175
settings (android): don't expose autoconnect parameters:
Goffi <goffi@goffi.org>
parents:
370
diff
changeset
|
315 { |
1481f09c9175
settings (android): don't expose autoconnect parameters:
Goffi <goffi@goffi.org>
parents:
370
diff
changeset
|
316 "ignore": [ |
1481f09c9175
settings (android): don't expose autoconnect parameters:
Goffi <goffi@goffi.org>
parents:
370
diff
changeset
|
317 ["Connection", "autoconnect_backend"], |
1481f09c9175
settings (android): don't expose autoconnect parameters:
Goffi <goffi@goffi.org>
parents:
370
diff
changeset
|
318 ["Connection", "autoconnect"], |
1481f09c9175
settings (android): don't expose autoconnect parameters:
Goffi <goffi@goffi.org>
parents:
370
diff
changeset
|
319 ["Connection", "autodisconnect"], |
1481f09c9175
settings (android): don't expose autoconnect parameters:
Goffi <goffi@goffi.org>
parents:
370
diff
changeset
|
320 ], |
1481f09c9175
settings (android): don't expose autoconnect parameters:
Goffi <goffi@goffi.org>
parents:
370
diff
changeset
|
321 } |
1481f09c9175
settings (android): don't expose autoconnect parameters:
Goffi <goffi@goffi.org>
parents:
370
diff
changeset
|
322 ) |
1481f09c9175
settings (android): don't expose autoconnect parameters:
Goffi <goffi@goffi.org>
parents:
370
diff
changeset
|
323 |
382
c7f1176cd2a9
android: handle Android specific content (wich `content:` scheme) in intent manager:
Goffi <goffi@goffi.org>
parents:
381
diff
changeset
|
324 def getColDataFromUri(self, uri, col_name): |
342
89799148f894
core: use classes and factory to handle platform specific behaviours in a generic way
Goffi <goffi@goffi.org>
parents:
322
diff
changeset
|
325 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
|
326 if cursor is None: |
382
c7f1176cd2a9
android: handle Android specific content (wich `content:` scheme) in intent manager:
Goffi <goffi@goffi.org>
parents:
381
diff
changeset
|
327 return None |
c7f1176cd2a9
android: handle Android specific content (wich `content:` scheme) in intent manager:
Goffi <goffi@goffi.org>
parents:
381
diff
changeset
|
328 try: |
342
89799148f894
core: use classes and factory to handle platform specific behaviours in a generic way
Goffi <goffi@goffi.org>
parents:
322
diff
changeset
|
329 cursor.moveToFirst() |
382
c7f1176cd2a9
android: handle Android specific content (wich `content:` scheme) in intent manager:
Goffi <goffi@goffi.org>
parents:
381
diff
changeset
|
330 col_idx = cursor.getColumnIndex(col_name); |
342
89799148f894
core: use classes and factory to handle platform specific behaviours in a generic way
Goffi <goffi@goffi.org>
parents:
322
diff
changeset
|
331 if col_idx == -1: |
382
c7f1176cd2a9
android: handle Android specific content (wich `content:` scheme) in intent manager:
Goffi <goffi@goffi.org>
parents:
381
diff
changeset
|
332 return None |
342
89799148f894
core: use classes and factory to handle platform specific behaviours in a generic way
Goffi <goffi@goffi.org>
parents:
322
diff
changeset
|
333 return cursor.getString(col_idx) |
382
c7f1176cd2a9
android: handle Android specific content (wich `content:` scheme) in intent manager:
Goffi <goffi@goffi.org>
parents:
381
diff
changeset
|
334 finally: |
c7f1176cd2a9
android: handle Android specific content (wich `content:` scheme) in intent manager:
Goffi <goffi@goffi.org>
parents:
381
diff
changeset
|
335 cursor.close() |
c7f1176cd2a9
android: handle Android specific content (wich `content:` scheme) in intent manager:
Goffi <goffi@goffi.org>
parents:
381
diff
changeset
|
336 |
c7f1176cd2a9
android: handle Android specific content (wich `content:` scheme) in intent manager:
Goffi <goffi@goffi.org>
parents:
381
diff
changeset
|
337 def getFilenameFromUri(self, uri, media_type): |
c7f1176cd2a9
android: handle Android specific content (wich `content:` scheme) in intent manager:
Goffi <goffi@goffi.org>
parents:
381
diff
changeset
|
338 filename = self.getColDataFromUri(uri, DISPLAY_NAME) |
c7f1176cd2a9
android: handle Android specific content (wich `content:` scheme) in intent manager:
Goffi <goffi@goffi.org>
parents:
381
diff
changeset
|
339 if filename is None: |
c7f1176cd2a9
android: handle Android specific content (wich `content:` scheme) in intent manager:
Goffi <goffi@goffi.org>
parents:
381
diff
changeset
|
340 uri_p = Path(uri.toString()) |
c7f1176cd2a9
android: handle Android specific content (wich `content:` scheme) in intent manager:
Goffi <goffi@goffi.org>
parents:
381
diff
changeset
|
341 filename = uri_p.name or "unnamed" |
c7f1176cd2a9
android: handle Android specific content (wich `content:` scheme) in intent manager:
Goffi <goffi@goffi.org>
parents:
381
diff
changeset
|
342 if not uri_p.suffix and media_type: |
c7f1176cd2a9
android: handle Android specific content (wich `content:` scheme) in intent manager:
Goffi <goffi@goffi.org>
parents:
381
diff
changeset
|
343 suffix = mimetypes.guess_extension(media_type, strict=False) |
c7f1176cd2a9
android: handle Android specific content (wich `content:` scheme) in intent manager:
Goffi <goffi@goffi.org>
parents:
381
diff
changeset
|
344 if suffix: |
c7f1176cd2a9
android: handle Android specific content (wich `content:` scheme) in intent manager:
Goffi <goffi@goffi.org>
parents:
381
diff
changeset
|
345 filename = filename + suffix |
c7f1176cd2a9
android: handle Android specific content (wich `content:` scheme) in intent manager:
Goffi <goffi@goffi.org>
parents:
381
diff
changeset
|
346 return filename |
c7f1176cd2a9
android: handle Android specific content (wich `content:` scheme) in intent manager:
Goffi <goffi@goffi.org>
parents:
381
diff
changeset
|
347 |
c7f1176cd2a9
android: handle Android specific content (wich `content:` scheme) in intent manager:
Goffi <goffi@goffi.org>
parents:
381
diff
changeset
|
348 def getPathFromUri(self, uri): |
c7f1176cd2a9
android: handle Android specific content (wich `content:` scheme) in intent manager:
Goffi <goffi@goffi.org>
parents:
381
diff
changeset
|
349 # FIXME: using DATA is not recommended (and DATA is deprecated) |
c7f1176cd2a9
android: handle Android specific content (wich `content:` scheme) in intent manager:
Goffi <goffi@goffi.org>
parents:
381
diff
changeset
|
350 # we should read directly the file with |
c7f1176cd2a9
android: handle Android specific content (wich `content:` scheme) in intent manager:
Goffi <goffi@goffi.org>
parents:
381
diff
changeset
|
351 # ContentResolver#openFileDescriptor(Uri, String) |
c7f1176cd2a9
android: handle Android specific content (wich `content:` scheme) in intent manager:
Goffi <goffi@goffi.org>
parents:
381
diff
changeset
|
352 path = self.getColDataFromUri(uri, DATA) |
c7f1176cd2a9
android: handle Android specific content (wich `content:` scheme) in intent manager:
Goffi <goffi@goffi.org>
parents:
381
diff
changeset
|
353 return uri.getPath() if path is None else path |
342
89799148f894
core: use classes and factory to handle platform specific behaviours in a generic way
Goffi <goffi@goffi.org>
parents:
322
diff
changeset
|
354 |
89799148f894
core: use classes and factory to handle platform specific behaviours in a generic way
Goffi <goffi@goffi.org>
parents:
322
diff
changeset
|
355 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
|
356 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
|
357 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
|
358 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
|
359 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
|
360 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
|
361 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
|
362 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
|
363 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
|
364 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
|
365 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
|
366 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
|
367 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
|
368 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
|
369 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
|
370 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
|
371 else: |
403
b0af45a92055
android: do not restore previously selected widget if an intent contains a widget to create.
Goffi <goffi@goffi.org>
parents:
401
diff
changeset
|
372 # we don't want stored selected widget to be displayed after this |
b0af45a92055
android: do not restore previously selected widget if an intent contains a widget to create.
Goffi <goffi@goffi.org>
parents:
401
diff
changeset
|
373 # one |
b0af45a92055
android: do not restore previously selected widget if an intent contains a widget to create.
Goffi <goffi@goffi.org>
parents:
401
diff
changeset
|
374 log.debug("cancelling restoration of previous widget") |
b0af45a92055
android: do not restore previously selected widget if an intent contains a widget to create.
Goffi <goffi@goffi.org>
parents:
401
diff
changeset
|
375 self.restore_selected_wid = False |
b0af45a92055
android: do not restore previously selected widget if an intent contains a widget to create.
Goffi <goffi@goffi.org>
parents:
401
diff
changeset
|
376 # and now we open the widget linked to the intent |
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
|
377 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
|
378 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
|
379 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
|
380 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
|
381 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
|
382 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
|
383 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
|
384 |
9d3481663964
android: handle new SàT specific "action" dict which may be attach to an intent:
Goffi <goffi@goffi.org>
parents:
378
diff
changeset
|
385 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
|
386 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
|
387 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
|
388 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
|
389 # 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
|
390 # 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
|
391 data = {} |
89799148f894
core: use classes and factory to handle platform specific behaviours in a generic way
Goffi <goffi@goffi.org>
parents:
322
diff
changeset
|
392 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
|
393 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
|
394 data['text'] = text |
382
c7f1176cd2a9
android: handle Android specific content (wich `content:` scheme) in intent manager:
Goffi <goffi@goffi.org>
parents:
381
diff
changeset
|
395 |
342
89799148f894
core: use classes and factory to handle platform specific behaviours in a generic way
Goffi <goffi@goffi.org>
parents:
322
diff
changeset
|
396 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
|
397 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
|
398 uri = cast('android.net.Uri', item) |
382
c7f1176cd2a9
android: handle Android specific content (wich `content:` scheme) in intent manager:
Goffi <goffi@goffi.org>
parents:
381
diff
changeset
|
399 if uri.getScheme() == 'content': |
c7f1176cd2a9
android: handle Android specific content (wich `content:` scheme) in intent manager:
Goffi <goffi@goffi.org>
parents:
381
diff
changeset
|
400 # Android content, we'll dump it to a temporary file |
c7f1176cd2a9
android: handle Android specific content (wich `content:` scheme) in intent manager:
Goffi <goffi@goffi.org>
parents:
381
diff
changeset
|
401 filename = self.getFilenameFromUri(uri, intent_type) |
c7f1176cd2a9
android: handle Android specific content (wich `content:` scheme) in intent manager:
Goffi <goffi@goffi.org>
parents:
381
diff
changeset
|
402 filepath = self.tmp_dir / filename |
c7f1176cd2a9
android: handle Android specific content (wich `content:` scheme) in intent manager:
Goffi <goffi@goffi.org>
parents:
381
diff
changeset
|
403 input_stream = mActivity.getContentResolver().openInputStream(uri) |
c7f1176cd2a9
android: handle Android specific content (wich `content:` scheme) in intent manager:
Goffi <goffi@goffi.org>
parents:
381
diff
changeset
|
404 buff = bytearray(4096) |
c7f1176cd2a9
android: handle Android specific content (wich `content:` scheme) in intent manager:
Goffi <goffi@goffi.org>
parents:
381
diff
changeset
|
405 with open(filepath, 'wb') as f: |
c7f1176cd2a9
android: handle Android specific content (wich `content:` scheme) in intent manager:
Goffi <goffi@goffi.org>
parents:
381
diff
changeset
|
406 while True: |
c7f1176cd2a9
android: handle Android specific content (wich `content:` scheme) in intent manager:
Goffi <goffi@goffi.org>
parents:
381
diff
changeset
|
407 ret = input_stream.read(buff, 0, 4096) |
c7f1176cd2a9
android: handle Android specific content (wich `content:` scheme) in intent manager:
Goffi <goffi@goffi.org>
parents:
381
diff
changeset
|
408 if ret != -1: |
c7f1176cd2a9
android: handle Android specific content (wich `content:` scheme) in intent manager:
Goffi <goffi@goffi.org>
parents:
381
diff
changeset
|
409 f.write(buff[:ret]) |
c7f1176cd2a9
android: handle Android specific content (wich `content:` scheme) in intent manager:
Goffi <goffi@goffi.org>
parents:
381
diff
changeset
|
410 else: |
c7f1176cd2a9
android: handle Android specific content (wich `content:` scheme) in intent manager:
Goffi <goffi@goffi.org>
parents:
381
diff
changeset
|
411 break |
c7f1176cd2a9
android: handle Android specific content (wich `content:` scheme) in intent manager:
Goffi <goffi@goffi.org>
parents:
381
diff
changeset
|
412 input_stream.close() |
c7f1176cd2a9
android: handle Android specific content (wich `content:` scheme) in intent manager:
Goffi <goffi@goffi.org>
parents:
381
diff
changeset
|
413 data['path'] = path = str(filepath) |
c7f1176cd2a9
android: handle Android specific content (wich `content:` scheme) in intent manager:
Goffi <goffi@goffi.org>
parents:
381
diff
changeset
|
414 else: |
c7f1176cd2a9
android: handle Android specific content (wich `content:` scheme) in intent manager:
Goffi <goffi@goffi.org>
parents:
381
diff
changeset
|
415 data['uri'] = uri.toString() |
c7f1176cd2a9
android: handle Android specific content (wich `content:` scheme) in intent manager:
Goffi <goffi@goffi.org>
parents:
381
diff
changeset
|
416 path = self.getPathFromUri(uri) |
c7f1176cd2a9
android: handle Android specific content (wich `content:` scheme) in intent manager:
Goffi <goffi@goffi.org>
parents:
381
diff
changeset
|
417 if path is not None and path not in data: |
c7f1176cd2a9
android: handle Android specific content (wich `content:` scheme) in intent manager:
Goffi <goffi@goffi.org>
parents:
381
diff
changeset
|
418 data['path'] = path |
342
89799148f894
core: use classes and factory to handle platform specific behaviours in a generic way
Goffi <goffi@goffi.org>
parents:
322
diff
changeset
|
419 else: |
89799148f894
core: use classes and factory to handle platform specific behaviours in a generic way
Goffi <goffi@goffi.org>
parents:
322
diff
changeset
|
420 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
|
421 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
|
422 |
382
c7f1176cd2a9
android: handle Android specific content (wich `content:` scheme) in intent manager:
Goffi <goffi@goffi.org>
parents:
381
diff
changeset
|
423 |
342
89799148f894
core: use classes and factory to handle platform specific behaviours in a generic way
Goffi <goffi@goffi.org>
parents:
322
diff
changeset
|
424 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
|
425 else: |
89799148f894
core: use classes and factory to handle platform specific behaviours in a generic way
Goffi <goffi@goffi.org>
parents:
322
diff
changeset
|
426 text = None |
322
e2b51663d8b8
core, android: new share widget + added Cagou to "share" menu:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
427 uri = None |
e2b51663d8b8
core, android: new share widget + added Cagou to "share" menu:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
428 path = None |
e2b51663d8b8
core, android: new share widget + added Cagou to "share" menu:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
429 |
342
89799148f894
core: use classes and factory to handle platform specific behaviours in a generic way
Goffi <goffi@goffi.org>
parents:
322
diff
changeset
|
430 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
|
431 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
|
432 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
|
433 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
|
434 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
|
435 f"path: {path}") |
322
e2b51663d8b8
core, android: new share widget + added Cagou to "share" menu:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
436 |
342
89799148f894
core: use classes and factory to handle platform specific behaviours in a generic way
Goffi <goffi@goffi.org>
parents:
322
diff
changeset
|
437 log.debug(msg) |
345
a3cefa7158dc
android: open "geo:" URL using an Intent
Goffi <goffi@goffi.org>
parents:
342
diff
changeset
|
438 |
400
71f51198478c
android: handle runtime permissions:
Goffi <goffi@goffi.org>
parents:
398
diff
changeset
|
439 def check_plugin_permissions(self, plug_info, callback, errback): |
71f51198478c
android: handle runtime permissions:
Goffi <goffi@goffi.org>
parents:
398
diff
changeset
|
440 perms = plug_info.get("android_permissons") |
71f51198478c
android: handle runtime permissions:
Goffi <goffi@goffi.org>
parents:
398
diff
changeset
|
441 if not perms: |
71f51198478c
android: handle runtime permissions:
Goffi <goffi@goffi.org>
parents:
398
diff
changeset
|
442 callback() |
71f51198478c
android: handle runtime permissions:
Goffi <goffi@goffi.org>
parents:
398
diff
changeset
|
443 perms = [f"android.permission.{p}" if '.' not in p else p for p in perms] |
71f51198478c
android: handle runtime permissions:
Goffi <goffi@goffi.org>
parents:
398
diff
changeset
|
444 |
71f51198478c
android: handle runtime permissions:
Goffi <goffi@goffi.org>
parents:
398
diff
changeset
|
445 def request_permissions_cb(permissions, granted): |
71f51198478c
android: handle runtime permissions:
Goffi <goffi@goffi.org>
parents:
398
diff
changeset
|
446 if all(granted): |
71f51198478c
android: handle runtime permissions:
Goffi <goffi@goffi.org>
parents:
398
diff
changeset
|
447 Clock.schedule_once(lambda *args: callback()) |
71f51198478c
android: handle runtime permissions:
Goffi <goffi@goffi.org>
parents:
398
diff
changeset
|
448 else: |
71f51198478c
android: handle runtime permissions:
Goffi <goffi@goffi.org>
parents:
398
diff
changeset
|
449 Clock.schedule_once(lambda *args: errback()) |
71f51198478c
android: handle runtime permissions:
Goffi <goffi@goffi.org>
parents:
398
diff
changeset
|
450 |
71f51198478c
android: handle runtime permissions:
Goffi <goffi@goffi.org>
parents:
398
diff
changeset
|
451 request_permissions(perms, callback=request_permissions_cb) |
71f51198478c
android: handle runtime permissions:
Goffi <goffi@goffi.org>
parents:
398
diff
changeset
|
452 |
345
a3cefa7158dc
android: open "geo:" URL using an Intent
Goffi <goffi@goffi.org>
parents:
342
diff
changeset
|
453 def open_url(self, url, wid=None): |
a3cefa7158dc
android: open "geo:" URL using an Intent
Goffi <goffi@goffi.org>
parents:
342
diff
changeset
|
454 parsed_url = urlparse(url) |
a3cefa7158dc
android: open "geo:" URL using an Intent
Goffi <goffi@goffi.org>
parents:
342
diff
changeset
|
455 if parsed_url.scheme == "geo": |
a3cefa7158dc
android: open "geo:" URL using an Intent
Goffi <goffi@goffi.org>
parents:
342
diff
changeset
|
456 intent = Intent(Intent.ACTION_VIEW) |
a3cefa7158dc
android: open "geo:" URL using an Intent
Goffi <goffi@goffi.org>
parents:
342
diff
changeset
|
457 intent.setData(Uri.parse(url)) |
a3cefa7158dc
android: open "geo:" URL using an Intent
Goffi <goffi@goffi.org>
parents:
342
diff
changeset
|
458 if mActivity.getPackageManager() is not None: |
a3cefa7158dc
android: open "geo:" URL using an Intent
Goffi <goffi@goffi.org>
parents:
342
diff
changeset
|
459 activity = cast('android.app.Activity', mActivity) |
a3cefa7158dc
android: open "geo:" URL using an Intent
Goffi <goffi@goffi.org>
parents:
342
diff
changeset
|
460 activity.startActivity(intent) |
a3cefa7158dc
android: open "geo:" URL using an Intent
Goffi <goffi@goffi.org>
parents:
342
diff
changeset
|
461 else: |
a3cefa7158dc
android: open "geo:" URL using an Intent
Goffi <goffi@goffi.org>
parents:
342
diff
changeset
|
462 super().open_url(self, url, wid) |