Add Controller capability
This commit is contained in:
@@ -38,10 +38,10 @@ implements Parcelable {
|
|||||||
final int mAction;
|
final int mAction;
|
||||||
final int mKeyCode;
|
final int mKeyCode;
|
||||||
|
|
||||||
public KeyEvent(long l2, int n2, int n3, int n4) {
|
public KeyEvent(long eventTime, int controllerId, int keyCode, int action) {
|
||||||
super(l2, n2);
|
super(eventTime, controllerId);
|
||||||
this.mKeyCode = n3;
|
this.mKeyCode = keyCode;
|
||||||
this.mAction = n4;
|
this.mAction = action;
|
||||||
}
|
}
|
||||||
|
|
||||||
KeyEvent(Parcel parcel) {
|
KeyEvent(Parcel parcel) {
|
||||||
|
|||||||
@@ -26,16 +26,25 @@ implements Parcelable {
|
|||||||
final SparseArray<Float> mAxis;
|
final SparseArray<Float> mAxis;
|
||||||
final SparseArray<Float> mPrecision;
|
final SparseArray<Float> mPrecision;
|
||||||
|
|
||||||
public MotionEvent(long l2, int n2, float f2, float f3, float f4, float f5, float f6, float f7) {
|
public MotionEvent(
|
||||||
super(l2, n2);
|
long eventTime,
|
||||||
|
int controllerId,
|
||||||
|
float f2,
|
||||||
|
float f3,
|
||||||
|
float f4,
|
||||||
|
float f5,
|
||||||
|
float xPrecision,
|
||||||
|
float yPrecision
|
||||||
|
) {
|
||||||
|
super(eventTime, controllerId);
|
||||||
this.mAxis = new SparseArray(4);
|
this.mAxis = new SparseArray(4);
|
||||||
this.mAxis.put(0, f2);
|
this.mAxis.put(0, f2);
|
||||||
this.mAxis.put(1, f3);
|
this.mAxis.put(1, f3);
|
||||||
this.mAxis.put(11, f4);
|
this.mAxis.put(11, f4);
|
||||||
this.mAxis.put(14, f5);
|
this.mAxis.put(14, f5);
|
||||||
this.mPrecision = new SparseArray(2);
|
this.mPrecision = new SparseArray(2);
|
||||||
this.mPrecision.put(0, f6);
|
this.mPrecision.put(0, xPrecision);
|
||||||
this.mPrecision.put(1, f7);
|
this.mPrecision.put(1, yPrecision);
|
||||||
}
|
}
|
||||||
|
|
||||||
public MotionEvent(long l2, int n2, int[] nArray, float[] fArray, int[] nArray2, float[] fArray2) {
|
public MotionEvent(long l2, int n2, int[] nArray, float[] fArray, int[] nArray2, float[] fArray2) {
|
||||||
@@ -43,8 +52,7 @@ implements Parcelable {
|
|||||||
int n3 = nArray.length;
|
int n3 = nArray.length;
|
||||||
this.mAxis = new SparseArray(n3);
|
this.mAxis = new SparseArray(n3);
|
||||||
n2 = 0;
|
n2 = 0;
|
||||||
while (true) {
|
while (n2 < n3) {
|
||||||
if (n2 >= n3) break;
|
|
||||||
this.mAxis.put(nArray[n2], fArray[n2]);
|
this.mAxis.put(nArray[n2], fArray[n2]);
|
||||||
++n2;
|
++n2;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -29,10 +29,10 @@ implements Parcelable {
|
|||||||
final int mAction;
|
final int mAction;
|
||||||
final int mState;
|
final int mState;
|
||||||
|
|
||||||
public StateEvent(long l2, int n2, int n3, int n4) {
|
public StateEvent(long eventTime, int controllerId, int state, int action) {
|
||||||
super(l2, n2);
|
super(eventTime, controllerId);
|
||||||
this.mState = n3;
|
this.mState = state;
|
||||||
this.mAction = n4;
|
this.mAction = action;
|
||||||
}
|
}
|
||||||
|
|
||||||
StateEvent(Parcel parcel) {
|
StateEvent(Parcel parcel) {
|
||||||
|
|||||||
@@ -1,189 +0,0 @@
|
|||||||
package com.ea.InAppWebBrowser;
|
|
||||||
|
|
||||||
import android.app.Activity;
|
|
||||||
import android.graphics.Paint;
|
|
||||||
import android.view.MotionEvent;
|
|
||||||
import android.view.View;
|
|
||||||
import android.view.ViewGroup;
|
|
||||||
import android.webkit.WebView;
|
|
||||||
import android.widget.RelativeLayout;
|
|
||||||
import com.ea.easp.VirtualKeyboardAndroidDelegate;
|
|
||||||
import java.util.UUID;
|
|
||||||
|
|
||||||
public class BrowserAndroid {
|
|
||||||
public static int gInstanceCount = 0;
|
|
||||||
public static Activity mActivity;
|
|
||||||
public static ViewGroup mViewGroup;
|
|
||||||
public final int JAVASCRIPT_DISABLE = 0;
|
|
||||||
public final int JAVASCRIPT_ENABLE = 1;
|
|
||||||
public final int SCROLLBARSTYLE_DEFAULT = 0;
|
|
||||||
public final int SCROLLBARSTYLE_INSIDE_INSET = 2;
|
|
||||||
public final int SCROLLBARSTYLE_INSIDE_OVERLAY = 1;
|
|
||||||
public final int SCROLLBARSTYLE_OUTSIDE_INSET = 4;
|
|
||||||
public final int SCROLLBARSTYLE_OUTSIDE_OVERLAY = 3;
|
|
||||||
public final int SCROLLBAR_INVISIBLE = 1;
|
|
||||||
public final int SCROLLBAR_VISIBLE = 0;
|
|
||||||
public int mInstanceID = 0;
|
|
||||||
public RelativeLayout mLayout;
|
|
||||||
public WebView mWebView;
|
|
||||||
public InAppWebBrowserWebViewClient mWebViewClient;
|
|
||||||
|
|
||||||
public static void Shutdown() {
|
|
||||||
ShutdownNativeImpl();
|
|
||||||
}
|
|
||||||
|
|
||||||
private static native void ShutdownNativeImpl();
|
|
||||||
|
|
||||||
public static void Startup(Activity activity, ViewGroup viewGroup) {
|
|
||||||
mActivity = activity;
|
|
||||||
mViewGroup = viewGroup;
|
|
||||||
StartupNativeImpl();
|
|
||||||
}
|
|
||||||
|
|
||||||
private static native void StartupNativeImpl();
|
|
||||||
|
|
||||||
public void EvaluateJavaScript(final String str) {
|
|
||||||
mActivity.runOnUiThread(new Runnable() {
|
|
||||||
/* class com.ea.InAppWebBrowser.BrowserAndroid.AnonymousClass5 */
|
|
||||||
|
|
||||||
public void run() {
|
|
||||||
UUID randomUUID;
|
|
||||||
do {
|
|
||||||
randomUUID = UUID.randomUUID();
|
|
||||||
} while (!BrowserAndroid.this.mWebViewClient.addUUID(randomUUID));
|
|
||||||
BrowserAndroid.this.mWebView.loadUrl("javascript: JavascriptCallback.ReceiveResult(eval(" + str + "), '" + randomUUID.toString() + "');");
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
public void LoadHTML(final String str) {
|
|
||||||
mActivity.runOnUiThread(new Runnable() {
|
|
||||||
/* class com.ea.InAppWebBrowser.BrowserAndroid.AnonymousClass3 */
|
|
||||||
|
|
||||||
public void run() {
|
|
||||||
BrowserAndroid.this.mWebView.loadData(str, "text/html", null);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
public void OpenUrl(final String str) {
|
|
||||||
mActivity.runOnUiThread(new Runnable() {
|
|
||||||
/* class com.ea.InAppWebBrowser.BrowserAndroid.AnonymousClass2 */
|
|
||||||
|
|
||||||
public void run() {
|
|
||||||
BrowserAndroid.this.mWebView.loadUrl(str);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
public void SetViewFrame(final int i, final int i2, final int i3, final int i4) {
|
|
||||||
if (this.mWebView != null) {
|
|
||||||
mActivity.runOnUiThread(new Runnable() {
|
|
||||||
/* class com.ea.InAppWebBrowser.BrowserAndroid.AnonymousClass4 */
|
|
||||||
|
|
||||||
public void run() {
|
|
||||||
RelativeLayout.LayoutParams layoutParams = new RelativeLayout.LayoutParams(i3, i4);
|
|
||||||
layoutParams.leftMargin = i;
|
|
||||||
layoutParams.topMargin = i2;
|
|
||||||
BrowserAndroid.this.mLayout.updateViewLayout(BrowserAndroid.this.mWebView, layoutParams);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public void destroy() {
|
|
||||||
mActivity.runOnUiThread(new Runnable() {
|
|
||||||
/* class com.ea.InAppWebBrowser.BrowserAndroid.AnonymousClass6 */
|
|
||||||
|
|
||||||
public void run() {
|
|
||||||
BrowserAndroid.this.mWebView.stopLoading();
|
|
||||||
BrowserAndroid.this.mWebView.setWebViewClient(null);
|
|
||||||
BrowserAndroid.this.mWebViewClient = null;
|
|
||||||
BrowserAndroid.this.mLayout.removeView(BrowserAndroid.this.mWebView);
|
|
||||||
BrowserAndroid.mViewGroup.removeView(BrowserAndroid.this.mLayout);
|
|
||||||
BrowserAndroid.this.mWebView = null;
|
|
||||||
BrowserAndroid.this.mLayout = null;
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
public void init(final int i, final int i2, final int i3, final int i4, final int i5, final int i6, final int i7, final boolean z, final boolean z2) {
|
|
||||||
int i8 = gInstanceCount;
|
|
||||||
gInstanceCount = i8 + 1;
|
|
||||||
this.mInstanceID = i8;
|
|
||||||
mActivity.runOnUiThread(new Runnable() {
|
|
||||||
/* class com.ea.InAppWebBrowser.BrowserAndroid.AnonymousClass1 */
|
|
||||||
|
|
||||||
public void run() {
|
|
||||||
boolean z = true;
|
|
||||||
BrowserAndroid.this.mLayout = new RelativeLayout(BrowserAndroid.mActivity);
|
|
||||||
BrowserAndroid.this.mWebView = new WebView(BrowserAndroid.mActivity);
|
|
||||||
BrowserAndroid.this.mWebViewClient = new InAppWebBrowserWebViewClient();
|
|
||||||
BrowserAndroid.this.mWebViewClient.mInstanceID = BrowserAndroid.this.mInstanceID;
|
|
||||||
BrowserAndroid.this.mWebView.setWebViewClient(BrowserAndroid.this.mWebViewClient);
|
|
||||||
if (z2) {
|
|
||||||
BrowserAndroid.this.mWebView.setBackgroundColor(0);
|
|
||||||
Class<?> cls = BrowserAndroid.this.mWebView.getClass();
|
|
||||||
try {
|
|
||||||
cls.getMethod("setLayerType", Integer.TYPE, Paint.class).invoke(BrowserAndroid.this.mWebView, Integer.valueOf(((Integer) cls.getField("LAYER_TYPE_SOFTWARE").get(BrowserAndroid.this.mWebView)).intValue()), null);
|
|
||||||
} catch (Exception e) {
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (!z) {
|
|
||||||
Class<?> cls2 = BrowserAndroid.this.mWebView.getClass();
|
|
||||||
try {
|
|
||||||
cls2.getMethod("setOverScrollMode", Integer.TYPE).invoke(BrowserAndroid.this.mWebView, Integer.valueOf(((Integer) cls2.getField("OVER_SCROLL_NEVER").get(BrowserAndroid.this.mWebView)).intValue()));
|
|
||||||
} catch (Exception e2) {
|
|
||||||
}
|
|
||||||
}
|
|
||||||
//BrowserAndroid.this.mWebView.requestFocus(TransportMediator.KEYCODE_MEDIA_RECORD);
|
|
||||||
BrowserAndroid.this.mWebView.setOnTouchListener(new View.OnTouchListener() {
|
|
||||||
/* class com.ea.InAppWebBrowser.BrowserAndroid.AnonymousClass1.AnonymousClass1 */
|
|
||||||
|
|
||||||
public boolean onTouch(View view, MotionEvent motionEvent) {
|
|
||||||
switch (motionEvent.getAction()) {
|
|
||||||
case 0:
|
|
||||||
case 1:
|
|
||||||
if (view.hasFocus()) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
view.requestFocus();
|
|
||||||
return false;
|
|
||||||
default:
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
});
|
|
||||||
if (i5 == 1) {
|
|
||||||
BrowserAndroid.this.mWebView.getSettings().setJavaScriptEnabled(true);
|
|
||||||
}
|
|
||||||
BrowserAndroid.this.mWebView.setVerticalScrollBarEnabled(i6 == 0);
|
|
||||||
WebView webView = BrowserAndroid.this.mWebView;
|
|
||||||
if (i6 != 0) {
|
|
||||||
z = false;
|
|
||||||
}
|
|
||||||
webView.setHorizontalScrollBarEnabled(z);
|
|
||||||
BrowserAndroid.this.mWebView.addJavascriptInterface(new JavascriptInterface(BrowserAndroid.this.mWebViewClient), "JavascriptCallback");
|
|
||||||
switch (i7) {
|
|
||||||
case 1:
|
|
||||||
BrowserAndroid.this.mWebView.setScrollBarStyle(0);
|
|
||||||
break;
|
|
||||||
case 2:
|
|
||||||
BrowserAndroid.this.mWebView.setScrollBarStyle(16777216);
|
|
||||||
break;
|
|
||||||
case 3:
|
|
||||||
BrowserAndroid.this.mWebView.setScrollBarStyle(VirtualKeyboardAndroidDelegate.IME_FLAG_NO_FULLSCREEN);
|
|
||||||
break;
|
|
||||||
case 4:
|
|
||||||
BrowserAndroid.this.mWebView.setScrollBarStyle(50331648);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
RelativeLayout.LayoutParams layoutParams = new RelativeLayout.LayoutParams(i3, i4);
|
|
||||||
layoutParams.leftMargin = i;
|
|
||||||
layoutParams.topMargin = i2;
|
|
||||||
BrowserAndroid.this.mLayout.addView(BrowserAndroid.this.mWebView, layoutParams);
|
|
||||||
BrowserAndroid.mViewGroup.addView(BrowserAndroid.this.mLayout);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,68 +0,0 @@
|
|||||||
package com.ea.InAppWebBrowser;
|
|
||||||
|
|
||||||
import android.graphics.Bitmap;
|
|
||||||
import android.util.Log;
|
|
||||||
import android.webkit.WebView;
|
|
||||||
import android.webkit.WebViewClient;
|
|
||||||
import java.util.Collections;
|
|
||||||
import java.util.SortedSet;
|
|
||||||
import java.util.TreeSet;
|
|
||||||
import java.util.UUID;
|
|
||||||
|
|
||||||
public class InAppWebBrowserWebViewClient extends WebViewClient {
|
|
||||||
public int mInstanceID = 0;
|
|
||||||
private SortedSet<UUID> mJavascriptIds = Collections.synchronizedSortedSet(new TreeSet());
|
|
||||||
|
|
||||||
public native void OnJavascriptResult(String str, int i);
|
|
||||||
|
|
||||||
public native void OnLoadError(String str, int i);
|
|
||||||
|
|
||||||
public native void OnLoadFinished(String str, int i);
|
|
||||||
|
|
||||||
public native void OnLoadStarted(String str, int i);
|
|
||||||
|
|
||||||
public native boolean ShouldLoadURL(String str, int i);
|
|
||||||
|
|
||||||
public boolean addUUID(UUID uuid) {
|
|
||||||
if (this.mJavascriptIds.contains(uuid)) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
this.mJavascriptIds.add(uuid);
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void onJavascriptResult(String str, String str2) throws Exception {
|
|
||||||
UUID fromString = UUID.fromString(str2);
|
|
||||||
if (fromString == null || !this.mJavascriptIds.contains(fromString)) {
|
|
||||||
throw new Exception("Unable to verify validity of script result.");
|
|
||||||
}
|
|
||||||
this.mJavascriptIds.remove(fromString);
|
|
||||||
OnJavascriptResult(str, this.mInstanceID);
|
|
||||||
}
|
|
||||||
|
|
||||||
public void onLoadResource(WebView webView, String str) {
|
|
||||||
Log.e("InAppWebBrowserWebViewClient", "onLoadResource: " + str);
|
|
||||||
OnLoadStarted(str, this.mInstanceID);
|
|
||||||
}
|
|
||||||
|
|
||||||
public void onPageFinished(WebView webView, String str) {
|
|
||||||
Log.e("InAppWebBrowserWebViewClient", "onPageFinished: " + str);
|
|
||||||
OnLoadFinished(str, this.mInstanceID);
|
|
||||||
}
|
|
||||||
|
|
||||||
public void onPageStarted(WebView webView, String str, Bitmap bitmap) {
|
|
||||||
Log.e("InAppWebBrowserWebViewClient", "onPageStarted: " + str);
|
|
||||||
OnLoadStarted(str, this.mInstanceID);
|
|
||||||
}
|
|
||||||
|
|
||||||
public void onReceivedError(WebView webView, int i, String str, String str2) {
|
|
||||||
Log.e("InAppWebBrowserWebViewClient", "onReceivedError");
|
|
||||||
OnLoadError("Loading Error. URL: " + str2 + " ErrorCode: " + i + " Description: " + str, this.mInstanceID);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override // android.webkit.WebViewClient
|
|
||||||
public boolean shouldOverrideUrlLoading(WebView webView, String str) {
|
|
||||||
Log.e("InAppWebBrowserWebViewClient", "shouldOverrideUrlLoading: " + str);
|
|
||||||
return !ShouldLoadURL(str, this.mInstanceID);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,13 +0,0 @@
|
|||||||
package com.ea.InAppWebBrowser;
|
|
||||||
|
|
||||||
public class JavascriptInterface {
|
|
||||||
private InAppWebBrowserWebViewClient mWebViewClient;
|
|
||||||
|
|
||||||
public JavascriptInterface(InAppWebBrowserWebViewClient inAppWebBrowserWebViewClient) {
|
|
||||||
this.mWebViewClient = inAppWebBrowserWebViewClient;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void ReceiveResult(String str, String str2) throws Exception {
|
|
||||||
this.mWebViewClient.onJavascriptResult(str, str2);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,72 +0,0 @@
|
|||||||
package com.ea.InputMan;
|
|
||||||
|
|
||||||
import androidx.fragment.app.FragmentTransaction;
|
|
||||||
import androidx.core.view.MotionEventCompat;
|
|
||||||
import android.view.MotionEvent;
|
|
||||||
|
|
||||||
public class InputMan {
|
|
||||||
private boolean gbMotionEvent_GetSource = false;
|
|
||||||
|
|
||||||
public InputMan() {
|
|
||||||
try {
|
|
||||||
MotionEvent.class.getMethod("getSource");
|
|
||||||
this.gbMotionEvent_GetSource = true;
|
|
||||||
} catch (Exception e) {
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private static int GetEventType(int i) {
|
|
||||||
switch (i) {
|
|
||||||
case 0:
|
|
||||||
case 4:
|
|
||||||
case 5:
|
|
||||||
default:
|
|
||||||
return 0;
|
|
||||||
case 1:
|
|
||||||
case 6:
|
|
||||||
return 2;
|
|
||||||
case 2:
|
|
||||||
return 1;
|
|
||||||
case 3:
|
|
||||||
return 3;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private int GetSource(MotionEvent motionEvent) {
|
|
||||||
if (!this.gbMotionEvent_GetSource) {
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
int source = motionEvent.getSource();
|
|
||||||
if ((source & 2) == 0) {
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
switch (source) {
|
|
||||||
case 1048584:
|
|
||||||
return 10;
|
|
||||||
case FragmentTransaction.TRANSIT_FRAGMENT_CLOSE:
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
private static native boolean InputMan_OnMotionEvent(int i, int i2, float f, float f2, int i3, float f3);
|
|
||||||
|
|
||||||
public boolean onTouchEvent(int i, MotionEvent motionEvent) {
|
|
||||||
boolean z = false;
|
|
||||||
int historySize = motionEvent.getHistorySize();
|
|
||||||
int pointerCount = motionEvent.getPointerCount();
|
|
||||||
int GetSource = GetSource(motionEvent);
|
|
||||||
int GetEventType = GetEventType(motionEvent.getAction() & MotionEventCompat.ACTION_MASK);
|
|
||||||
if (GetSource >= 0) {
|
|
||||||
for (int i2 = 0; i2 < historySize; i2++) {
|
|
||||||
for (int i3 = 0; i3 < pointerCount; i3++) {
|
|
||||||
InputMan_OnMotionEvent(i, motionEvent.getPointerId(i3), motionEvent.getHistoricalX(i3, i2), motionEvent.getHistoricalY(i3, i2), GetEventType, motionEvent.getHistoricalPressure(i3, i2));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
for (int i4 = 0; i4 < pointerCount; i4++) {
|
|
||||||
z = InputMan_OnMotionEvent(i, motionEvent.getPointerId(i4), motionEvent.getX(i4), motionEvent.getY(i4), GetEventType, motionEvent.getPressure(i4));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return z;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -46,11 +46,6 @@ class EASPHandler(
|
|||||||
initJNI()
|
initJNI()
|
||||||
DeviceInfoUtil.init()
|
DeviceInfoUtil.init()
|
||||||
PackageUtil.init()
|
PackageUtil.init()
|
||||||
//this.mFacebookAgent = new FacebookAgentJNI(mActivity, this.mTaskLauncher);
|
|
||||||
//this.mFacebookAgent.init();
|
|
||||||
//BrowserAndroid.Startup(mActivity, mViewGroup);
|
|
||||||
//this.mAndroidMarketJNI = new MarketJNI(mActivity, this.mTaskLauncher, MarketJNI.StoreType.UNKNOWN);
|
|
||||||
//this.mAndroidMarketJNI.init();
|
|
||||||
mPhysicalKeyboard = PhysicalKeyboardAndroid(mTaskLauncher)
|
mPhysicalKeyboard = PhysicalKeyboardAndroid(mTaskLauncher)
|
||||||
Debug.Log.d(this.javaClass.name, "...onCreate()")
|
Debug.Log.d(this.javaClass.name, "...onCreate()")
|
||||||
}
|
}
|
||||||
@@ -58,9 +53,6 @@ class EASPHandler(
|
|||||||
fun onDestroy() {
|
fun onDestroy() {
|
||||||
Debug.Log.d(this.javaClass.name, "onDestroy()...")
|
Debug.Log.d(this.javaClass.name, "onDestroy()...")
|
||||||
mPhysicalKeyboard = null
|
mPhysicalKeyboard = null
|
||||||
//this.mAndroidMarketJNI.shutdown();
|
|
||||||
//BrowserAndroid.Shutdown();
|
|
||||||
//this.mFacebookAgent.shutdown();
|
|
||||||
PackageUtil.shutdown()
|
PackageUtil.shutdown()
|
||||||
DeviceInfoUtil.shutdown()
|
DeviceInfoUtil.shutdown()
|
||||||
shutdownJNI()
|
shutdownJNI()
|
||||||
|
|||||||
@@ -19,6 +19,7 @@ import androidx.compose.ui.platform.ComposeView
|
|||||||
import androidx.lifecycle.Lifecycle
|
import androidx.lifecycle.Lifecycle
|
||||||
import androidx.lifecycle.LifecycleOwner
|
import androidx.lifecycle.LifecycleOwner
|
||||||
import androidx.lifecycle.LifecycleRegistry
|
import androidx.lifecycle.LifecycleRegistry
|
||||||
|
import com.bda.controller.StateEvent
|
||||||
|
|
||||||
|
|
||||||
class ComposeFrameLayout @JvmOverloads constructor(
|
class ComposeFrameLayout @JvmOverloads constructor(
|
||||||
@@ -32,13 +33,16 @@ class ComposeFrameLayout @JvmOverloads constructor(
|
|||||||
addView(
|
addView(
|
||||||
ComposeView(context).apply {
|
ComposeView(context).apply {
|
||||||
setContent {
|
setContent {
|
||||||
Box{
|
/*Box{
|
||||||
Button(onClick = {
|
Button(onClick = {
|
||||||
Toast.makeText(context, "Hello!", Toast.LENGTH_LONG).show()
|
|
||||||
|
var event = StateEvent(System.currentTimeMillis(), 1, StateEvent.STATE_CONNECTION, StateEvent.ACTION_CONNECTED)
|
||||||
|
|
||||||
|
//MogaController.nativeOnStateEvent(event)
|
||||||
}) {
|
}) {
|
||||||
Text("ComposeButton")
|
Text("ComposeButton")
|
||||||
}
|
}
|
||||||
}
|
}*/
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -1,11 +1,13 @@
|
|||||||
package com.ea.ironmonkey
|
package com.ea.ironmonkey
|
||||||
|
|
||||||
|
import android.annotation.SuppressLint
|
||||||
import android.app.AlertDialog
|
import android.app.AlertDialog
|
||||||
import android.content.DialogInterface
|
import android.content.DialogInterface
|
||||||
import android.content.Intent
|
import android.content.Intent
|
||||||
import android.content.pm.ActivityInfo
|
import android.content.pm.ActivityInfo
|
||||||
import android.graphics.BitmapFactory
|
import android.graphics.BitmapFactory
|
||||||
import android.hardware.SensorManager
|
import android.hardware.SensorManager
|
||||||
|
import android.hardware.input.InputManager
|
||||||
import android.media.AudioManager
|
import android.media.AudioManager
|
||||||
import android.opengl.GLES20
|
import android.opengl.GLES20
|
||||||
import android.opengl.GLUtils
|
import android.opengl.GLUtils
|
||||||
@@ -15,17 +17,26 @@ import android.os.PowerManager
|
|||||||
import android.os.PowerManager.WakeLock
|
import android.os.PowerManager.WakeLock
|
||||||
import android.util.DisplayMetrics
|
import android.util.DisplayMetrics
|
||||||
import android.util.Log
|
import android.util.Log
|
||||||
|
import android.view.InputDevice
|
||||||
import android.view.KeyEvent
|
import android.view.KeyEvent
|
||||||
|
import android.view.MotionEvent
|
||||||
import android.view.inputmethod.InputMethodManager
|
import android.view.inputmethod.InputMethodManager
|
||||||
import androidx.activity.ComponentActivity
|
import androidx.activity.ComponentActivity
|
||||||
|
import androidx.activity.compose.setContent
|
||||||
import androidx.lifecycle.Lifecycle
|
import androidx.lifecycle.Lifecycle
|
||||||
|
import com.bda.controller.StateEvent
|
||||||
import com.ea.EAIO.EAIO
|
import com.ea.EAIO.EAIO
|
||||||
import com.ea.EAMIO.StorageDirectory
|
import com.ea.EAMIO.StorageDirectory
|
||||||
import com.ea.easp.EASPHandler
|
import com.ea.easp.EASPHandler
|
||||||
import com.ea.games.nfs13_na.BuildConfig
|
import com.ea.games.nfs13_na.BuildConfig
|
||||||
import com.ea.games.nfs13_na.R
|
import com.ea.games.nfs13_na.R
|
||||||
import com.ea.nimble.ApplicationLifecycle
|
import com.ea.nimble.ApplicationLifecycle
|
||||||
import com.megboyzz.devmenu.util.SaveFileObserver
|
import com.megboyzz.actionForAllControllers
|
||||||
|
import com.megboyzz.androidKeyEventToBda
|
||||||
|
import com.megboyzz.androidMotionEventToBda
|
||||||
|
import com.megboyzz.createConnectEvent
|
||||||
|
import com.megboyzz.createDisconnectEvent
|
||||||
|
import com.megboyzz.registerControllerHandlers
|
||||||
import java.io.BufferedReader
|
import java.io.BufferedReader
|
||||||
import java.io.File
|
import java.io.File
|
||||||
import java.io.FileReader
|
import java.io.FileReader
|
||||||
@@ -60,8 +71,6 @@ class GameActivity : ComponentActivity(), DrawFrameListener {
|
|||||||
private val saveFile = "/data/data/${BuildConfig.APPLICATION_ID}/files/var/nfstr_save.sb"
|
private val saveFile = "/data/data/${BuildConfig.APPLICATION_ID}/files/var/nfstr_save.sb"
|
||||||
private val dest = "/sdcard/Android/data/${BuildConfig.APPLICATION_ID}/files/saveTracking"
|
private val dest = "/sdcard/Android/data/${BuildConfig.APPLICATION_ID}/files/saveTracking"
|
||||||
|
|
||||||
private val saveFileObserver = com.megboyzz.devmenu.util.SaveFileObserver(saveFile, dest)
|
|
||||||
|
|
||||||
companion object {
|
companion object {
|
||||||
|
|
||||||
const val STATE_RESTORE_CONTEXT = 7
|
const val STATE_RESTORE_CONTEXT = 7
|
||||||
@@ -120,6 +129,7 @@ class GameActivity : ComponentActivity(), DrawFrameListener {
|
|||||||
Log.w(this.localClassName, "Missing WAKE_LOCK permission.")
|
Log.w(this.localClassName, "Missing WAKE_LOCK permission.")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
this.assets
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun wakeLockRelease() {
|
private fun wakeLockRelease() {
|
||||||
@@ -295,10 +305,24 @@ class GameActivity : ComponentActivity(), DrawFrameListener {
|
|||||||
|
|
||||||
public override fun onCreate(bundle: Bundle?) {
|
public override fun onCreate(bundle: Bundle?) {
|
||||||
|
|
||||||
saveFileObserver.startWatching()
|
|
||||||
|
|
||||||
super.onCreate(bundle)
|
super.onCreate(bundle)
|
||||||
|
|
||||||
|
registerControllerHandlers(
|
||||||
|
onInputDeviceAdded = {
|
||||||
|
Log.i("Controller", "controller is connected!")
|
||||||
|
val event = createConnectEvent(it)
|
||||||
|
MogaController.nativeOnStateEvent(event)
|
||||||
|
},
|
||||||
|
onInputDeviceRemoved = {
|
||||||
|
Log.i("Controller", "controller is disconnected!")
|
||||||
|
val event = createDisconnectEvent(it)
|
||||||
|
MogaController.nativeOnStateEvent(event)
|
||||||
|
},
|
||||||
|
onInputDeviceChanged = {
|
||||||
|
Log.i("Controller", "controller is changed!")
|
||||||
|
}
|
||||||
|
)
|
||||||
|
|
||||||
val className = this.localClassName
|
val className = this.localClassName
|
||||||
val currentState = lifecycle.currentState
|
val currentState = lifecycle.currentState
|
||||||
|
|
||||||
@@ -347,13 +371,12 @@ class GameActivity : ComponentActivity(), DrawFrameListener {
|
|||||||
ApplicationLifecycle.onActivityCreate(bundle, this)
|
ApplicationLifecycle.onActivityCreate(bundle, this)
|
||||||
Log.d(className, "nativeOnCreate")
|
Log.d(className, "nativeOnCreate")
|
||||||
nativeOnCreate()
|
nativeOnCreate()
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
public override fun onDestroy() {
|
public override fun onDestroy() {
|
||||||
|
|
||||||
saveFileObserver.stopWatching()
|
|
||||||
|
|
||||||
Log.i("Debug", "onDestroy")
|
Log.i("Debug", "onDestroy")
|
||||||
Log.i(this.localClassName, "onDestroy")
|
Log.i(this.localClassName, "onDestroy")
|
||||||
super.onDestroy()
|
super.onDestroy()
|
||||||
@@ -367,7 +390,27 @@ class GameActivity : ComponentActivity(), DrawFrameListener {
|
|||||||
exitProcess(0)
|
exitProcess(0)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
override fun dispatchGenericMotionEvent(ev: MotionEvent?): Boolean {
|
||||||
|
Log.i("GameActivity", ev.toString())
|
||||||
|
|
||||||
|
MogaController.onMotionEvent(androidMotionEventToBda(ev!!))
|
||||||
|
|
||||||
|
return super.dispatchGenericMotionEvent(ev)
|
||||||
|
}
|
||||||
|
|
||||||
|
@SuppressLint("RestrictedApi")
|
||||||
|
override fun dispatchKeyEvent(event: KeyEvent?): Boolean {
|
||||||
|
|
||||||
|
MogaController.onKeyEvent(androidKeyEventToBda(event!!))
|
||||||
|
|
||||||
|
return super.dispatchKeyEvent(event)
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
override fun onDrawFrame(gl10: GL10) {
|
override fun onDrawFrame(gl10: GL10) {
|
||||||
|
//InputDevice.getDeviceIds()
|
||||||
|
//InputDevice.getDevice(0).sources
|
||||||
Log.d(this.localClassName, "onDrawFrame state=$state")
|
Log.d(this.localClassName, "onDrawFrame state=$state")
|
||||||
var isStarted = false
|
var isStarted = false
|
||||||
when (state) {
|
when (state) {
|
||||||
@@ -479,6 +522,10 @@ class GameActivity : ComponentActivity(), DrawFrameListener {
|
|||||||
gameGLSurfaceView.onResume()
|
gameGLSurfaceView.onResume()
|
||||||
ApplicationLifecycle.onActivityResume(this)
|
ApplicationLifecycle.onActivityResume(this)
|
||||||
nativeOnResume()
|
nativeOnResume()
|
||||||
|
actionForAllControllers {
|
||||||
|
val event = createConnectEvent(it)
|
||||||
|
MogaController.nativeOnStateEvent(event)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public override fun onSaveInstanceState(bundle: Bundle) {
|
public override fun onSaveInstanceState(bundle: Bundle) {
|
||||||
|
|||||||
@@ -0,0 +1,91 @@
|
|||||||
|
package com.megboyzz
|
||||||
|
|
||||||
|
import android.content.Context
|
||||||
|
import android.hardware.input.InputManager
|
||||||
|
import android.view.InputDevice
|
||||||
|
import androidx.activity.ComponentActivity
|
||||||
|
import com.bda.controller.KeyEvent
|
||||||
|
import com.bda.controller.MotionEvent
|
||||||
|
import android.view.KeyEvent as androidKeyEvent
|
||||||
|
import android.view.MotionEvent as androidMotionEvent
|
||||||
|
import com.bda.controller.StateEvent
|
||||||
|
|
||||||
|
|
||||||
|
fun actionForAllControllers(
|
||||||
|
action: (Int) -> Unit
|
||||||
|
){
|
||||||
|
val deviceIds = InputDevice.getDeviceIds()
|
||||||
|
deviceIds.forEach {
|
||||||
|
if(deviceIsController(it)) action(it)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fun deviceIsController(deviceId: Int): Boolean {
|
||||||
|
val inputDevice = InputDevice.getDevice(deviceId) ?: return false
|
||||||
|
|
||||||
|
return (inputDevice.sources and InputDevice.SOURCE_GAMEPAD) == InputDevice.SOURCE_GAMEPAD ||
|
||||||
|
(inputDevice.sources and InputDevice.SOURCE_JOYSTICK) == InputDevice.SOURCE_JOYSTICK
|
||||||
|
}
|
||||||
|
|
||||||
|
fun Context.registerControllerHandlers(
|
||||||
|
onInputDeviceAdded: (Int) -> Unit,
|
||||||
|
onInputDeviceRemoved: (Int) -> Unit,
|
||||||
|
onInputDeviceChanged: (Int) -> Unit = {},
|
||||||
|
){
|
||||||
|
|
||||||
|
val inputManager = getSystemService(ComponentActivity.INPUT_SERVICE) as InputManager
|
||||||
|
|
||||||
|
inputManager.registerInputDeviceListener(object : InputManager.InputDeviceListener {
|
||||||
|
|
||||||
|
var lastControllerId: Int = 0;
|
||||||
|
|
||||||
|
override fun onInputDeviceAdded(deviceId: Int) {
|
||||||
|
if(deviceIsController(deviceId)) {
|
||||||
|
lastControllerId = deviceId
|
||||||
|
onInputDeviceAdded(deviceId)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun onInputDeviceRemoved(deviceId: Int) {
|
||||||
|
|
||||||
|
if(deviceIsController(deviceId) || lastControllerId == deviceId) onInputDeviceRemoved(deviceId)
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun onInputDeviceChanged(deviceId: Int) {
|
||||||
|
if(deviceIsController(deviceId)) onInputDeviceChanged(deviceId)
|
||||||
|
}
|
||||||
|
}, null)
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
fun createDisconnectEvent(deviceId: Int) = StateEvent(
|
||||||
|
System.currentTimeMillis(),
|
||||||
|
deviceId,
|
||||||
|
StateEvent.STATE_UNKNOWN,
|
||||||
|
StateEvent.ACTION_DISCONNECTED
|
||||||
|
)
|
||||||
|
|
||||||
|
fun createConnectEvent(deviceId: Int) = StateEvent(
|
||||||
|
System.currentTimeMillis(),
|
||||||
|
deviceId,
|
||||||
|
StateEvent.STATE_CONNECTION,
|
||||||
|
StateEvent.ACTION_CONNECTED
|
||||||
|
)
|
||||||
|
|
||||||
|
fun androidKeyEventToBda(keyEvent: androidKeyEvent) = KeyEvent(
|
||||||
|
keyEvent.eventTime,
|
||||||
|
keyEvent.deviceId,
|
||||||
|
keyEvent.keyCode,
|
||||||
|
keyEvent.action
|
||||||
|
)
|
||||||
|
|
||||||
|
fun androidMotionEventToBda(motionEvent: androidMotionEvent) = MotionEvent(
|
||||||
|
motionEvent.eventTime,
|
||||||
|
motionEvent.deviceId,
|
||||||
|
motionEvent.x,
|
||||||
|
motionEvent.y,
|
||||||
|
motionEvent.rawX,
|
||||||
|
motionEvent.rawY,
|
||||||
|
motionEvent.xPrecision,
|
||||||
|
motionEvent.yPrecision
|
||||||
|
)
|
||||||
@@ -2,7 +2,7 @@
|
|||||||
<resources>
|
<resources>
|
||||||
<string name="app_name">NFS Most Wanted</string>
|
<string name="app_name">NFS Most Wanted</string>
|
||||||
<string name="app_full_name">NFS Most Wanted</string>
|
<string name="app_full_name">NFS Most Wanted</string>
|
||||||
<string name="icon_name">@drawable/icon</string>
|
<string name="icon_name">drawable/icon</string>
|
||||||
<string name="empty" />
|
<string name="empty" />
|
||||||
<string name="nimble_configuration">live</string>
|
<string name="nimble_configuration">live</string>
|
||||||
<string name="app_id">301771293238871</string>
|
<string name="app_id">301771293238871</string>
|
||||||
|
|||||||
@@ -2,7 +2,7 @@
|
|||||||
<resources>
|
<resources>
|
||||||
<string name="app_name">NFS Most Wanted</string>
|
<string name="app_name">NFS Most Wanted</string>
|
||||||
<string name="app_full_name">NFS Most Wanted</string>
|
<string name="app_full_name">NFS Most Wanted</string>
|
||||||
<string name="icon_name">@drawable/icon</string>
|
<string name="icon_name">drawable/icon</string>
|
||||||
<string name="empty" />
|
<string name="empty" />
|
||||||
<string name="nimble_configuration">live</string>
|
<string name="nimble_configuration">live</string>
|
||||||
<string name="app_id">301771293238871</string>
|
<string name="app_id">301771293238871</string>
|
||||||
|
|||||||
Reference in New Issue
Block a user