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,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
|
+
}
|