annotate cagou/core/platform_/android.py @ 378:4d660b252487

dates update
author Goffi <goffi@goffi.org>
date Wed, 29 Jan 2020 09:52:46 +0100
parents b2a87239af25
children 9d3481663964
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
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
4d660b252487 dates update
Goffi <goffi@goffi.org>
parents: 377
diff changeset
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
377
b2a87239af25 android: platform specific menu to disconnect profile:
Goffi <goffi@goffi.org>
parents: 373
diff changeset
22 from functools import partial
322
e2b51663d8b8 core, android: new share widget + added Cagou to "share" menu:
Goffi <goffi@goffi.org>
parents:
diff changeset
23 from jnius import autoclass, cast
e2b51663d8b8 core, android: new share widget + added Cagou to "share" menu:
Goffi <goffi@goffi.org>
parents:
diff changeset
24 from android import activity
377
b2a87239af25 android: platform specific menu to disconnect profile:
Goffi <goffi@goffi.org>
parents: 373
diff changeset
25 from sat.core.i18n import _
322
e2b51663d8b8 core, android: new share widget + added Cagou to "share" menu:
Goffi <goffi@goffi.org>
parents:
diff changeset
26 from sat.core import log as logging
345
a3cefa7158dc android: open "geo:" URL using an Intent
Goffi <goffi@goffi.org>
parents: 342
diff changeset
27 from urllib.parse import urlparse
322
e2b51663d8b8 core, android: new share widget + added Cagou to "share" menu:
Goffi <goffi@goffi.org>
parents:
diff changeset
28 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
29 from cagou.core import dialog
322
e2b51663d8b8 core, android: new share widget + added Cagou to "share" menu:
Goffi <goffi@goffi.org>
parents:
diff changeset
30 from cagou import G
e2b51663d8b8 core, android: new share widget + added Cagou to "share" menu:
Goffi <goffi@goffi.org>
parents:
diff changeset
31 from kivy.clock import Clock
342
89799148f894 core: use classes and factory to handle platform specific behaviours in a generic way
Goffi <goffi@goffi.org>
parents: 322
diff changeset
32 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
33
e2b51663d8b8 core, android: new share widget + added Cagou to "share" menu:
Goffi <goffi@goffi.org>
parents:
diff changeset
34
e2b51663d8b8 core, android: new share widget + added Cagou to "share" menu:
Goffi <goffi@goffi.org>
parents:
diff changeset
35 log = logging.getLogger(__name__)
e2b51663d8b8 core, android: new share widget + added Cagou to "share" menu:
Goffi <goffi@goffi.org>
parents:
diff changeset
36
e2b51663d8b8 core, android: new share widget + added Cagou to "share" menu:
Goffi <goffi@goffi.org>
parents:
diff changeset
37 service = autoclass('org.salutatoi.cagou.ServiceBackend')
357
4d3a0c4f2430 core: better back key (ESC) management:
Goffi <goffi@goffi.org>
parents: 345
diff changeset
38 PythonActivity = autoclass('org.kivy.android.PythonActivity')
4d3a0c4f2430 core: better back key (ESC) management:
Goffi <goffi@goffi.org>
parents: 345
diff changeset
39 mActivity = PythonActivity.mActivity
345
a3cefa7158dc android: open "geo:" URL using an Intent
Goffi <goffi@goffi.org>
parents: 342
diff changeset
40 Intent = autoclass('android.content.Intent')
a3cefa7158dc android: open "geo:" URL using an Intent
Goffi <goffi@goffi.org>
parents: 342
diff changeset
41 AndroidString = autoclass('java.lang.String')
a3cefa7158dc android: open "geo:" URL using an Intent
Goffi <goffi@goffi.org>
parents: 342
diff changeset
42 Uri = autoclass('android.net.Uri')
322
e2b51663d8b8 core, android: new share widget + added Cagou to "share" menu:
Goffi <goffi@goffi.org>
parents:
diff changeset
43 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
44 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
45 VideoMedia = autoclass('android.provider.MediaStore$Video$Media')
345
a3cefa7158dc android: open "geo:" URL using an Intent
Goffi <goffi@goffi.org>
parents: 342
diff changeset
46
322
e2b51663d8b8 core, android: new share widget + added Cagou to "share" menu:
Goffi <goffi@goffi.org>
parents:
diff changeset
47 DATA = '_data'
e2b51663d8b8 core, android: new share widget + added Cagou to "share" menu:
Goffi <goffi@goffi.org>
parents:
diff changeset
48
e2b51663d8b8 core, android: new share widget + added Cagou to "share" menu:
Goffi <goffi@goffi.org>
parents:
diff changeset
49
e2b51663d8b8 core, android: new share widget + added Cagou to "share" menu:
Goffi <goffi@goffi.org>
parents:
diff changeset
50 STATE_RUNNING = b"running"
e2b51663d8b8 core, android: new share widget + added Cagou to "share" menu:
Goffi <goffi@goffi.org>
parents:
diff changeset
51 STATE_PAUSED = b"paused"
e2b51663d8b8 core, android: new share widget + added Cagou to "share" menu:
Goffi <goffi@goffi.org>
parents:
diff changeset
52 STATE_STOPPED = b"stopped"
e2b51663d8b8 core, android: new share widget + added Cagou to "share" menu:
Goffi <goffi@goffi.org>
parents:
diff changeset
53 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
54 SOCKET_FILE = ".socket"
e2b51663d8b8 core, android: new share widget + added Cagou to "share" menu:
Goffi <goffi@goffi.org>
parents:
diff changeset
55
342
89799148f894 core: use classes and factory to handle platform specific behaviours in a generic way
Goffi <goffi@goffi.org>
parents: 322
diff changeset
56
89799148f894 core: use classes and factory to handle platform specific behaviours in a generic way
Goffi <goffi@goffi.org>
parents: 322
diff changeset
57 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
58
89799148f894 core: use classes and factory to handle platform specific behaviours in a generic way
Goffi <goffi@goffi.org>
parents: 322
diff changeset
59 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
60 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
61 # 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
62 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
63
89799148f894 core: use classes and factory to handle platform specific behaviours in a generic way
Goffi <goffi@goffi.org>
parents: 322
diff changeset
64 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
65 # 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
66 # 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
67 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
68 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
69
89799148f894 core: use classes and factory to handle platform specific behaviours in a generic way
Goffi <goffi@goffi.org>
parents: 322
diff changeset
70 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
71 argument = ''
89799148f894 core: use classes and factory to handle platform specific behaviours in a generic way
Goffi <goffi@goffi.org>
parents: 322
diff changeset
72 service.start(mActivity, argument)
322
e2b51663d8b8 core, android: new share widget + added Cagou to "share" menu:
Goffi <goffi@goffi.org>
parents:
diff changeset
73
342
89799148f894 core: use classes and factory to handle platform specific behaviours in a generic way
Goffi <goffi@goffi.org>
parents: 322
diff changeset
74 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
75 self.cache.append((self.on_new_intent, mActivity.getIntent()))
89799148f894 core: use classes and factory to handle platform specific behaviours in a generic way
Goffi <goffi@goffi.org>
parents: 322
diff changeset
76 host.addListener('profilePlugged', self.onProfilePlugged)
89799148f894 core: use classes and factory to handle platform specific behaviours in a generic way
Goffi <goffi@goffi.org>
parents: 322
diff changeset
77
89799148f894 core: use classes and factory to handle platform specific behaviours in a generic way
Goffi <goffi@goffi.org>
parents: 322
diff changeset
78 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
79 # 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
80 # 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
81 # 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
82 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
83 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
84 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
85 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
86
370
1a12bbd80943 android: autoconnect profile using the new `profileAutoconnectGet` backend method:
Goffi <goffi@goffi.org>
parents: 357
diff changeset
87 def profileAutoconnectGetCb(self, profile=None):
1a12bbd80943 android: autoconnect profile using the new `profileAutoconnectGet` backend method:
Goffi <goffi@goffi.org>
parents: 357
diff changeset
88 if profile is not None:
1a12bbd80943 android: autoconnect profile using the new `profileAutoconnectGet` backend method:
Goffi <goffi@goffi.org>
parents: 357
diff changeset
89 G.host.options.profile = profile
1a12bbd80943 android: autoconnect profile using the new `profileAutoconnectGet` backend method:
Goffi <goffi@goffi.org>
parents: 357
diff changeset
90 G.host.postInit()
1a12bbd80943 android: autoconnect profile using the new `profileAutoconnectGet` backend method:
Goffi <goffi@goffi.org>
parents: 357
diff changeset
91
1a12bbd80943 android: autoconnect profile using the new `profileAutoconnectGet` backend method:
Goffi <goffi@goffi.org>
parents: 357
diff changeset
92 def profileAutoconnectGetEb(self, failure_):
1a12bbd80943 android: autoconnect profile using the new `profileAutoconnectGet` backend method:
Goffi <goffi@goffi.org>
parents: 357
diff changeset
93 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
94 G.host.postInit()
1a12bbd80943 android: autoconnect profile using the new `profileAutoconnectGet` backend method:
Goffi <goffi@goffi.org>
parents: 357
diff changeset
95
1a12bbd80943 android: autoconnect profile using the new `profileAutoconnectGet` backend method:
Goffi <goffi@goffi.org>
parents: 357
diff changeset
96 def do_postInit(self):
1a12bbd80943 android: autoconnect profile using the new `profileAutoconnectGet` backend method:
Goffi <goffi@goffi.org>
parents: 357
diff changeset
97 G.host.bridge.profileAutoconnectGet(
1a12bbd80943 android: autoconnect profile using the new `profileAutoconnectGet` backend method:
Goffi <goffi@goffi.org>
parents: 357
diff changeset
98 callback=self.profileAutoconnectGetCb,
1a12bbd80943 android: autoconnect profile using the new `profileAutoconnectGet` backend method:
Goffi <goffi@goffi.org>
parents: 357
diff changeset
99 errback=self.profileAutoconnectGetEb
1a12bbd80943 android: autoconnect profile using the new `profileAutoconnectGet` backend method:
Goffi <goffi@goffi.org>
parents: 357
diff changeset
100 )
1a12bbd80943 android: autoconnect profile using the new `profileAutoconnectGet` backend method:
Goffi <goffi@goffi.org>
parents: 357
diff changeset
101 return False
1a12bbd80943 android: autoconnect profile using the new `profileAutoconnectGet` backend method:
Goffi <goffi@goffi.org>
parents: 357
diff changeset
102
342
89799148f894 core: use classes and factory to handle platform specific behaviours in a generic way
Goffi <goffi@goffi.org>
parents: 322
diff changeset
103 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
104 log.debug("ANDROID profilePlugged")
370
1a12bbd80943 android: autoconnect profile using the new `profileAutoconnectGet` backend method:
Goffi <goffi@goffi.org>
parents: 357
diff changeset
105 G.host.bridge.setParam(
1a12bbd80943 android: autoconnect profile using the new `profileAutoconnectGet` backend method:
Goffi <goffi@goffi.org>
parents: 357
diff changeset
106 "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
107 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
108 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
109 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
110 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
111 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
112 G.host.removeListener("profilePlugged", self.onProfilePlugged)
89799148f894 core: use classes and factory to handle platform specific behaviours in a generic way
Goffi <goffi@goffi.org>
parents: 322
diff changeset
113
89799148f894 core: use classes and factory to handle platform specific behaviours in a generic way
Goffi <goffi@goffi.org>
parents: 322
diff changeset
114 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
115 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
116 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
117 return True
322
e2b51663d8b8 core, android: new share widget + added Cagou to "share" menu:
Goffi <goffi@goffi.org>
parents:
diff changeset
118
342
89799148f894 core: use classes and factory to handle platform specific behaviours in a generic way
Goffi <goffi@goffi.org>
parents: 322
diff changeset
119 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
120 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
121 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
122
89799148f894 core: use classes and factory to handle platform specific behaviours in a generic way
Goffi <goffi@goffi.org>
parents: 322
diff changeset
123 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
124 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
125 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
126
357
4d3a0c4f2430 core: better back key (ESC) management:
Goffi <goffi@goffi.org>
parents: 345
diff changeset
127 def on_key_back_root(self):
4d3a0c4f2430 core: better back key (ESC) management:
Goffi <goffi@goffi.org>
parents: 345
diff changeset
128 PythonActivity.moveTaskToBack(True)
4d3a0c4f2430 core: better back key (ESC) management:
Goffi <goffi@goffi.org>
parents: 345
diff changeset
129 return True
4d3a0c4f2430 core: better back key (ESC) management:
Goffi <goffi@goffi.org>
parents: 345
diff changeset
130
4d3a0c4f2430 core: better back key (ESC) management:
Goffi <goffi@goffi.org>
parents: 345
diff changeset
131 def on_key_back_share(self, share_widget):
4d3a0c4f2430 core: better back key (ESC) management:
Goffi <goffi@goffi.org>
parents: 345
diff changeset
132 share_widget.close()
4d3a0c4f2430 core: better back key (ESC) management:
Goffi <goffi@goffi.org>
parents: 345
diff changeset
133 PythonActivity.moveTaskToBack(True)
4d3a0c4f2430 core: better back key (ESC) management:
Goffi <goffi@goffi.org>
parents: 345
diff changeset
134 return True
4d3a0c4f2430 core: better back key (ESC) management:
Goffi <goffi@goffi.org>
parents: 345
diff changeset
135
377
b2a87239af25 android: platform specific menu to disconnect profile:
Goffi <goffi@goffi.org>
parents: 373
diff changeset
136 def _disconnect(self, profile):
b2a87239af25 android: platform specific menu to disconnect profile:
Goffi <goffi@goffi.org>
parents: 373
diff changeset
137 G.host.bridge.setParam(
b2a87239af25 android: platform specific menu to disconnect profile:
Goffi <goffi@goffi.org>
parents: 373
diff changeset
138 "autoconnect_backend", C.BOOL_FALSE, "Connection", -1, profile,
b2a87239af25 android: platform specific menu to disconnect profile:
Goffi <goffi@goffi.org>
parents: 373
diff changeset
139 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
140 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
141 G.host.profiles.unplug(profile)
b2a87239af25 android: platform specific menu to disconnect profile:
Goffi <goffi@goffi.org>
parents: 373
diff changeset
142 G.host.bridge.disconnect(profile)
b2a87239af25 android: platform specific menu to disconnect profile:
Goffi <goffi@goffi.org>
parents: 373
diff changeset
143 G.host.app.showProfileManager()
b2a87239af25 android: platform specific menu to disconnect profile:
Goffi <goffi@goffi.org>
parents: 373
diff changeset
144 G.host.closeUI()
b2a87239af25 android: platform specific menu to disconnect profile:
Goffi <goffi@goffi.org>
parents: 373
diff changeset
145
b2a87239af25 android: platform specific menu to disconnect profile:
Goffi <goffi@goffi.org>
parents: 373
diff changeset
146 def _on_disconnect(self):
b2a87239af25 android: platform specific menu to disconnect profile:
Goffi <goffi@goffi.org>
parents: 373
diff changeset
147 current_profile = next(iter(G.host.profiles))
b2a87239af25 android: platform specific menu to disconnect profile:
Goffi <goffi@goffi.org>
parents: 373
diff changeset
148 wid = dialog.ConfirmDialog(
b2a87239af25 android: platform specific menu to disconnect profile:
Goffi <goffi@goffi.org>
parents: 373
diff changeset
149 title=_("Are you sure to disconnect?"),
b2a87239af25 android: platform specific menu to disconnect profile:
Goffi <goffi@goffi.org>
parents: 373
diff changeset
150 message=_(
b2a87239af25 android: platform specific menu to disconnect profile:
Goffi <goffi@goffi.org>
parents: 373
diff changeset
151 "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
152 "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
153 "want?").format(profile=current_profile),
b2a87239af25 android: platform specific menu to disconnect profile:
Goffi <goffi@goffi.org>
parents: 373
diff changeset
154 yes_cb=partial(self._disconnect, profile=current_profile),
b2a87239af25 android: platform specific menu to disconnect profile:
Goffi <goffi@goffi.org>
parents: 373
diff changeset
155 no_cb=G.host.closeUI,
b2a87239af25 android: platform specific menu to disconnect profile:
Goffi <goffi@goffi.org>
parents: 373
diff changeset
156 )
b2a87239af25 android: platform specific menu to disconnect profile:
Goffi <goffi@goffi.org>
parents: 373
diff changeset
157 G.host.showExtraUI(wid)
b2a87239af25 android: platform specific menu to disconnect profile:
Goffi <goffi@goffi.org>
parents: 373
diff changeset
158
b2a87239af25 android: platform specific menu to disconnect profile:
Goffi <goffi@goffi.org>
parents: 373
diff changeset
159 def on_extra_menu_init(self, extra_menu):
b2a87239af25 android: platform specific menu to disconnect profile:
Goffi <goffi@goffi.org>
parents: 373
diff changeset
160 extra_menu.addItem(_('disconnect'), self._on_disconnect)
b2a87239af25 android: platform specific menu to disconnect profile:
Goffi <goffi@goffi.org>
parents: 373
diff changeset
161
372
1481f09c9175 settings (android): don't expose autoconnect parameters:
Goffi <goffi@goffi.org>
parents: 370
diff changeset
162 def updateParamsExtra(self, extra):
1481f09c9175 settings (android): don't expose autoconnect parameters:
Goffi <goffi@goffi.org>
parents: 370
diff changeset
163 # on Android, we handle autoconnection automatically,
1481f09c9175 settings (android): don't expose autoconnect parameters:
Goffi <goffi@goffi.org>
parents: 370
diff changeset
164 # user must not modify those parameters
1481f09c9175 settings (android): don't expose autoconnect parameters:
Goffi <goffi@goffi.org>
parents: 370
diff changeset
165 extra.update(
1481f09c9175 settings (android): don't expose autoconnect parameters:
Goffi <goffi@goffi.org>
parents: 370
diff changeset
166 {
1481f09c9175 settings (android): don't expose autoconnect parameters:
Goffi <goffi@goffi.org>
parents: 370
diff changeset
167 "ignore": [
1481f09c9175 settings (android): don't expose autoconnect parameters:
Goffi <goffi@goffi.org>
parents: 370
diff changeset
168 ["Connection", "autoconnect_backend"],
1481f09c9175 settings (android): don't expose autoconnect parameters:
Goffi <goffi@goffi.org>
parents: 370
diff changeset
169 ["Connection", "autoconnect"],
1481f09c9175 settings (android): don't expose autoconnect parameters:
Goffi <goffi@goffi.org>
parents: 370
diff changeset
170 ["Connection", "autodisconnect"],
1481f09c9175 settings (android): don't expose autoconnect parameters:
Goffi <goffi@goffi.org>
parents: 370
diff changeset
171 ],
1481f09c9175 settings (android): don't expose autoconnect parameters:
Goffi <goffi@goffi.org>
parents: 370
diff changeset
172 }
1481f09c9175 settings (android): don't expose autoconnect parameters:
Goffi <goffi@goffi.org>
parents: 370
diff changeset
173 )
1481f09c9175 settings (android): don't expose autoconnect parameters:
Goffi <goffi@goffi.org>
parents: 370
diff changeset
174
342
89799148f894 core: use classes and factory to handle platform specific behaviours in a generic way
Goffi <goffi@goffi.org>
parents: 322
diff changeset
175 def getPathFromUri(self, uri):
89799148f894 core: use classes and factory to handle platform specific behaviours in a generic way
Goffi <goffi@goffi.org>
parents: 322
diff changeset
176 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
177 if cursor is None:
89799148f894 core: use classes and factory to handle platform specific behaviours in a generic way
Goffi <goffi@goffi.org>
parents: 322
diff changeset
178 return uri.getPath()
322
e2b51663d8b8 core, android: new share widget + added Cagou to "share" menu:
Goffi <goffi@goffi.org>
parents:
diff changeset
179 else:
342
89799148f894 core: use classes and factory to handle platform specific behaviours in a generic way
Goffi <goffi@goffi.org>
parents: 322
diff changeset
180 cursor.moveToFirst()
89799148f894 core: use classes and factory to handle platform specific behaviours in a generic way
Goffi <goffi@goffi.org>
parents: 322
diff changeset
181 # FIXME: using DATA is not recommended (and DATA is deprecated)
89799148f894 core: use classes and factory to handle platform specific behaviours in a generic way
Goffi <goffi@goffi.org>
parents: 322
diff changeset
182 # we should read directly the file with
89799148f894 core: use classes and factory to handle platform specific behaviours in a generic way
Goffi <goffi@goffi.org>
parents: 322
diff changeset
183 # ContentResolver#openFileDescriptor(Uri, String)
89799148f894 core: use classes and factory to handle platform specific behaviours in a generic way
Goffi <goffi@goffi.org>
parents: 322
diff changeset
184 col_idx = cursor.getColumnIndex(DATA);
89799148f894 core: use classes and factory to handle platform specific behaviours in a generic way
Goffi <goffi@goffi.org>
parents: 322
diff changeset
185 if col_idx == -1:
89799148f894 core: use classes and factory to handle platform specific behaviours in a generic way
Goffi <goffi@goffi.org>
parents: 322
diff changeset
186 return uri.getPath()
89799148f894 core: use classes and factory to handle platform specific behaviours in a generic way
Goffi <goffi@goffi.org>
parents: 322
diff changeset
187 return cursor.getString(col_idx)
89799148f894 core: use classes and factory to handle platform specific behaviours in a generic way
Goffi <goffi@goffi.org>
parents: 322
diff changeset
188
89799148f894 core: use classes and factory to handle platform specific behaviours in a generic way
Goffi <goffi@goffi.org>
parents: 322
diff changeset
189 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
190 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
191 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
192 intent_type = intent.getType();
345
a3cefa7158dc android: open "geo:" URL using an Intent
Goffi <goffi@goffi.org>
parents: 342
diff changeset
193 if 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
194 # 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
195 # 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
196 data = {}
89799148f894 core: use classes and factory to handle platform specific behaviours in a generic way
Goffi <goffi@goffi.org>
parents: 322
diff changeset
197 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
198 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
199 data['text'] = text
89799148f894 core: use classes and factory to handle platform specific behaviours in a generic way
Goffi <goffi@goffi.org>
parents: 322
diff changeset
200 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
201 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
202 uri = cast('android.net.Uri', item)
89799148f894 core: use classes and factory to handle platform specific behaviours in a generic way
Goffi <goffi@goffi.org>
parents: 322
diff changeset
203 data['uri'] = uri.toString()
89799148f894 core: use classes and factory to handle platform specific behaviours in a generic way
Goffi <goffi@goffi.org>
parents: 322
diff changeset
204 path = self.getPathFromUri(uri)
89799148f894 core: use classes and factory to handle platform specific behaviours in a generic way
Goffi <goffi@goffi.org>
parents: 322
diff changeset
205 if path is not None:
89799148f894 core: use classes and factory to handle platform specific behaviours in a generic way
Goffi <goffi@goffi.org>
parents: 322
diff changeset
206 data['path'] = path
89799148f894 core: use classes and factory to handle platform specific behaviours in a generic way
Goffi <goffi@goffi.org>
parents: 322
diff changeset
207 else:
89799148f894 core: use classes and factory to handle platform specific behaviours in a generic way
Goffi <goffi@goffi.org>
parents: 322
diff changeset
208 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
209 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
210
89799148f894 core: use classes and factory to handle platform specific behaviours in a generic way
Goffi <goffi@goffi.org>
parents: 322
diff changeset
211 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
212 else:
89799148f894 core: use classes and factory to handle platform specific behaviours in a generic way
Goffi <goffi@goffi.org>
parents: 322
diff changeset
213 text = None
322
e2b51663d8b8 core, android: new share widget + added Cagou to "share" menu:
Goffi <goffi@goffi.org>
parents:
diff changeset
214 uri = None
e2b51663d8b8 core, android: new share widget + added Cagou to "share" menu:
Goffi <goffi@goffi.org>
parents:
diff changeset
215 path = None
e2b51663d8b8 core, android: new share widget + added Cagou to "share" menu:
Goffi <goffi@goffi.org>
parents:
diff changeset
216
342
89799148f894 core: use classes and factory to handle platform specific behaviours in a generic way
Goffi <goffi@goffi.org>
parents: 322
diff changeset
217 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
218 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
219 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
220 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
221 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
222 f"path: {path}")
322
e2b51663d8b8 core, android: new share widget + added Cagou to "share" menu:
Goffi <goffi@goffi.org>
parents:
diff changeset
223
342
89799148f894 core: use classes and factory to handle platform specific behaviours in a generic way
Goffi <goffi@goffi.org>
parents: 322
diff changeset
224 log.debug(msg)
345
a3cefa7158dc android: open "geo:" URL using an Intent
Goffi <goffi@goffi.org>
parents: 342
diff changeset
225
a3cefa7158dc android: open "geo:" URL using an Intent
Goffi <goffi@goffi.org>
parents: 342
diff changeset
226 def open_url(self, url, wid=None):
a3cefa7158dc android: open "geo:" URL using an Intent
Goffi <goffi@goffi.org>
parents: 342
diff changeset
227 parsed_url = urlparse(url)
a3cefa7158dc android: open "geo:" URL using an Intent
Goffi <goffi@goffi.org>
parents: 342
diff changeset
228 if parsed_url.scheme == "geo":
a3cefa7158dc android: open "geo:" URL using an Intent
Goffi <goffi@goffi.org>
parents: 342
diff changeset
229 intent = Intent(Intent.ACTION_VIEW)
a3cefa7158dc android: open "geo:" URL using an Intent
Goffi <goffi@goffi.org>
parents: 342
diff changeset
230 intent.setData(Uri.parse(url))
a3cefa7158dc android: open "geo:" URL using an Intent
Goffi <goffi@goffi.org>
parents: 342
diff changeset
231 if mActivity.getPackageManager() is not None:
a3cefa7158dc android: open "geo:" URL using an Intent
Goffi <goffi@goffi.org>
parents: 342
diff changeset
232 activity = cast('android.app.Activity', mActivity)
a3cefa7158dc android: open "geo:" URL using an Intent
Goffi <goffi@goffi.org>
parents: 342
diff changeset
233 activity.startActivity(intent)
a3cefa7158dc android: open "geo:" URL using an Intent
Goffi <goffi@goffi.org>
parents: 342
diff changeset
234 else:
a3cefa7158dc android: open "geo:" URL using an Intent
Goffi <goffi@goffi.org>
parents: 342
diff changeset
235 super().open_url(self, url, wid)