annotate cagou/core/platform_/android.py @ 380:9d3481663964

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