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.
- kivyforge/__init__.py +9 -0
- kivyforge/artifacts/__init__.py +41 -0
- kivyforge/artifacts/cache.py +81 -0
- kivyforge/artifacts/collect.py +354 -0
- kivyforge/artifacts/download.py +125 -0
- kivyforge/artifacts/frameworks.py +240 -0
- kivyforge/artifacts/native_stage_util.py +346 -0
- kivyforge/artifacts/runtime.py +65 -0
- kivyforge/artifacts/verify.py +45 -0
- kivyforge/artifacts/wheels.py +89 -0
- kivyforge/bundle/__init__.py +1 -0
- kivyforge/bundle/pycompile.py +161 -0
- kivyforge/cli/__init__.py +52 -0
- kivyforge/cli/_common.py +62 -0
- kivyforge/cli/_platform.py +84 -0
- kivyforge/cli/build.py +111 -0
- kivyforge/cli/clean.py +135 -0
- kivyforge/cli/doctor.py +52 -0
- kivyforge/cli/init.py +612 -0
- kivyforge/cli/init_writer.py +716 -0
- kivyforge/cli/lock.py +261 -0
- kivyforge/cli/open_cmd.py +15 -0
- kivyforge/cli/package.py +134 -0
- kivyforge/cli/run.py +162 -0
- kivyforge/cli/status.py +20 -0
- kivyforge/cli/upgrade.py +314 -0
- kivyforge/config/__init__.py +46 -0
- kivyforge/config/errors.py +43 -0
- kivyforge/config/icons.py +60 -0
- kivyforge/config/loader.py +3079 -0
- kivyforge/config/model.py +817 -0
- kivyforge/doctor/__init__.py +19 -0
- kivyforge/doctor/checks_common.py +95 -0
- kivyforge/doctor/probe.py +357 -0
- kivyforge/doctor/result.py +41 -0
- kivyforge/lock/__init__.py +42 -0
- kivyforge/lock/_pip_shim.py +63 -0
- kivyforge/lock/find_links.py +182 -0
- kivyforge/lock/model.py +69 -0
- kivyforge/lock/pep751.py +111 -0
- kivyforge/lock/reader.py +30 -0
- kivyforge/lock/resolver.py +124 -0
- kivyforge/lock/wheelruntime/__init__.py +70 -0
- kivyforge/lock/wheelruntime/builder.py +280 -0
- kivyforge/lock/wheelruntime/model.py +94 -0
- kivyforge/lock/wheelruntime/native_binaries.py +127 -0
- kivyforge/lock/wheelruntime/pbs_github.py +133 -0
- kivyforge/lock/wheelruntime/profile.py +104 -0
- kivyforge/lock/wheelruntime/resolver.py +248 -0
- kivyforge/lock/wheelruntime/runtime.py +161 -0
- kivyforge/lock/wheelruntime/serialize.py +245 -0
- kivyforge/platforms/__init__.py +114 -0
- kivyforge/platforms/android/__init__.py +140 -0
- kivyforge/platforms/android/adb.py +215 -0
- kivyforge/platforms/android/bootstrap/__init__.py +7 -0
- kivyforge/platforms/android/bootstrap/contract.py +166 -0
- kivyforge/platforms/android/bootstrap/render.py +244 -0
- kivyforge/platforms/android/bootstrap/templates/androidtest/KivyforgeContractTest.java +76 -0
- kivyforge/platforms/android/bootstrap/templates/bootstrap_py/_kivy_bootstrap.py +50 -0
- kivyforge/platforms/android/bootstrap/templates/bootstrap_py/_kivyforge_bootstrap.py +54 -0
- kivyforge/platforms/android/bootstrap/templates/bootstrap_py/_kivyforge_selftest.py +97 -0
- kivyforge/platforms/android/bootstrap/templates/cpp/CMakeLists.txt +20 -0
- kivyforge/platforms/android/bootstrap/templates/cpp/main.c +150 -0
- kivyforge/platforms/android/bootstrap/templates/java/org/jnius/NativeInvocationHandler.java +48 -0
- kivyforge/platforms/android/bootstrap/templates/java/org/kivy/android/PythonActivity.java +75 -0
- kivyforge/platforms/android/bootstrap/templates/java/org/kivy/android/PythonBundle.java +132 -0
- kivyforge/platforms/android/bootstrap/templates/java/org/kivy/android/PythonService.java +189 -0
- kivyforge/platforms/android/bootstrap/templates/java/org/renpy/android/Hardware.java +276 -0
- kivyforge/platforms/android/bootstrap/templates/sdl2/LICENSE-SDL.txt +18 -0
- kivyforge/platforms/android/bootstrap/templates/sdl2/SDL_REVISION.txt +3 -0
- kivyforge/platforms/android/bootstrap/templates/sdl2/org/libsdl/app/HIDDevice.java +22 -0
- kivyforge/platforms/android/bootstrap/templates/sdl2/org/libsdl/app/HIDDeviceBLESteamController.java +650 -0
- kivyforge/platforms/android/bootstrap/templates/sdl2/org/libsdl/app/HIDDeviceManager.java +698 -0
- kivyforge/platforms/android/bootstrap/templates/sdl2/org/libsdl/app/HIDDeviceUSB.java +309 -0
- kivyforge/platforms/android/bootstrap/templates/sdl2/org/libsdl/app/SDL.java +90 -0
- kivyforge/platforms/android/bootstrap/templates/sdl2/org/libsdl/app/SDLActivity.java +2120 -0
- kivyforge/platforms/android/bootstrap/templates/sdl2/org/libsdl/app/SDLAudioManager.java +514 -0
- kivyforge/platforms/android/bootstrap/templates/sdl2/org/libsdl/app/SDLControllerManager.java +856 -0
- kivyforge/platforms/android/bootstrap/templates/sdl2/org/libsdl/app/SDLSurface.java +405 -0
- kivyforge/platforms/android/bootstrap/templates/sdl3/LICENSE-SDL.txt +18 -0
- kivyforge/platforms/android/bootstrap/templates/sdl3/SDL_REVISION.txt +3 -0
- kivyforge/platforms/android/bootstrap/templates/sdl3/org/libsdl/app/HIDDevice.java +21 -0
- kivyforge/platforms/android/bootstrap/templates/sdl3/org/libsdl/app/HIDDeviceBLESteamController.java +829 -0
- kivyforge/platforms/android/bootstrap/templates/sdl3/org/libsdl/app/HIDDeviceManager.java +698 -0
- kivyforge/platforms/android/bootstrap/templates/sdl3/org/libsdl/app/HIDDeviceUSB.java +354 -0
- kivyforge/platforms/android/bootstrap/templates/sdl3/org/libsdl/app/SDL.java +90 -0
- kivyforge/platforms/android/bootstrap/templates/sdl3/org/libsdl/app/SDLActivity.java +2240 -0
- kivyforge/platforms/android/bootstrap/templates/sdl3/org/libsdl/app/SDLAudioManager.java +126 -0
- kivyforge/platforms/android/bootstrap/templates/sdl3/org/libsdl/app/SDLControllerManager.java +1010 -0
- kivyforge/platforms/android/bootstrap/templates/sdl3/org/libsdl/app/SDLDummyEdit.java +66 -0
- kivyforge/platforms/android/bootstrap/templates/sdl3/org/libsdl/app/SDLInputConnection.java +136 -0
- kivyforge/platforms/android/bootstrap/templates/sdl3/org/libsdl/app/SDLSensorManager.java +73 -0
- kivyforge/platforms/android/bootstrap/templates/sdl3/org/libsdl/app/SDLSurface.java +464 -0
- kivyforge/platforms/android/cli.py +1023 -0
- kivyforge/platforms/android/doctor.py +899 -0
- kivyforge/platforms/android/elf.py +148 -0
- kivyforge/platforms/android/generate/__init__.py +1 -0
- kivyforge/platforms/android/generate/manifest.py +261 -0
- kivyforge/platforms/android/generate/project.py +462 -0
- kivyforge/platforms/android/generate/services.py +187 -0
- kivyforge/platforms/android/gradle_wrapper/NOTICE +3 -0
- kivyforge/platforms/android/gradle_wrapper/SHA256SUMS +1 -0
- kivyforge/platforms/android/gradle_wrapper/gradle-wrapper.jar +0 -0
- kivyforge/platforms/android/gradle_wrapper/gradlew +164 -0
- kivyforge/platforms/android/gradle_wrapper/gradlew.bat +90 -0
- kivyforge/platforms/android/gradlew.py +60 -0
- kivyforge/platforms/android/icons.py +237 -0
- kivyforge/platforms/android/lock/__init__.py +1 -0
- kivyforge/platforms/android/lock/archives.py +109 -0
- kivyforge/platforms/android/lock/builder.py +387 -0
- kivyforge/platforms/android/lock/markers.py +71 -0
- kivyforge/platforms/android/lock/maven.py +252 -0
- kivyforge/platforms/android/lock/model.py +113 -0
- kivyforge/platforms/android/lock/python_meta.py +199 -0
- kivyforge/platforms/android/lock/reader.py +206 -0
- kivyforge/platforms/android/lock/resolver.py +276 -0
- kivyforge/platforms/android/lock/writer.py +121 -0
- kivyforge/platforms/android/policy.py +214 -0
- kivyforge/platforms/android/signing.py +145 -0
- kivyforge/platforms/android/smoke.py +43 -0
- kivyforge/platforms/android/splash.py +293 -0
- kivyforge/platforms/android/stage/__init__.py +1 -0
- kivyforge/platforms/android/stage/bundle.py +295 -0
- kivyforge/platforms/android/stage/jnilibs.py +186 -0
- kivyforge/platforms/android/stage/runtime.py +61 -0
- kivyforge/platforms/android/stage/wheels.py +106 -0
- kivyforge/platforms/android/toolchain.py +29 -0
- kivyforge/platforms/base.py +157 -0
- kivyforge/platforms/ios/__init__.py +129 -0
- kivyforge/platforms/ios/assets.py +193 -0
- kivyforge/platforms/ios/buildsettings.py +128 -0
- kivyforge/platforms/ios/cli.py +543 -0
- kivyforge/platforms/ios/doctor.py +410 -0
- kivyforge/platforms/ios/entitlements.py +34 -0
- kivyforge/platforms/ios/generator.py +318 -0
- kivyforge/platforms/ios/lock/__init__.py +71 -0
- kivyforge/platforms/ios/lock/builder.py +393 -0
- kivyforge/platforms/ios/lock/markers.py +69 -0
- kivyforge/platforms/ios/lock/model.py +95 -0
- kivyforge/platforms/ios/lock/python_meta.py +187 -0
- kivyforge/platforms/ios/lock/reader.py +191 -0
- kivyforge/platforms/ios/lock/resolver.py +304 -0
- kivyforge/platforms/ios/lock/spm.py +217 -0
- kivyforge/platforms/ios/lock/writer.py +114 -0
- kivyforge/platforms/ios/lock/xcframework.py +188 -0
- kivyforge/platforms/ios/materialize.py +59 -0
- kivyforge/platforms/ios/plist.py +91 -0
- kivyforge/platforms/ios/privacy.py +39 -0
- kivyforge/platforms/ios/skeleton.py +165 -0
- kivyforge/platforms/ios/sources.py +63 -0
- kivyforge/platforms/ios/staging.py +225 -0
- kivyforge/platforms/ios/swift_packages.py +324 -0
- kivyforge/platforms/ios/templates/kivyforge_bootstrap.h +34 -0
- kivyforge/platforms/ios/templates/kivyforge_bootstrap.m +146 -0
- kivyforge/platforms/ios/templates/main.m +15 -0
- kivyforge/platforms/ios/templates/main_config.h.in +12 -0
- kivyforge/platforms/ios/xcframeworks.py +194 -0
- kivyforge/platforms/ios/xcode/__init__.py +76 -0
- kivyforge/platforms/ios/xcode/commands.py +296 -0
- kivyforge/platforms/ios/xcode/runner.py +316 -0
- kivyforge/platforms/linux/__init__.py +120 -0
- kivyforge/platforms/linux/appimage.py +169 -0
- kivyforge/platforms/linux/bundle.py +235 -0
- kivyforge/platforms/linux/cli.py +232 -0
- kivyforge/platforms/linux/desktop.py +71 -0
- kivyforge/platforms/linux/doctor.py +438 -0
- kivyforge/platforms/linux/elftools.py +95 -0
- kivyforge/platforms/linux/icons.py +129 -0
- kivyforge/platforms/linux/launcher.py +107 -0
- kivyforge/platforms/linux/lock/__init__.py +126 -0
- kivyforge/platforms/linux/lock/profile.py +254 -0
- kivyforge/platforms/linux/lock/runtime.py +75 -0
- kivyforge/platforms/linux/native_stage.py +47 -0
- kivyforge/platforms/linux/runtime_stage.py +107 -0
- kivyforge/platforms/linux/wheels_stage.py +103 -0
- kivyforge/platforms/macos/__init__.py +121 -0
- kivyforge/platforms/macos/bundle.py +255 -0
- kivyforge/platforms/macos/cli.py +269 -0
- kivyforge/platforms/macos/doctor.py +480 -0
- kivyforge/platforms/macos/icns.py +75 -0
- kivyforge/platforms/macos/launcher.py +118 -0
- kivyforge/platforms/macos/lock/__init__.py +112 -0
- kivyforge/platforms/macos/lock/profile.py +119 -0
- kivyforge/platforms/macos/lock/runtime.py +58 -0
- kivyforge/platforms/macos/machotools.py +138 -0
- kivyforge/platforms/macos/native_stage.py +47 -0
- kivyforge/platforms/macos/notarize.py +143 -0
- kivyforge/platforms/macos/plist.py +37 -0
- kivyforge/platforms/macos/runtime_stage.py +110 -0
- kivyforge/platforms/macos/signing.py +78 -0
- kivyforge/platforms/macos/wheels_stage.py +108 -0
- kivyforge/platforms/windows/__init__.py +133 -0
- kivyforge/platforms/windows/assets.py +76 -0
- kivyforge/platforms/windows/bundle.py +298 -0
- kivyforge/platforms/windows/cli.py +314 -0
- kivyforge/platforms/windows/doctor.py +563 -0
- kivyforge/platforms/windows/fsswap.py +87 -0
- kivyforge/platforms/windows/icons.py +64 -0
- kivyforge/platforms/windows/launcher/__init__.py +193 -0
- kivyforge/platforms/windows/launcher/build_launcher.py +507 -0
- kivyforge/platforms/windows/launcher/launcher.c +379 -0
- kivyforge/platforms/windows/lock/__init__.py +112 -0
- kivyforge/platforms/windows/lock/profile.py +101 -0
- kivyforge/platforms/windows/lock/runtime.py +64 -0
- kivyforge/platforms/windows/naming.py +52 -0
- kivyforge/platforms/windows/native_stage.py +66 -0
- kivyforge/platforms/windows/petools.py +98 -0
- kivyforge/platforms/windows/rcedit.py +116 -0
- kivyforge/platforms/windows/runtime_stage.py +221 -0
- kivyforge/platforms/windows/signing.py +168 -0
- kivyforge/platforms/windows/vendor/LICENSE.rcedit +29 -0
- kivyforge/platforms/windows/vendor/NOTICE +17 -0
- kivyforge/platforms/windows/vendor/SHA256SUMS +4 -0
- kivyforge/platforms/windows/vendor/TOOLSET.txt +4 -0
- kivyforge/platforms/windows/vendor/__init__.py +12 -0
- kivyforge/platforms/windows/vendor/fetch_rcedit.py +97 -0
- kivyforge/platforms/windows/vendor/launcher-amd64.exe +0 -0
- kivyforge/platforms/windows/vendor/rcedit-x64.exe +0 -0
- kivyforge/platforms/windows/wheels_stage.py +139 -0
- kivyforge-3.0.0.dev0.dist-info/METADATA +609 -0
- kivyforge-3.0.0.dev0.dist-info/RECORD +225 -0
- kivyforge-3.0.0.dev0.dist-info/WHEEL +5 -0
- kivyforge-3.0.0.dev0.dist-info/entry_points.txt +3 -0
- kivyforge-3.0.0.dev0.dist-info/licenses/LICENSE +21 -0
- 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
|
+
}
|