kivyforge 3.0.0.dev0__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (225) hide show
  1. kivyforge/__init__.py +9 -0
  2. kivyforge/artifacts/__init__.py +41 -0
  3. kivyforge/artifacts/cache.py +81 -0
  4. kivyforge/artifacts/collect.py +354 -0
  5. kivyforge/artifacts/download.py +125 -0
  6. kivyforge/artifacts/frameworks.py +240 -0
  7. kivyforge/artifacts/native_stage_util.py +346 -0
  8. kivyforge/artifacts/runtime.py +65 -0
  9. kivyforge/artifacts/verify.py +45 -0
  10. kivyforge/artifacts/wheels.py +89 -0
  11. kivyforge/bundle/__init__.py +1 -0
  12. kivyforge/bundle/pycompile.py +161 -0
  13. kivyforge/cli/__init__.py +52 -0
  14. kivyforge/cli/_common.py +62 -0
  15. kivyforge/cli/_platform.py +84 -0
  16. kivyforge/cli/build.py +111 -0
  17. kivyforge/cli/clean.py +135 -0
  18. kivyforge/cli/doctor.py +52 -0
  19. kivyforge/cli/init.py +612 -0
  20. kivyforge/cli/init_writer.py +716 -0
  21. kivyforge/cli/lock.py +261 -0
  22. kivyforge/cli/open_cmd.py +15 -0
  23. kivyforge/cli/package.py +134 -0
  24. kivyforge/cli/run.py +162 -0
  25. kivyforge/cli/status.py +20 -0
  26. kivyforge/cli/upgrade.py +314 -0
  27. kivyforge/config/__init__.py +46 -0
  28. kivyforge/config/errors.py +43 -0
  29. kivyforge/config/icons.py +60 -0
  30. kivyforge/config/loader.py +3079 -0
  31. kivyforge/config/model.py +817 -0
  32. kivyforge/doctor/__init__.py +19 -0
  33. kivyforge/doctor/checks_common.py +95 -0
  34. kivyforge/doctor/probe.py +357 -0
  35. kivyforge/doctor/result.py +41 -0
  36. kivyforge/lock/__init__.py +42 -0
  37. kivyforge/lock/_pip_shim.py +63 -0
  38. kivyforge/lock/find_links.py +182 -0
  39. kivyforge/lock/model.py +69 -0
  40. kivyforge/lock/pep751.py +111 -0
  41. kivyforge/lock/reader.py +30 -0
  42. kivyforge/lock/resolver.py +124 -0
  43. kivyforge/lock/wheelruntime/__init__.py +70 -0
  44. kivyforge/lock/wheelruntime/builder.py +280 -0
  45. kivyforge/lock/wheelruntime/model.py +94 -0
  46. kivyforge/lock/wheelruntime/native_binaries.py +127 -0
  47. kivyforge/lock/wheelruntime/pbs_github.py +133 -0
  48. kivyforge/lock/wheelruntime/profile.py +104 -0
  49. kivyforge/lock/wheelruntime/resolver.py +248 -0
  50. kivyforge/lock/wheelruntime/runtime.py +161 -0
  51. kivyforge/lock/wheelruntime/serialize.py +245 -0
  52. kivyforge/platforms/__init__.py +114 -0
  53. kivyforge/platforms/android/__init__.py +140 -0
  54. kivyforge/platforms/android/adb.py +215 -0
  55. kivyforge/platforms/android/bootstrap/__init__.py +7 -0
  56. kivyforge/platforms/android/bootstrap/contract.py +166 -0
  57. kivyforge/platforms/android/bootstrap/render.py +244 -0
  58. kivyforge/platforms/android/bootstrap/templates/androidtest/KivyforgeContractTest.java +76 -0
  59. kivyforge/platforms/android/bootstrap/templates/bootstrap_py/_kivy_bootstrap.py +50 -0
  60. kivyforge/platforms/android/bootstrap/templates/bootstrap_py/_kivyforge_bootstrap.py +54 -0
  61. kivyforge/platforms/android/bootstrap/templates/bootstrap_py/_kivyforge_selftest.py +97 -0
  62. kivyforge/platforms/android/bootstrap/templates/cpp/CMakeLists.txt +20 -0
  63. kivyforge/platforms/android/bootstrap/templates/cpp/main.c +150 -0
  64. kivyforge/platforms/android/bootstrap/templates/java/org/jnius/NativeInvocationHandler.java +48 -0
  65. kivyforge/platforms/android/bootstrap/templates/java/org/kivy/android/PythonActivity.java +75 -0
  66. kivyforge/platforms/android/bootstrap/templates/java/org/kivy/android/PythonBundle.java +132 -0
  67. kivyforge/platforms/android/bootstrap/templates/java/org/kivy/android/PythonService.java +189 -0
  68. kivyforge/platforms/android/bootstrap/templates/java/org/renpy/android/Hardware.java +276 -0
  69. kivyforge/platforms/android/bootstrap/templates/sdl2/LICENSE-SDL.txt +18 -0
  70. kivyforge/platforms/android/bootstrap/templates/sdl2/SDL_REVISION.txt +3 -0
  71. kivyforge/platforms/android/bootstrap/templates/sdl2/org/libsdl/app/HIDDevice.java +22 -0
  72. kivyforge/platforms/android/bootstrap/templates/sdl2/org/libsdl/app/HIDDeviceBLESteamController.java +650 -0
  73. kivyforge/platforms/android/bootstrap/templates/sdl2/org/libsdl/app/HIDDeviceManager.java +698 -0
  74. kivyforge/platforms/android/bootstrap/templates/sdl2/org/libsdl/app/HIDDeviceUSB.java +309 -0
  75. kivyforge/platforms/android/bootstrap/templates/sdl2/org/libsdl/app/SDL.java +90 -0
  76. kivyforge/platforms/android/bootstrap/templates/sdl2/org/libsdl/app/SDLActivity.java +2120 -0
  77. kivyforge/platforms/android/bootstrap/templates/sdl2/org/libsdl/app/SDLAudioManager.java +514 -0
  78. kivyforge/platforms/android/bootstrap/templates/sdl2/org/libsdl/app/SDLControllerManager.java +856 -0
  79. kivyforge/platforms/android/bootstrap/templates/sdl2/org/libsdl/app/SDLSurface.java +405 -0
  80. kivyforge/platforms/android/bootstrap/templates/sdl3/LICENSE-SDL.txt +18 -0
  81. kivyforge/platforms/android/bootstrap/templates/sdl3/SDL_REVISION.txt +3 -0
  82. kivyforge/platforms/android/bootstrap/templates/sdl3/org/libsdl/app/HIDDevice.java +21 -0
  83. kivyforge/platforms/android/bootstrap/templates/sdl3/org/libsdl/app/HIDDeviceBLESteamController.java +829 -0
  84. kivyforge/platforms/android/bootstrap/templates/sdl3/org/libsdl/app/HIDDeviceManager.java +698 -0
  85. kivyforge/platforms/android/bootstrap/templates/sdl3/org/libsdl/app/HIDDeviceUSB.java +354 -0
  86. kivyforge/platforms/android/bootstrap/templates/sdl3/org/libsdl/app/SDL.java +90 -0
  87. kivyforge/platforms/android/bootstrap/templates/sdl3/org/libsdl/app/SDLActivity.java +2240 -0
  88. kivyforge/platforms/android/bootstrap/templates/sdl3/org/libsdl/app/SDLAudioManager.java +126 -0
  89. kivyforge/platforms/android/bootstrap/templates/sdl3/org/libsdl/app/SDLControllerManager.java +1010 -0
  90. kivyforge/platforms/android/bootstrap/templates/sdl3/org/libsdl/app/SDLDummyEdit.java +66 -0
  91. kivyforge/platforms/android/bootstrap/templates/sdl3/org/libsdl/app/SDLInputConnection.java +136 -0
  92. kivyforge/platforms/android/bootstrap/templates/sdl3/org/libsdl/app/SDLSensorManager.java +73 -0
  93. kivyforge/platforms/android/bootstrap/templates/sdl3/org/libsdl/app/SDLSurface.java +464 -0
  94. kivyforge/platforms/android/cli.py +1023 -0
  95. kivyforge/platforms/android/doctor.py +899 -0
  96. kivyforge/platforms/android/elf.py +148 -0
  97. kivyforge/platforms/android/generate/__init__.py +1 -0
  98. kivyforge/platforms/android/generate/manifest.py +261 -0
  99. kivyforge/platforms/android/generate/project.py +462 -0
  100. kivyforge/platforms/android/generate/services.py +187 -0
  101. kivyforge/platforms/android/gradle_wrapper/NOTICE +3 -0
  102. kivyforge/platforms/android/gradle_wrapper/SHA256SUMS +1 -0
  103. kivyforge/platforms/android/gradle_wrapper/gradle-wrapper.jar +0 -0
  104. kivyforge/platforms/android/gradle_wrapper/gradlew +164 -0
  105. kivyforge/platforms/android/gradle_wrapper/gradlew.bat +90 -0
  106. kivyforge/platforms/android/gradlew.py +60 -0
  107. kivyforge/platforms/android/icons.py +237 -0
  108. kivyforge/platforms/android/lock/__init__.py +1 -0
  109. kivyforge/platforms/android/lock/archives.py +109 -0
  110. kivyforge/platforms/android/lock/builder.py +387 -0
  111. kivyforge/platforms/android/lock/markers.py +71 -0
  112. kivyforge/platforms/android/lock/maven.py +252 -0
  113. kivyforge/platforms/android/lock/model.py +113 -0
  114. kivyforge/platforms/android/lock/python_meta.py +199 -0
  115. kivyforge/platforms/android/lock/reader.py +206 -0
  116. kivyforge/platforms/android/lock/resolver.py +276 -0
  117. kivyforge/platforms/android/lock/writer.py +121 -0
  118. kivyforge/platforms/android/policy.py +214 -0
  119. kivyforge/platforms/android/signing.py +145 -0
  120. kivyforge/platforms/android/smoke.py +43 -0
  121. kivyforge/platforms/android/splash.py +293 -0
  122. kivyforge/platforms/android/stage/__init__.py +1 -0
  123. kivyforge/platforms/android/stage/bundle.py +295 -0
  124. kivyforge/platforms/android/stage/jnilibs.py +186 -0
  125. kivyforge/platforms/android/stage/runtime.py +61 -0
  126. kivyforge/platforms/android/stage/wheels.py +106 -0
  127. kivyforge/platforms/android/toolchain.py +29 -0
  128. kivyforge/platforms/base.py +157 -0
  129. kivyforge/platforms/ios/__init__.py +129 -0
  130. kivyforge/platforms/ios/assets.py +193 -0
  131. kivyforge/platforms/ios/buildsettings.py +128 -0
  132. kivyforge/platforms/ios/cli.py +543 -0
  133. kivyforge/platforms/ios/doctor.py +410 -0
  134. kivyforge/platforms/ios/entitlements.py +34 -0
  135. kivyforge/platforms/ios/generator.py +318 -0
  136. kivyforge/platforms/ios/lock/__init__.py +71 -0
  137. kivyforge/platforms/ios/lock/builder.py +393 -0
  138. kivyforge/platforms/ios/lock/markers.py +69 -0
  139. kivyforge/platforms/ios/lock/model.py +95 -0
  140. kivyforge/platforms/ios/lock/python_meta.py +187 -0
  141. kivyforge/platforms/ios/lock/reader.py +191 -0
  142. kivyforge/platforms/ios/lock/resolver.py +304 -0
  143. kivyforge/platforms/ios/lock/spm.py +217 -0
  144. kivyforge/platforms/ios/lock/writer.py +114 -0
  145. kivyforge/platforms/ios/lock/xcframework.py +188 -0
  146. kivyforge/platforms/ios/materialize.py +59 -0
  147. kivyforge/platforms/ios/plist.py +91 -0
  148. kivyforge/platforms/ios/privacy.py +39 -0
  149. kivyforge/platforms/ios/skeleton.py +165 -0
  150. kivyforge/platforms/ios/sources.py +63 -0
  151. kivyforge/platforms/ios/staging.py +225 -0
  152. kivyforge/platforms/ios/swift_packages.py +324 -0
  153. kivyforge/platforms/ios/templates/kivyforge_bootstrap.h +34 -0
  154. kivyforge/platforms/ios/templates/kivyforge_bootstrap.m +146 -0
  155. kivyforge/platforms/ios/templates/main.m +15 -0
  156. kivyforge/platforms/ios/templates/main_config.h.in +12 -0
  157. kivyforge/platforms/ios/xcframeworks.py +194 -0
  158. kivyforge/platforms/ios/xcode/__init__.py +76 -0
  159. kivyforge/platforms/ios/xcode/commands.py +296 -0
  160. kivyforge/platforms/ios/xcode/runner.py +316 -0
  161. kivyforge/platforms/linux/__init__.py +120 -0
  162. kivyforge/platforms/linux/appimage.py +169 -0
  163. kivyforge/platforms/linux/bundle.py +235 -0
  164. kivyforge/platforms/linux/cli.py +232 -0
  165. kivyforge/platforms/linux/desktop.py +71 -0
  166. kivyforge/platforms/linux/doctor.py +438 -0
  167. kivyforge/platforms/linux/elftools.py +95 -0
  168. kivyforge/platforms/linux/icons.py +129 -0
  169. kivyforge/platforms/linux/launcher.py +107 -0
  170. kivyforge/platforms/linux/lock/__init__.py +126 -0
  171. kivyforge/platforms/linux/lock/profile.py +254 -0
  172. kivyforge/platforms/linux/lock/runtime.py +75 -0
  173. kivyforge/platforms/linux/native_stage.py +47 -0
  174. kivyforge/platforms/linux/runtime_stage.py +107 -0
  175. kivyforge/platforms/linux/wheels_stage.py +103 -0
  176. kivyforge/platforms/macos/__init__.py +121 -0
  177. kivyforge/platforms/macos/bundle.py +255 -0
  178. kivyforge/platforms/macos/cli.py +269 -0
  179. kivyforge/platforms/macos/doctor.py +480 -0
  180. kivyforge/platforms/macos/icns.py +75 -0
  181. kivyforge/platforms/macos/launcher.py +118 -0
  182. kivyforge/platforms/macos/lock/__init__.py +112 -0
  183. kivyforge/platforms/macos/lock/profile.py +119 -0
  184. kivyforge/platforms/macos/lock/runtime.py +58 -0
  185. kivyforge/platforms/macos/machotools.py +138 -0
  186. kivyforge/platforms/macos/native_stage.py +47 -0
  187. kivyforge/platforms/macos/notarize.py +143 -0
  188. kivyforge/platforms/macos/plist.py +37 -0
  189. kivyforge/platforms/macos/runtime_stage.py +110 -0
  190. kivyforge/platforms/macos/signing.py +78 -0
  191. kivyforge/platforms/macos/wheels_stage.py +108 -0
  192. kivyforge/platforms/windows/__init__.py +133 -0
  193. kivyforge/platforms/windows/assets.py +76 -0
  194. kivyforge/platforms/windows/bundle.py +298 -0
  195. kivyforge/platforms/windows/cli.py +314 -0
  196. kivyforge/platforms/windows/doctor.py +563 -0
  197. kivyforge/platforms/windows/fsswap.py +87 -0
  198. kivyforge/platforms/windows/icons.py +64 -0
  199. kivyforge/platforms/windows/launcher/__init__.py +193 -0
  200. kivyforge/platforms/windows/launcher/build_launcher.py +507 -0
  201. kivyforge/platforms/windows/launcher/launcher.c +379 -0
  202. kivyforge/platforms/windows/lock/__init__.py +112 -0
  203. kivyforge/platforms/windows/lock/profile.py +101 -0
  204. kivyforge/platforms/windows/lock/runtime.py +64 -0
  205. kivyforge/platforms/windows/naming.py +52 -0
  206. kivyforge/platforms/windows/native_stage.py +66 -0
  207. kivyforge/platforms/windows/petools.py +98 -0
  208. kivyforge/platforms/windows/rcedit.py +116 -0
  209. kivyforge/platforms/windows/runtime_stage.py +221 -0
  210. kivyforge/platforms/windows/signing.py +168 -0
  211. kivyforge/platforms/windows/vendor/LICENSE.rcedit +29 -0
  212. kivyforge/platforms/windows/vendor/NOTICE +17 -0
  213. kivyforge/platforms/windows/vendor/SHA256SUMS +4 -0
  214. kivyforge/platforms/windows/vendor/TOOLSET.txt +4 -0
  215. kivyforge/platforms/windows/vendor/__init__.py +12 -0
  216. kivyforge/platforms/windows/vendor/fetch_rcedit.py +97 -0
  217. kivyforge/platforms/windows/vendor/launcher-amd64.exe +0 -0
  218. kivyforge/platforms/windows/vendor/rcedit-x64.exe +0 -0
  219. kivyforge/platforms/windows/wheels_stage.py +139 -0
  220. kivyforge-3.0.0.dev0.dist-info/METADATA +609 -0
  221. kivyforge-3.0.0.dev0.dist-info/RECORD +225 -0
  222. kivyforge-3.0.0.dev0.dist-info/WHEEL +5 -0
  223. kivyforge-3.0.0.dev0.dist-info/entry_points.txt +3 -0
  224. kivyforge-3.0.0.dev0.dist-info/licenses/LICENSE +21 -0
  225. kivyforge-3.0.0.dev0.dist-info/top_level.txt +1 -0
