4 from tools
import helpers
5 from gi
.repository
import GLib
9 INTERFACE
= "lineageos.waydroid.IPlatform"
10 SERVICE_NAME
= "waydroidplatform"
12 TRANSACTION_getprop
= 1
13 TRANSACTION_setprop
= 2
14 TRANSACTION_getAppsInfo
= 3
15 TRANSACTION_getAppInfo
= 4
16 TRANSACTION_installApp
= 5
17 TRANSACTION_removeApp
= 6
18 TRANSACTION_launchApp
= 7
19 TRANSACTION_getAppName
= 8
20 TRANSACTION_settingsPutString
= 9
21 TRANSACTION_settingsGetString
= 10
22 TRANSACTION_settingsPutInt
= 11
23 TRANSACTION_settingsGetInt
= 12
24 TRANSACTION_launchIntent
= 13
27 def __init__(self
, remote
):
28 self
.client
= gbinder
.Client(remote
, INTERFACE
)
30 def getprop(self
, arg1
, arg2
):
31 request
= self
.client
.new_request()
32 request
.append_string16(arg1
)
33 request
.append_string16(arg2
)
34 reply
, status
= self
.client
.transact_sync_reply(
35 TRANSACTION_getprop
, request
)
38 logging
.error("Sending reply failed")
40 reader
= reply
.init_reader()
41 status
, exception
= reader
.read_int32()
43 rep1
= reader
.read_string16()
46 logging
.error("Failed with code: {}".format(exception
))
50 def setprop(self
, arg1
, arg2
):
51 request
= self
.client
.new_request()
52 request
.append_string16(arg1
)
53 request
.append_string16(arg2
)
54 reply
, status
= self
.client
.transact_sync_reply(
55 TRANSACTION_setprop
, request
)
58 logging
.error("Sending reply failed")
60 reader
= reply
.init_reader()
61 status
, exception
= reader
.read_int32()
65 logging
.error("Failed with code: {}".format(exception
))
69 def getAppsInfo(self
):
70 request
= self
.client
.new_request()
71 reply
, status
= self
.client
.transact_sync_reply(
72 TRANSACTION_getAppsInfo
, request
)
75 logging
.error("Sending reply failed")
77 reader
= reply
.init_reader()
79 status
, exception
= reader
.read_int32()
81 status
, apps
= reader
.read_int32()
83 status
, has_value
= reader
.read_int32()
86 "name": reader
.read_string16(),
87 "packageName": reader
.read_string16(),
88 "action": reader
.read_string16(),
89 "launchIntent": reader
.read_string16(),
90 "componentPackageName": reader
.read_string16(),
91 "componentClassName": reader
.read_string16(),
94 status
, categories
= reader
.read_int32()
95 for i
in range(categories
):
96 appinfo
["categories"].append(reader
.read_string16())
97 apps_list
.append(appinfo
)
99 logging
.error("Failed with code: {}".format(exception
))
103 def getAppInfo(self
, arg1
):
104 request
= self
.client
.new_request()
105 request
.append_string16(arg1
)
106 reply
, status
= self
.client
.transact_sync_reply(
107 TRANSACTION_getAppInfo
, request
)
110 logging
.error("Sending reply failed")
112 reader
= reply
.init_reader()
113 status
, exception
= reader
.read_int32()
115 status
, has_value
= reader
.read_int32()
118 "name": reader
.read_string16(),
119 "packageName": reader
.read_string16(),
120 "action": reader
.read_string16(),
121 "launchIntent": reader
.read_string16(),
122 "componentPackageName": reader
.read_string16(),
123 "componentClassName": reader
.read_string16(),
126 status
, categories
= reader
.read_int32()
127 for i
in range(categories
):
128 appinfo
["categories"].append(reader
.read_string16())
132 logging
.error("Failed with code: {}".format(exception
))
136 def installApp(self
, arg1
):
137 request
= self
.client
.new_request()
138 request
.append_string16(arg1
)
139 reply
, status
= self
.client
.transact_sync_reply(
140 TRANSACTION_installApp
, request
)
143 logging
.error("Sending reply failed")
145 reader
= reply
.init_reader()
146 status
, exception
= reader
.read_int32()
148 status
, ret
= reader
.read_int32()
151 logging
.error("Failed with code: {}".format(exception
))
155 def removeApp(self
, arg1
):
156 request
= self
.client
.new_request()
157 request
.append_string16(arg1
)
158 reply
, status
= self
.client
.transact_sync_reply(
159 TRANSACTION_removeApp
, request
)
162 logging
.error("Sending reply failed")
164 reader
= reply
.init_reader()
165 status
, exception
= reader
.read_int32()
167 status
, ret
= reader
.read_int32()
170 logging
.error("Failed with code: {}".format(exception
))
174 def launchApp(self
, arg1
):
175 request
= self
.client
.new_request()
176 request
.append_string16(arg1
)
177 reply
, status
= self
.client
.transact_sync_reply(
178 TRANSACTION_launchApp
, request
)
181 logging
.error("Sending reply failed")
183 reader
= reply
.init_reader()
184 status
, exception
= reader
.read_int32()
186 logging
.error("Failed with code: {}".format(exception
))
188 def launchIntent(self
, arg1
, arg2
):
189 request
= self
.client
.new_request()
190 request
.append_string16(arg1
)
191 request
.append_string16(arg2
)
192 reply
, status
= self
.client
.transact_sync_reply(
193 TRANSACTION_launchIntent
, request
)
196 logging
.error("Sending reply failed")
198 reader
= reply
.init_reader()
199 status
, exception
= reader
.read_int32()
201 rep1
= reader
.read_string16()
204 logging
.error("Failed with code: {}".format(exception
))
207 def getAppName(self
, arg1
):
208 request
= self
.client
.new_request()
209 request
.append_string16(arg1
)
210 reply
, status
= self
.client
.transact_sync_reply(
211 TRANSACTION_getAppName
, request
)
214 logging
.error("Sending reply failed")
216 reader
= reply
.init_reader()
217 status
, exception
= reader
.read_int32()
219 rep1
= reader
.read_string16()
222 logging
.error("Failed with code: {}".format(exception
))
226 def settingsPutString(self
, arg1
, arg2
, arg3
):
227 request
= self
.client
.new_request()
228 request
.append_int32(arg1
)
229 request
.append_string16(arg2
)
230 request
.append_string16(arg3
)
231 reply
, status
= self
.client
.transact_sync_reply(
232 TRANSACTION_settingsPutString
, request
)
235 logging
.error("Sending reply failed")
237 reader
= reply
.init_reader()
238 status
, exception
= reader
.read_int32()
240 logging
.error("Failed with code: {}".format(exception
))
242 def settingsGetString(self
, arg1
, arg2
):
243 request
= self
.client
.new_request()
244 request
.append_int32(arg1
)
245 request
.append_string16(arg2
)
246 reply
, status
= self
.client
.transact_sync_reply(
247 TRANSACTION_settingsGetString
, request
)
250 logging
.error("Sending reply failed")
252 reader
= reply
.init_reader()
253 status
, exception
= reader
.read_int32()
255 rep1
= reader
.read_string16()
258 logging
.error("Failed with code: {}".format(exception
))
262 def settingsPutInt(self
, arg1
, arg2
, arg3
):
263 request
= self
.client
.new_request()
264 request
.append_int32(arg1
)
265 request
.append_string16(arg2
)
266 request
.append_int32(arg3
)
267 reply
, status
= self
.client
.transact_sync_reply(
268 TRANSACTION_settingsPutInt
, request
)
271 logging
.error("Sending reply failed")
273 reader
= reply
.init_reader()
274 status
, exception
= reader
.read_int32()
276 logging
.error("Failed with code: {}".format(exception
))
278 def settingsGetInt(self
, arg1
, arg2
):
279 request
= self
.client
.new_request()
280 request
.append_int32(arg1
)
281 request
.append_string16(arg2
)
282 reply
, status
= self
.client
.transact_sync_reply(
283 TRANSACTION_settingsGetString
, request
)
286 logging
.error("Sending reply failed")
288 reader
= reply
.init_reader()
289 status
, exception
= reader
.read_int32()
291 status
, rep1
= reader
.read_int32()
294 logging
.error("Failed with code: {}".format(exception
))
298 def get_service(args
):
299 helpers
.drivers
.loadBinderNodes(args
)
301 serviceManager
= gbinder
.ServiceManager("/dev/" + args
.BINDER_DRIVER
, args
.SERVICE_MANAGER_PROTOCOL
, args
.BINDER_PROTOCOL
)
303 serviceManager
= gbinder
.ServiceManager("/dev/" + args
.BINDER_DRIVER
)
305 if not serviceManager
.is_present():
306 logging
.info("Waiting for binder Service Manager...")
307 if not wait_for_manager(serviceManager
):
308 logging
.error("Service Manager never appeared")
313 remote
, status
= serviceManager
.get_service_sync(SERVICE_NAME
)
317 "Failed to get service {}, trying again...".format(SERVICE_NAME
))
319 remote
, status
= serviceManager
.get_service_sync(SERVICE_NAME
)
324 return IPlatform(remote
)
326 # Like ServiceManager.wait() but can be interrupted
327 def wait_for_manager(sm
):
328 mainloop
= GLib
.MainLoop()
329 sm
.add_presence_handler(lambda: mainloop
.quit() if sm
.is_present() else None)
330 GLib
.timeout_add_seconds(60, lambda: mainloop
.quit())
331 GLib
.unix_signal_add(GLib
.PRIORITY_HIGH
, signal
.SIGINT
, lambda _
: mainloop
.quit(), None)
333 if not sm
.is_present():