Mercurial > libervia-desktop-kivy
annotate cagou/core/platform_/base.py @ 448:20a807443c3f
chat: resize attachments (images only for now):
if attachments to send contain oversized image, a checkbox will be shown (activated by
default) to reduce automatically the size.
The background color now cover the whole attachments to send widget.
If not already specified, media type is guessed from filename when adding an attachment.
author | Goffi <goffi@goffi.org> |
---|---|
date | Sun, 22 Mar 2020 14:10:59 +0100 |
parents | ddca5a837029 |
children | 2cfb9f7a6b62 |
rev | line source |
---|---|
342
89799148f894
core: use classes and factory to handle platform specific behaviours in a generic way
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
1 #!/usr/bin/env python3 |
89799148f894
core: use classes and factory to handle platform specific behaviours in a generic way
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
2 |
89799148f894
core: use classes and factory to handle platform specific behaviours in a generic way
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) |
342
89799148f894
core: use classes and factory to handle platform specific behaviours in a generic way
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
5 |
89799148f894
core: use classes and factory to handle platform specific behaviours in a generic way
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
6 # This program is free software: you can redistribute it and/or modify |
89799148f894
core: use classes and factory to handle platform specific behaviours in a generic way
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
7 # it under the terms of the GNU Affero General Public License as published by |
89799148f894
core: use classes and factory to handle platform specific behaviours in a generic way
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
8 # the Free Software Foundation, either version 3 of the License, or |
89799148f894
core: use classes and factory to handle platform specific behaviours in a generic way
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
9 # (at your option) any later version. |
89799148f894
core: use classes and factory to handle platform specific behaviours in a generic way
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
10 |
89799148f894
core: use classes and factory to handle platform specific behaviours in a generic way
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
11 # This program is distributed in the hope that it will be useful, |
89799148f894
core: use classes and factory to handle platform specific behaviours in a generic way
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
12 # but WITHOUT ANY WARRANTY; without even the implied warranty of |
89799148f894
core: use classes and factory to handle platform specific behaviours in a generic way
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
13 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
89799148f894
core: use classes and factory to handle platform specific behaviours in a generic way
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
14 # GNU Affero General Public License for more details. |
89799148f894
core: use classes and factory to handle platform specific behaviours in a generic way
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
15 |
89799148f894
core: use classes and factory to handle platform specific behaviours in a generic way
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
16 # You should have received a copy of the GNU Affero General Public License |
89799148f894
core: use classes and factory to handle platform specific behaviours in a generic way
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
17 # along with this program. If not, see <http://www.gnu.org/licenses/>. |
89799148f894
core: use classes and factory to handle platform specific behaviours in a generic way
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
18 |
408
355326a3501c
platform (base): added a menu item to create a new window
Goffi <goffi@goffi.org>
parents:
400
diff
changeset
|
19 import sys |
344
83697218b9b2
core: handle URLs opening in a per-platform way:
Goffi <goffi@goffi.org>
parents:
342
diff
changeset
|
20 import webbrowser |
408
355326a3501c
platform (base): added a menu item to create a new window
Goffi <goffi@goffi.org>
parents:
400
diff
changeset
|
21 import subprocess |
421
ddca5a837029
platform (base): use "xdg-open" when available + use new host.downloadURL
Goffi <goffi@goffi.org>
parents:
413
diff
changeset
|
22 import shutil |
ddca5a837029
platform (base): use "xdg-open" when available + use new host.downloadURL
Goffi <goffi@goffi.org>
parents:
413
diff
changeset
|
23 from urllib import parse |
342
89799148f894
core: use classes and factory to handle platform specific behaviours in a generic way
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
24 from kivy.config import Config as KivyConfig |
408
355326a3501c
platform (base): added a menu item to create a new window
Goffi <goffi@goffi.org>
parents:
400
diff
changeset
|
25 from sat.core.i18n import _ |
344
83697218b9b2
core: handle URLs opening in a per-platform way:
Goffi <goffi@goffi.org>
parents:
342
diff
changeset
|
26 from sat.core.log import getLogger |
421
ddca5a837029
platform (base): use "xdg-open" when available + use new host.downloadURL
Goffi <goffi@goffi.org>
parents:
413
diff
changeset
|
27 from sat.core import exceptions |
344
83697218b9b2
core: handle URLs opening in a per-platform way:
Goffi <goffi@goffi.org>
parents:
342
diff
changeset
|
28 from sat_frontends.quick_frontend.quick_widgets import QuickWidget |
83697218b9b2
core: handle URLs opening in a per-platform way:
Goffi <goffi@goffi.org>
parents:
342
diff
changeset
|
29 from cagou import G |
83697218b9b2
core: handle URLs opening in a per-platform way:
Goffi <goffi@goffi.org>
parents:
342
diff
changeset
|
30 |
83697218b9b2
core: handle URLs opening in a per-platform way:
Goffi <goffi@goffi.org>
parents:
342
diff
changeset
|
31 |
83697218b9b2
core: handle URLs opening in a per-platform way:
Goffi <goffi@goffi.org>
parents:
342
diff
changeset
|
32 log = getLogger(__name__) |
342
89799148f894
core: use classes and factory to handle platform specific behaviours in a generic way
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
33 |
89799148f894
core: use classes and factory to handle platform specific behaviours in a generic way
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
34 |
89799148f894
core: use classes and factory to handle platform specific behaviours in a generic way
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
35 class Platform: |
89799148f894
core: use classes and factory to handle platform specific behaviours in a generic way
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
36 """Base class to handle platform specific behaviours""" |
413
c466678c57b2
chat: control send button visibility in core.platform_, and show it when there are attachments
Goffi <goffi@goffi.org>
parents:
408
diff
changeset
|
37 # set to True to always show the send button in chat |
c466678c57b2
chat: control send button visibility in core.platform_, and show it when there are attachments
Goffi <goffi@goffi.org>
parents:
408
diff
changeset
|
38 send_button_visible = False |
342
89799148f894
core: use classes and factory to handle platform specific behaviours in a generic way
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
39 |
89799148f894
core: use classes and factory to handle platform specific behaviours in a generic way
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
40 def init_platform(self): |
89799148f894
core: use classes and factory to handle platform specific behaviours in a generic way
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
41 # we don't want multi-touch emulation with mouse |
89799148f894
core: use classes and factory to handle platform specific behaviours in a generic way
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
42 |
357
4d3a0c4f2430
core: better back key (ESC) management:
Goffi <goffi@goffi.org>
parents:
344
diff
changeset
|
43 # this option doesn't make sense on Android and cause troubles, so we only |
4d3a0c4f2430
core: better back key (ESC) management:
Goffi <goffi@goffi.org>
parents:
344
diff
changeset
|
44 # activate it for other platforms (cf. https://github.com/kivy/kivy/issues/6229) |
342
89799148f894
core: use classes and factory to handle platform specific behaviours in a generic way
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
45 KivyConfig.set('input', 'mouse', 'mouse,disable_multitouch') |
89799148f894
core: use classes and factory to handle platform specific behaviours in a generic way
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
46 |
421
ddca5a837029
platform (base): use "xdg-open" when available + use new host.downloadURL
Goffi <goffi@goffi.org>
parents:
413
diff
changeset
|
47 def on_app_build(self, Wid): |
342
89799148f894
core: use classes and factory to handle platform specific behaviours in a generic way
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
48 pass |
89799148f894
core: use classes and factory to handle platform specific behaviours in a generic way
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
49 |
89799148f894
core: use classes and factory to handle platform specific behaviours in a generic way
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
50 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:
diff
changeset
|
51 pass |
89799148f894
core: use classes and factory to handle platform specific behaviours in a generic way
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
52 |
89799148f894
core: use classes and factory to handle platform specific behaviours in a generic way
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
53 def on_initFrontendState(self): |
89799148f894
core: use classes and factory to handle platform specific behaviours in a generic way
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
54 pass |
89799148f894
core: use classes and factory to handle platform specific behaviours in a generic way
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
55 |
370
1a12bbd80943
android: autoconnect profile using the new `profileAutoconnectGet` backend method:
Goffi <goffi@goffi.org>
parents:
357
diff
changeset
|
56 def do_postInit(self): |
1a12bbd80943
android: autoconnect profile using the new `profileAutoconnectGet` backend method:
Goffi <goffi@goffi.org>
parents:
357
diff
changeset
|
57 return True |
1a12bbd80943
android: autoconnect profile using the new `profileAutoconnectGet` backend method:
Goffi <goffi@goffi.org>
parents:
357
diff
changeset
|
58 |
342
89799148f894
core: use classes and factory to handle platform specific behaviours in a generic way
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
59 def on_pause(self): |
89799148f894
core: use classes and factory to handle platform specific behaviours in a generic way
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
60 pass |
89799148f894
core: use classes and factory to handle platform specific behaviours in a generic way
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
61 |
89799148f894
core: use classes and factory to handle platform specific behaviours in a generic way
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
62 def on_resume(self): |
89799148f894
core: use classes and factory to handle platform specific behaviours in a generic way
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
63 pass |
89799148f894
core: use classes and factory to handle platform specific behaviours in a generic way
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
64 |
89799148f894
core: use classes and factory to handle platform specific behaviours in a generic way
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
65 def on_stop(self): |
89799148f894
core: use classes and factory to handle platform specific behaviours in a generic way
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
66 pass |
344
83697218b9b2
core: handle URLs opening in a per-platform way:
Goffi <goffi@goffi.org>
parents:
342
diff
changeset
|
67 |
357
4d3a0c4f2430
core: better back key (ESC) management:
Goffi <goffi@goffi.org>
parents:
344
diff
changeset
|
68 def on_key_back_root(self): |
4d3a0c4f2430
core: better back key (ESC) management:
Goffi <goffi@goffi.org>
parents:
344
diff
changeset
|
69 """Back key is called while being on root widget""" |
4d3a0c4f2430
core: better back key (ESC) management:
Goffi <goffi@goffi.org>
parents:
344
diff
changeset
|
70 return True |
4d3a0c4f2430
core: better back key (ESC) management:
Goffi <goffi@goffi.org>
parents:
344
diff
changeset
|
71 |
4d3a0c4f2430
core: better back key (ESC) management:
Goffi <goffi@goffi.org>
parents:
344
diff
changeset
|
72 def on_key_back_share(self, share_widget): |
4d3a0c4f2430
core: better back key (ESC) management:
Goffi <goffi@goffi.org>
parents:
344
diff
changeset
|
73 """Back key is called while being on share widget""" |
4d3a0c4f2430
core: better back key (ESC) management:
Goffi <goffi@goffi.org>
parents:
344
diff
changeset
|
74 share_widget.close() |
4d3a0c4f2430
core: better back key (ESC) management:
Goffi <goffi@goffi.org>
parents:
344
diff
changeset
|
75 return True |
4d3a0c4f2430
core: better back key (ESC) management:
Goffi <goffi@goffi.org>
parents:
344
diff
changeset
|
76 |
408
355326a3501c
platform (base): added a menu item to create a new window
Goffi <goffi@goffi.org>
parents:
400
diff
changeset
|
77 def _on_new_window(self): |
355326a3501c
platform (base): added a menu item to create a new window
Goffi <goffi@goffi.org>
parents:
400
diff
changeset
|
78 """Launch a new instance of Cagou to have an extra window""" |
355326a3501c
platform (base): added a menu item to create a new window
Goffi <goffi@goffi.org>
parents:
400
diff
changeset
|
79 subprocess.Popen(sys.argv) |
355326a3501c
platform (base): added a menu item to create a new window
Goffi <goffi@goffi.org>
parents:
400
diff
changeset
|
80 |
376 | 81 def on_extra_menu_init(self, extra_menu): |
408
355326a3501c
platform (base): added a menu item to create a new window
Goffi <goffi@goffi.org>
parents:
400
diff
changeset
|
82 extra_menu.addItem(_('new window'), self._on_new_window) |
376 | 83 |
372
1481f09c9175
settings (android): don't expose autoconnect parameters:
Goffi <goffi@goffi.org>
parents:
370
diff
changeset
|
84 def updateParamsExtra(self, extra): |
1481f09c9175
settings (android): don't expose autoconnect parameters:
Goffi <goffi@goffi.org>
parents:
370
diff
changeset
|
85 pass |
1481f09c9175
settings (android): don't expose autoconnect parameters:
Goffi <goffi@goffi.org>
parents:
370
diff
changeset
|
86 |
400
71f51198478c
android: handle runtime permissions:
Goffi <goffi@goffi.org>
parents:
378
diff
changeset
|
87 def check_plugin_permissions(self, plug_info, callback, errback): |
71f51198478c
android: handle runtime permissions:
Goffi <goffi@goffi.org>
parents:
378
diff
changeset
|
88 """Check that plugin permissions for this platform are granted""" |
71f51198478c
android: handle runtime permissions:
Goffi <goffi@goffi.org>
parents:
378
diff
changeset
|
89 callback() |
71f51198478c
android: handle runtime permissions:
Goffi <goffi@goffi.org>
parents:
378
diff
changeset
|
90 |
421
ddca5a837029
platform (base): use "xdg-open" when available + use new host.downloadURL
Goffi <goffi@goffi.org>
parents:
413
diff
changeset
|
91 def _open(self, path): |
ddca5a837029
platform (base): use "xdg-open" when available + use new host.downloadURL
Goffi <goffi@goffi.org>
parents:
413
diff
changeset
|
92 """Open url or path with appropriate application if possible""" |
ddca5a837029
platform (base): use "xdg-open" when available + use new host.downloadURL
Goffi <goffi@goffi.org>
parents:
413
diff
changeset
|
93 try: |
ddca5a837029
platform (base): use "xdg-open" when available + use new host.downloadURL
Goffi <goffi@goffi.org>
parents:
413
diff
changeset
|
94 opener = self._opener |
ddca5a837029
platform (base): use "xdg-open" when available + use new host.downloadURL
Goffi <goffi@goffi.org>
parents:
413
diff
changeset
|
95 except AttributeError: |
ddca5a837029
platform (base): use "xdg-open" when available + use new host.downloadURL
Goffi <goffi@goffi.org>
parents:
413
diff
changeset
|
96 xdg_open_path = shutil.which("xdg-open") |
ddca5a837029
platform (base): use "xdg-open" when available + use new host.downloadURL
Goffi <goffi@goffi.org>
parents:
413
diff
changeset
|
97 if xdg_open_path is not None: |
ddca5a837029
platform (base): use "xdg-open" when available + use new host.downloadURL
Goffi <goffi@goffi.org>
parents:
413
diff
changeset
|
98 log.debug("xdg-open found, it will be used to open files") |
ddca5a837029
platform (base): use "xdg-open" when available + use new host.downloadURL
Goffi <goffi@goffi.org>
parents:
413
diff
changeset
|
99 opener = lambda path: subprocess.Popen([xdg_open_path, path]) |
ddca5a837029
platform (base): use "xdg-open" when available + use new host.downloadURL
Goffi <goffi@goffi.org>
parents:
413
diff
changeset
|
100 else: |
ddca5a837029
platform (base): use "xdg-open" when available + use new host.downloadURL
Goffi <goffi@goffi.org>
parents:
413
diff
changeset
|
101 log.debug("files will be opened with webbrower.open") |
ddca5a837029
platform (base): use "xdg-open" when available + use new host.downloadURL
Goffi <goffi@goffi.org>
parents:
413
diff
changeset
|
102 opener = webbrowser.open |
ddca5a837029
platform (base): use "xdg-open" when available + use new host.downloadURL
Goffi <goffi@goffi.org>
parents:
413
diff
changeset
|
103 self._opener = opener |
ddca5a837029
platform (base): use "xdg-open" when available + use new host.downloadURL
Goffi <goffi@goffi.org>
parents:
413
diff
changeset
|
104 |
ddca5a837029
platform (base): use "xdg-open" when available + use new host.downloadURL
Goffi <goffi@goffi.org>
parents:
413
diff
changeset
|
105 opener(path) |
ddca5a837029
platform (base): use "xdg-open" when available + use new host.downloadURL
Goffi <goffi@goffi.org>
parents:
413
diff
changeset
|
106 |
ddca5a837029
platform (base): use "xdg-open" when available + use new host.downloadURL
Goffi <goffi@goffi.org>
parents:
413
diff
changeset
|
107 |
344
83697218b9b2
core: handle URLs opening in a per-platform way:
Goffi <goffi@goffi.org>
parents:
342
diff
changeset
|
108 def open_url(self, url, wid=None): |
83697218b9b2
core: handle URLs opening in a per-platform way:
Goffi <goffi@goffi.org>
parents:
342
diff
changeset
|
109 """Open an URL in the way appropriate for the platform |
83697218b9b2
core: handle URLs opening in a per-platform way:
Goffi <goffi@goffi.org>
parents:
342
diff
changeset
|
110 |
83697218b9b2
core: handle URLs opening in a per-platform way:
Goffi <goffi@goffi.org>
parents:
342
diff
changeset
|
111 @param url(str): URL to open |
83697218b9b2
core: handle URLs opening in a per-platform way:
Goffi <goffi@goffi.org>
parents:
342
diff
changeset
|
112 @param wid(CagouWidget, None): widget requesting the opening |
83697218b9b2
core: handle URLs opening in a per-platform way:
Goffi <goffi@goffi.org>
parents:
342
diff
changeset
|
113 it may influence the way the URL is opened |
83697218b9b2
core: handle URLs opening in a per-platform way:
Goffi <goffi@goffi.org>
parents:
342
diff
changeset
|
114 """ |
421
ddca5a837029
platform (base): use "xdg-open" when available + use new host.downloadURL
Goffi <goffi@goffi.org>
parents:
413
diff
changeset
|
115 parsed_url = parse.urlparse(url) |
344
83697218b9b2
core: handle URLs opening in a per-platform way:
Goffi <goffi@goffi.org>
parents:
342
diff
changeset
|
116 if parsed_url.scheme == "aesgcm" and wid is not None: |
83697218b9b2
core: handle URLs opening in a per-platform way:
Goffi <goffi@goffi.org>
parents:
342
diff
changeset
|
117 # aesgcm files need to be decrypted first |
83697218b9b2
core: handle URLs opening in a per-platform way:
Goffi <goffi@goffi.org>
parents:
342
diff
changeset
|
118 # so we download them before opening |
83697218b9b2
core: handle URLs opening in a per-platform way:
Goffi <goffi@goffi.org>
parents:
342
diff
changeset
|
119 quick_widget = G.host.getAncestorWidget(wid, QuickWidget) |
83697218b9b2
core: handle URLs opening in a per-platform way:
Goffi <goffi@goffi.org>
parents:
342
diff
changeset
|
120 if quick_widget is None: |
421
ddca5a837029
platform (base): use "xdg-open" when available + use new host.downloadURL
Goffi <goffi@goffi.org>
parents:
413
diff
changeset
|
121 msg = f"Can't find ancestor QuickWidget of {wid}" |
ddca5a837029
platform (base): use "xdg-open" when available + use new host.downloadURL
Goffi <goffi@goffi.org>
parents:
413
diff
changeset
|
122 log.error(msg) |
ddca5a837029
platform (base): use "xdg-open" when available + use new host.downloadURL
Goffi <goffi@goffi.org>
parents:
413
diff
changeset
|
123 G.host.errback(exceptions.InternalError(msg)) |
344
83697218b9b2
core: handle URLs opening in a per-platform way:
Goffi <goffi@goffi.org>
parents:
342
diff
changeset
|
124 return |
421
ddca5a837029
platform (base): use "xdg-open" when available + use new host.downloadURL
Goffi <goffi@goffi.org>
parents:
413
diff
changeset
|
125 G.host.downloadURL( |
ddca5a837029
platform (base): use "xdg-open" when available + use new host.downloadURL
Goffi <goffi@goffi.org>
parents:
413
diff
changeset
|
126 parsed_url, self._open, G.host.errback, profile=quick_widget.profile |
344
83697218b9b2
core: handle URLs opening in a per-platform way:
Goffi <goffi@goffi.org>
parents:
342
diff
changeset
|
127 ) |
83697218b9b2
core: handle URLs opening in a per-platform way:
Goffi <goffi@goffi.org>
parents:
342
diff
changeset
|
128 else: |
421
ddca5a837029
platform (base): use "xdg-open" when available + use new host.downloadURL
Goffi <goffi@goffi.org>
parents:
413
diff
changeset
|
129 self._open(url) |