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,354 @@
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
+ import java.util.Locale;
8
+
9
+ class HIDDeviceUSB implements HIDDevice {
10
+
11
+ private static final String TAG = "hidapi";
12
+
13
+ protected HIDDeviceManager mManager;
14
+ protected UsbDevice mDevice;
15
+ protected int mInterfaceIndex;
16
+ protected int mInterface;
17
+ protected int mDeviceId;
18
+ protected UsbDeviceConnection mConnection;
19
+ protected UsbEndpoint mInputEndpoint;
20
+ protected UsbEndpoint mOutputEndpoint;
21
+ protected InputThread mInputThread;
22
+ protected boolean mRunning;
23
+ protected boolean mFrozen;
24
+ protected boolean mClaimed;
25
+
26
+ public HIDDeviceUSB(HIDDeviceManager manager, UsbDevice usbDevice, int interface_index) {
27
+ mManager = manager;
28
+ mDevice = usbDevice;
29
+ mInterfaceIndex = interface_index;
30
+ mInterface = mDevice.getInterface(mInterfaceIndex).getId();
31
+ mDeviceId = manager.getDeviceIDForIdentifier(getIdentifier());
32
+ mRunning = false;
33
+ mClaimed = false;
34
+ }
35
+
36
+ String getIdentifier() {
37
+ return String.format(Locale.ENGLISH, "%s/%x/%x/%d", mDevice.getDeviceName(), mDevice.getVendorId(), mDevice.getProductId(), mInterfaceIndex);
38
+ }
39
+
40
+ @Override
41
+ public int getId() {
42
+ return mDeviceId;
43
+ }
44
+
45
+ @Override
46
+ public int getVendorId() {
47
+ return mDevice.getVendorId();
48
+ }
49
+
50
+ @Override
51
+ public int getProductId() {
52
+ return mDevice.getProductId();
53
+ }
54
+
55
+ @Override
56
+ public String getSerialNumber() {
57
+ String result = null;
58
+ try {
59
+ result = mDevice.getSerialNumber();
60
+ }
61
+ catch (Exception exception) {
62
+ //Log.w(TAG, "App permissions mean we cannot get serial number for device " + getDeviceName() + " message: " + exception.getMessage());
63
+ }
64
+ if (result == null) {
65
+ result = "";
66
+ }
67
+ return result;
68
+ }
69
+
70
+ @Override
71
+ public int getVersion() {
72
+ return 0;
73
+ }
74
+
75
+ @Override
76
+ public String getManufacturerName() {
77
+ String result;
78
+ result = mDevice.getManufacturerName();
79
+ if (result == null) {
80
+ result = String.format("%x", getVendorId());
81
+ }
82
+ return result;
83
+ }
84
+
85
+ @Override
86
+ public String getProductName() {
87
+ String result;
88
+ result = mDevice.getProductName();
89
+ if (result == null) {
90
+ result = String.format("%x", getProductId());
91
+ }
92
+ return result;
93
+ }
94
+
95
+ @Override
96
+ public UsbDevice getDevice() {
97
+ return mDevice;
98
+ }
99
+
100
+ String getDeviceName() {
101
+ return getManufacturerName() + " " + getProductName() + "(0x" + String.format("%x", getVendorId()) + "/0x" + String.format("%x", getProductId()) + ")";
102
+ }
103
+
104
+ @Override
105
+ public boolean open() {
106
+ mConnection = mManager.getUSBManager().openDevice(mDevice);
107
+ if (mConnection == null) {
108
+ Log.w(TAG, "Unable to open USB device " + getDeviceName());
109
+ return false;
110
+ }
111
+
112
+ // Force claim our interface
113
+ UsbInterface iface = mDevice.getInterface(mInterfaceIndex);
114
+ if (!mConnection.claimInterface(iface, true)) {
115
+ Log.w(TAG, "Failed to claim interfaces on USB device " + getDeviceName());
116
+ close();
117
+ return false;
118
+ }
119
+ mClaimed = true;
120
+
121
+ // Find the endpoints
122
+ for (int j = 0; j < iface.getEndpointCount(); j++) {
123
+ UsbEndpoint endpt = iface.getEndpoint(j);
124
+ switch (endpt.getDirection()) {
125
+ case UsbConstants.USB_DIR_IN:
126
+ if (mInputEndpoint == null) {
127
+ mInputEndpoint = endpt;
128
+ }
129
+ break;
130
+ case UsbConstants.USB_DIR_OUT:
131
+ if (mOutputEndpoint == null) {
132
+ mOutputEndpoint = endpt;
133
+ }
134
+ break;
135
+ }
136
+ }
137
+
138
+ // Make sure the required endpoints were present. The original Steam Controller and the wireless dongle for it do NOT
139
+ // actually have -- or require -- output endpoints, so we need to accept only an input one for them or else we'll fall
140
+ // back to the Android system gamepad functionality (and lose our paddles et al).
141
+ if (mInputEndpoint == null) {
142
+ Log.w(TAG, "Missing required endpoint on USB device " + getDeviceName());
143
+ mConnection.releaseInterface(iface);
144
+ close();
145
+ return false;
146
+ }
147
+
148
+ // Start listening for input
149
+ mRunning = true;
150
+ mInputThread = new InputThread();
151
+ mInputThread.start();
152
+
153
+ return true;
154
+ }
155
+
156
+ @Override
157
+ public int writeReport(byte[] report, boolean feature) {
158
+ if (mConnection == null) {
159
+ Log.w(TAG, "writeReport() called with no device connection");
160
+ return -1;
161
+ }
162
+
163
+ if (!mClaimed) {
164
+ Log.w(TAG, "writeReport() called but some other process currently owns the USB device");
165
+ return -1;
166
+ }
167
+
168
+ if (feature) {
169
+ int res = -1;
170
+ int offset = 0;
171
+ int length = report.length;
172
+ boolean skipped_report_id = false;
173
+ byte report_number = report[0];
174
+
175
+ if (report_number == 0x0) {
176
+ ++offset;
177
+ --length;
178
+ skipped_report_id = true;
179
+ }
180
+
181
+ res = mConnection.controlTransfer(
182
+ UsbConstants.USB_TYPE_CLASS | 0x01 /*RECIPIENT_INTERFACE*/ | UsbConstants.USB_DIR_OUT,
183
+ 0x09/*HID set_report*/,
184
+ (3/*HID feature*/ << 8) | report_number,
185
+ mInterface,
186
+ report, offset, length,
187
+ 1000/*timeout millis*/);
188
+
189
+ if (res < 0) {
190
+ Log.w(TAG, "writeFeatureReport() returned " + res + " on device " + getDeviceName());
191
+ return -1;
192
+ }
193
+
194
+ if (skipped_report_id) {
195
+ ++length;
196
+ }
197
+ return length;
198
+ } else {
199
+ if (mOutputEndpoint == null)
200
+ {
201
+ Log.e(TAG, "Tried to write an output report to an interface with no output endpoint!");
202
+ return -1;
203
+ }
204
+ int res = mConnection.bulkTransfer(mOutputEndpoint, report, report.length, 1000);
205
+ if (res != report.length) {
206
+ Log.w(TAG, "writeOutputReport() returned " + res + " on device " + getDeviceName());
207
+ }
208
+ return res;
209
+ }
210
+ }
211
+
212
+ @Override
213
+ public boolean readReport(byte[] report, boolean feature) {
214
+ int res = -1;
215
+ int offset = 0;
216
+ int length = report.length;
217
+ boolean skipped_report_id = false;
218
+ byte report_number = report[0];
219
+
220
+ if (mConnection == null) {
221
+ Log.w(TAG, "readReport() called with no device connection");
222
+ return false;
223
+ }
224
+ if (!mClaimed) {
225
+ if (feature) {
226
+ return false;
227
+ }
228
+ return true;
229
+ }
230
+
231
+ if (report_number == 0x0) {
232
+ /* Offset the return buffer by 1, so that the report ID
233
+ will remain in byte 0. */
234
+ ++offset;
235
+ --length;
236
+ skipped_report_id = true;
237
+ }
238
+
239
+ res = mConnection.controlTransfer(
240
+ UsbConstants.USB_TYPE_CLASS | 0x01 /*RECIPIENT_INTERFACE*/ | UsbConstants.USB_DIR_IN,
241
+ 0x01/*HID get_report*/,
242
+ ((feature ? 3/*HID feature*/ : 1/*HID Input*/) << 8) | report_number,
243
+ mInterface,
244
+ report, offset, length,
245
+ 1000/*timeout millis*/);
246
+
247
+ if (res < 0) {
248
+ Log.w(TAG, "getFeatureReport() returned " + res + " on device " + getDeviceName());
249
+ return false;
250
+ }
251
+
252
+ if (skipped_report_id) {
253
+ ++res;
254
+ ++length;
255
+ }
256
+
257
+ byte[] data;
258
+ if (res == length) {
259
+ data = report;
260
+ } else {
261
+ data = Arrays.copyOfRange(report, 0, res);
262
+ }
263
+ mManager.HIDDeviceReportResponse(mDeviceId, data);
264
+
265
+ return true;
266
+ }
267
+
268
+ @Override
269
+ public void close() {
270
+ mRunning = false;
271
+ if (mInputThread != null) {
272
+ while (mInputThread.isAlive()) {
273
+ mInputThread.interrupt();
274
+ try {
275
+ mInputThread.join();
276
+ } catch (InterruptedException e) {
277
+ // Keep trying until we're done
278
+ }
279
+ }
280
+ mInputThread = null;
281
+ }
282
+ if (mConnection != null) {
283
+ if (mClaimed) {
284
+ UsbInterface iface = mDevice.getInterface(mInterfaceIndex);
285
+ mConnection.releaseInterface(iface);
286
+ }
287
+ mConnection.close();
288
+ mConnection = null;
289
+ mClaimed = false;
290
+ }
291
+ }
292
+
293
+ @Override
294
+ public void shutdown() {
295
+ close();
296
+ mManager = null;
297
+ }
298
+
299
+ @Override
300
+ public void setFrozen(boolean frozen) {
301
+ mFrozen = frozen;
302
+
303
+ /* If we have a valid device connection and the claim state doesn't match what we want, try to correct that. */
304
+ if (mConnection != null && mClaimed == mFrozen) {
305
+ UsbInterface iface = mDevice.getInterface(mInterfaceIndex);
306
+ if (frozen) {
307
+ mClaimed = !mConnection.releaseInterface(iface);
308
+ if (mClaimed) {
309
+ Log.e(TAG, "Tried to release claim on USB device, but failed!");
310
+ }
311
+ } else {
312
+ mClaimed = mConnection.claimInterface(iface, true);
313
+ if (!mClaimed) {
314
+ Log.e(TAG, "Tried to regain claim on USB device, but failed!");
315
+ }
316
+ }
317
+ }
318
+ }
319
+
320
+ protected class InputThread extends Thread {
321
+ @Override
322
+ public void run() {
323
+ int packetSize = mInputEndpoint.getMaxPacketSize();
324
+ byte[] packet = new byte[packetSize];
325
+ while (mRunning) {
326
+ int r;
327
+ try
328
+ {
329
+ r = mConnection.bulkTransfer(mInputEndpoint, packet, packetSize, 1000);
330
+ }
331
+ catch (Exception e)
332
+ {
333
+ Log.v(TAG, "Exception in UsbDeviceConnection bulktransfer: " + e);
334
+ break;
335
+ }
336
+ if (r < 0) {
337
+ // Could be a timeout or an I/O error
338
+ }
339
+ if (r > 0) {
340
+ byte[] data;
341
+ if (r == packetSize) {
342
+ data = packet;
343
+ } else {
344
+ data = Arrays.copyOfRange(packet, 0, r);
345
+ }
346
+
347
+ if (!mFrozen) {
348
+ mManager.HIDDeviceInputReport(mDeviceId, data);
349
+ }
350
+ }
351
+ }
352
+ }
353
+ }
354
+ }
@@ -0,0 +1,90 @@
1
+ package org.libsdl.app;
2
+
3
+ import android.app.Activity;
4
+ import android.content.Context;
5
+
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
+ static public 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
+ static public 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
+ static public void setContext(Activity context) {
32
+ SDLAudioManager.setContext(context);
33
+ mContext = context;
34
+ }
35
+
36
+ static public Activity getContext() {
37
+ return mContext;
38
+ }
39
+
40
+ static void loadLibrary(String libraryName) throws UnsatisfiedLinkError, SecurityException, NullPointerException {
41
+ loadLibrary(libraryName, mContext);
42
+ }
43
+
44
+ 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 Activity mContext;
90
+ }