@@ -0,0 +1,309 @@
1
+ package org.libsdl.app;
2
+
3
+ import android.hardware.usb.*;
4
+ import android.os.Build;
5
+ import android.util.Log;
6
+ import java.util.Arrays;
7
+
8
+ class HIDDeviceUSB implements HIDDevice {
9
+
10
+ private static final String TAG = "hidapi";
11
+
12
+ protected HIDDeviceManager mManager;
13
+ protected UsbDevice mDevice;
14
+ protected int mInterfaceIndex;
15
+ protected int mInterface;
16
+ protected int mDeviceId;
17
+ protected UsbDeviceConnection mConnection;
18
+ protected UsbEndpoint mInputEndpoint;
19
+ protected UsbEndpoint mOutputEndpoint;
20
+ protected InputThread mInputThread;
21
+ protected boolean mRunning;
22
+ protected boolean mFrozen;
23
+
24
+ public HIDDeviceUSB(HIDDeviceManager manager, UsbDevice usbDevice, int interface_index) {
25
+ mManager = manager;
26
+ mDevice = usbDevice;
27
+ mInterfaceIndex = interface_index;
28
+ mInterface = mDevice.getInterface(mInterfaceIndex).getId();
29
+ mDeviceId = manager.getDeviceIDForIdentifier(getIdentifier());
30
+ mRunning = false;
31
+ }
32
+
33
+ public String getIdentifier() {
34
+ return String.format("%s/%x/%x/%d", mDevice.getDeviceName(), mDevice.getVendorId(), mDevice.getProductId(), mInterfaceIndex);
35
+ }
36
+
37
+ @Override
38
+ public int getId() {
39
+ return mDeviceId;
40
+ }
41
+
42
+ @Override
43
+ public int getVendorId() {
44
+ return mDevice.getVendorId();
45
+ }
46
+
47
+ @Override
48
+ public int getProductId() {
49
+ return mDevice.getProductId();
50
+ }
51
+
52
+ @Override
53
+ public String getSerialNumber() {
54
+ String result = null;
55
+ if (Build.VERSION.SDK_INT >= 21 /* Android 5.0 (LOLLIPOP) */) {
56
+ try {
57
+ result = mDevice.getSerialNumber();
58
+ }
59
+ catch (SecurityException exception) {
60
+ //Log.w(TAG, "App permissions mean we cannot get serial number for device " + getDeviceName() + " message: " + exception.getMessage());
61
+ }
62
+ }
63
+ if (result == null) {
64
+ result = "";
65
+ }
66
+ return result;
67
+ }
68
+
69
+ @Override
70
+ public int getVersion() {
71
+ return 0;
72
+ }
73
+
74
+ @Override
75
+ public String getManufacturerName() {
76
+ String result = null;
77
+ if (Build.VERSION.SDK_INT >= 21 /* Android 5.0 (LOLLIPOP) */) {
78
+ result = mDevice.getManufacturerName();
79
+ }
80
+ if (result == null) {
81
+ result = String.format("%x", getVendorId());
82
+ }
83
+ return result;
84
+ }
85
+
86
+ @Override
87
+ public String getProductName() {
88
+ String result = null;
89
+ if (Build.VERSION.SDK_INT >= 21 /* Android 5.0 (LOLLIPOP) */) {
90
+ result = mDevice.getProductName();
91
+ }
92
+ if (result == null) {
93
+ result = String.format("%x", getProductId());
94
+ }
95
+ return result;
96
+ }
97
+
98
+ @Override
99
+ public UsbDevice getDevice() {
100
+ return mDevice;
101
+ }
102
+
103
+ public String getDeviceName() {
104
+ return getManufacturerName() + " " + getProductName() + "(0x" + String.format("%x", getVendorId()) + "/0x" + String.format("%x", getProductId()) + ")";
105
+ }
106
+
107
+ @Override
108
+ public boolean open() {
109
+ mConnection = mManager.getUSBManager().openDevice(mDevice);
110
+ if (mConnection == null) {
111
+ Log.w(TAG, "Unable to open USB device " + getDeviceName());
112
+ return false;
113
+ }
114
+
115
+ // Force claim our interface
116
+ UsbInterface iface = mDevice.getInterface(mInterfaceIndex);
117
+ if (!mConnection.claimInterface(iface, true)) {
118
+ Log.w(TAG, "Failed to claim interfaces on USB device " + getDeviceName());
119
+ close();
120
+ return false;
121
+ }
122
+
123
+ // Find the endpoints
124
+ for (int j = 0; j < iface.getEndpointCount(); j++) {
125
+ UsbEndpoint endpt = iface.getEndpoint(j);
126
+ switch (endpt.getDirection()) {
127
+ case UsbConstants.USB_DIR_IN:
128
+ if (mInputEndpoint == null) {
129
+ mInputEndpoint = endpt;
130
+ }
131
+ break;
132
+ case UsbConstants.USB_DIR_OUT:
133
+ if (mOutputEndpoint == null) {
134
+ mOutputEndpoint = endpt;
135
+ }
136
+ break;
137
+ }
138
+ }
139
+
140
+ // Make sure the required endpoints were present
141
+ if (mInputEndpoint == null || mOutputEndpoint == null) {
142
+ Log.w(TAG, "Missing required endpoint on USB device " + getDeviceName());
143
+ close();
144
+ return false;
145
+ }
146
+
147
+ // Start listening for input
148
+ mRunning = true;
149
+ mInputThread = new InputThread();
150
+ mInputThread.start();
151
+
152
+ return true;
153
+ }
154
+
155
+ @Override
156
+ public int sendFeatureReport(byte[] report) {
157
+ int res = -1;
158
+ int offset = 0;
159
+ int length = report.length;
160
+ boolean skipped_report_id = false;
161
+ byte report_number = report[0];
162
+
163
+ if (report_number == 0x0) {
164
+ ++offset;
165
+ --length;
166
+ skipped_report_id = true;
167
+ }
168
+
169
+ res = mConnection.controlTransfer(
170
+ UsbConstants.USB_TYPE_CLASS | 0x01 /*RECIPIENT_INTERFACE*/ | UsbConstants.USB_DIR_OUT,
171
+ 0x09/*HID set_report*/,
172
+ (3/*HID feature*/ << 8) | report_number,
173
+ mInterface,
174
+ report, offset, length,
175
+ 1000/*timeout millis*/);
176
+
177
+ if (res < 0) {
178
+ Log.w(TAG, "sendFeatureReport() returned " + res + " on device " + getDeviceName());
179
+ return -1;
180
+ }
181
+
182
+ if (skipped_report_id) {
183
+ ++length;
184
+ }
185
+ return length;
186
+ }
187
+
188
+ @Override
189
+ public int sendOutputReport(byte[] report) {
190
+ int r = mConnection.bulkTransfer(mOutputEndpoint, report, report.length, 1000);
191
+ if (r != report.length) {
192
+ Log.w(TAG, "sendOutputReport() returned " + r + " on device " + getDeviceName());
193
+ }
194
+ return r;
195
+ }
196
+
197
+ @Override
198
+ public boolean getFeatureReport(byte[] report) {
199
+ int res = -1;
200
+ int offset = 0;
201
+ int length = report.length;
202
+ boolean skipped_report_id = false;
203
+ byte report_number = report[0];
204
+
205
+ if (report_number == 0x0) {
206
+ /* Offset the return buffer by 1, so that the report ID
207
+ will remain in byte 0. */
208
+ ++offset;
209
+ --length;
210
+ skipped_report_id = true;
211
+ }
212
+
213
+ res = mConnection.controlTransfer(
214
+ UsbConstants.USB_TYPE_CLASS | 0x01 /*RECIPIENT_INTERFACE*/ | UsbConstants.USB_DIR_IN,
215
+ 0x01/*HID get_report*/,
216
+ (3/*HID feature*/ << 8) | report_number,
217
+ mInterface,
218
+ report, offset, length,
219
+ 1000/*timeout millis*/);
220
+
221
+ if (res < 0) {
222
+ Log.w(TAG, "getFeatureReport() returned " + res + " on device " + getDeviceName());
223
+ return false;
224
+ }
225
+
226
+ if (skipped_report_id) {
227
+ ++res;
228
+ ++length;
229
+ }
230
+
231
+ byte[] data;
232
+ if (res == length) {
233
+ data = report;
234
+ } else {
235
+ data = Arrays.copyOfRange(report, 0, res);
236
+ }
237
+ mManager.HIDDeviceFeatureReport(mDeviceId, data);
238
+
239
+ return true;
240
+ }
241
+
242
+ @Override
243
+ public void close() {
244
+ mRunning = false;
245
+ if (mInputThread != null) {
246
+ while (mInputThread.isAlive()) {
247
+ mInputThread.interrupt();
248
+ try {
249
+ mInputThread.join();
250
+ } catch (InterruptedException e) {
251
+ // Keep trying until we're done
252
+ }
253
+ }
254
+ mInputThread = null;
255
+ }
256
+ if (mConnection != null) {
257
+ UsbInterface iface = mDevice.getInterface(mInterfaceIndex);
258
+ mConnection.releaseInterface(iface);
259
+ mConnection.close();
260
+ mConnection = null;
261
+ }
262
+ }
263
+
264
+ @Override
265
+ public void shutdown() {
266
+ close();
267
+ mManager = null;
268
+ }
269
+
270
+ @Override
271
+ public void setFrozen(boolean frozen) {
272
+ mFrozen = frozen;
273
+ }
274
+
275
+ protected class InputThread extends Thread {
276
+ @Override
277
+ public void run() {
278
+ int packetSize = mInputEndpoint.getMaxPacketSize();
279
+ byte[] packet = new byte[packetSize];
280
+ while (mRunning) {
281
+ int r;
282
+ try
283
+ {
284
+ r = mConnection.bulkTransfer(mInputEndpoint, packet, packetSize, 1000);
285
+ }
286
+ catch (Exception e)
287
+ {
288
+ Log.v(TAG, "Exception in UsbDeviceConnection bulktransfer: " + e);
289
+ break;
290
+ }
291
+ if (r < 0) {
292
+ // Could be a timeout or an I/O error
293
+ }
294
+ if (r > 0) {
295
+ byte[] data;
296
+ if (r == packetSize) {
297
+ data = packet;
298
+ } else {
299
+ data = Arrays.copyOfRange(packet, 0, r);
300
+ }
301
+
302
+ if (!mFrozen) {
303
+ mManager.HIDDeviceInputReport(mDeviceId, data);
304
+ }
305
+ }
306
+ }
307
+ }
308
+ }
309
+ }
@@ -0,0 +1,90 @@
1
+ package org.libsdl.app;
2
+
3
+ import android.content.Context;
4
+
5
+ import java.lang.Class;
6
+ import java.lang.reflect.Method;
7
+
8
+ /**
9
+ SDL library initialization
10
+ */
11
+ public class SDL {
12
+
13
+ // This function should be called first and sets up the native code
14
+ // so it can call into the Java classes
15
+ public static void setupJNI() {
16
+ SDLActivity.nativeSetupJNI();
17
+ SDLAudioManager.nativeSetupJNI();
18
+ SDLControllerManager.nativeSetupJNI();
19
+ }
20
+
21
+ // This function should be called each time the activity is started
22
+ public static void initialize() {
23
+ setContext(null);
24
+
25
+ SDLActivity.initialize();
26
+ SDLAudioManager.initialize();
27
+ SDLControllerManager.initialize();
28
+ }
29
+
30
+ // This function stores the current activity (SDL or not)
31
+ public static void setContext(Context context) {
32
+ SDLAudioManager.setContext(context);
33
+ mContext = context;
34
+ }
35
+
36
+ public static Context getContext() {
37
+ return mContext;
38
+ }
39
+
40
+ public static void loadLibrary(String libraryName) throws UnsatisfiedLinkError, SecurityException, NullPointerException {
41
+ loadLibrary(libraryName, mContext);
42
+ }
43
+
44
+ public static void loadLibrary(String libraryName, Context context) throws UnsatisfiedLinkError, SecurityException, NullPointerException {
45
+
46
+ if (libraryName == null) {
47
+ throw new NullPointerException("No library name provided.");
48
+ }
49
+
50
+ try {
51
+ // Let's see if we have ReLinker available in the project. This is necessary for
52
+ // some projects that have huge numbers of local libraries bundled, and thus may
53
+ // trip a bug in Android's native library loader which ReLinker works around. (If
54
+ // loadLibrary works properly, ReLinker will simply use the normal Android method
55
+ // internally.)
56
+ //
57
+ // To use ReLinker, just add it as a dependency. For more information, see
58
+ // https://github.com/KeepSafe/ReLinker for ReLinker's repository.
59
+ //
60
+ Class<?> relinkClass = context.getClassLoader().loadClass("com.getkeepsafe.relinker.ReLinker");
61
+ Class<?> relinkListenerClass = context.getClassLoader().loadClass("com.getkeepsafe.relinker.ReLinker$LoadListener");
62
+ Class<?> contextClass = context.getClassLoader().loadClass("android.content.Context");
63
+ Class<?> stringClass = context.getClassLoader().loadClass("java.lang.String");
64
+
65
+ // Get a 'force' instance of the ReLinker, so we can ensure libraries are reinstalled if
66
+ // they've changed during updates.
67
+ Method forceMethod = relinkClass.getDeclaredMethod("force");
68
+ Object relinkInstance = forceMethod.invoke(null);
69
+ Class<?> relinkInstanceClass = relinkInstance.getClass();
70
+
71
+ // Actually load the library!
72
+ Method loadMethod = relinkInstanceClass.getDeclaredMethod("loadLibrary", contextClass, stringClass, stringClass, relinkListenerClass);
73
+ loadMethod.invoke(relinkInstance, context, libraryName, null, null);
74
+ }
75
+ catch (final Throwable e) {
76
+ // Fall back
77
+ try {
78
+ System.loadLibrary(libraryName);
79
+ }
80
+ catch (final UnsatisfiedLinkError ule) {
81
+ throw ule;
82
+ }
83
+ catch (final SecurityException se) {
84
+ throw se;
85
+ }
86
+ }
87
+ }
88
+
89
+ protected static Context mContext;
90
+ }