Commit 88049212 authored by fallenstardust's avatar fallenstardust

精准点击事件

parent 9b5de90a
...@@ -749,9 +749,9 @@ void toggleGlobalIME(ANDROID_APP app, bool pShow) { ...@@ -749,9 +749,9 @@ void toggleGlobalIME(ANDROID_APP app, bool pShow) {
app->activity->vm->DetachCurrentThread(); app->activity->vm->DetachCurrentThread();
} }
core::position2di initJavaBridge(ANDROID_APP app, void* handle) { void initJavaBridge(ANDROID_APP app, void* handle) {
if (!app || !app->activity || !app->activity->vm) if (!app || !app->activity || !app->activity->vm)
return core::position2di(0, 0); return;
JNIEnv* jni = nullptr; JNIEnv* jni = nullptr;
app->activity->vm->AttachCurrentThread(&jni, NULL); app->activity->vm->AttachCurrentThread(&jni, NULL);
jobject lNativeActivity = app->activity->clazz; jobject lNativeActivity = app->activity->clazz;
...@@ -760,18 +760,9 @@ core::position2di initJavaBridge(ANDROID_APP app, void* handle) { ...@@ -760,18 +760,9 @@ core::position2di initJavaBridge(ANDROID_APP app, void* handle) {
"setNativeHandle", "(J)V"); "setNativeHandle", "(J)V");
jlong code = (jlong) handle; jlong code = (jlong) handle;
jni->CallVoidMethod(lNativeActivity, MethodSetHandle, code); jni->CallVoidMethod(lNativeActivity, MethodSetHandle, code);
jmethodID methodX = jni->GetMethodID(ClassNativeActivity,
"getPositionX", "()I");
jint posX = jni->CallIntMethod(lNativeActivity, methodX);
jmethodID methodY = jni->GetMethodID(ClassNativeActivity,
"getPositionY", "()I");
jint posY = jni->CallIntMethod(lNativeActivity, methodY);
jni->DeleteLocalRef(ClassNativeActivity); jni->DeleteLocalRef(ClassNativeActivity);
app->activity->vm->DetachCurrentThread(); app->activity->vm->DetachCurrentThread();
__android_log_print(ANDROID_LOG_INFO, "ygo", "Android command initJavaBridge posX=%d, posY=%d", posX, posY); __android_log_print(ANDROID_LOG_INFO, "ygo", "Android command initJavaBridge");
return core::position2di((int)posX, (int)posY);
} }
InitOptions* getInitOptions(ANDROID_APP app) { InitOptions* getInitOptions(ANDROID_APP app) {
...@@ -807,7 +798,7 @@ int getLocalAddr(ANDROID_APP app) { ...@@ -807,7 +798,7 @@ int getLocalAddr(ANDROID_APP app) {
return addr; return addr;
} }
void OnShareFile(ANDROID_APP app, const char* title, const char* ext){ void OnShareFile(ANDROID_APP app, const char* _type, const char* name){
if (!app || !app->activity || !app->activity->vm) if (!app || !app->activity || !app->activity->vm)
return; return;
JNIEnv* jni = nullptr; JNIEnv* jni = nullptr;
...@@ -817,8 +808,8 @@ void OnShareFile(ANDROID_APP app, const char* title, const char* ext){ ...@@ -817,8 +808,8 @@ void OnShareFile(ANDROID_APP app, const char* title, const char* ext){
jobject lNativeActivity = app->activity->clazz; jobject lNativeActivity = app->activity->clazz;
jclass ClassNativeActivity = jni->GetObjectClass(lNativeActivity); jclass ClassNativeActivity = jni->GetObjectClass(lNativeActivity);
jmethodID methodId = jni->GetMethodID(ClassNativeActivity, "shareFile", "(Ljava/lang/String;Ljava/lang/String;)V"); jmethodID methodId = jni->GetMethodID(ClassNativeActivity, "shareFile", "(Ljava/lang/String;Ljava/lang/String;)V");
jstring s_title = jni->NewStringUTF(title); jstring s_title = jni->NewStringUTF(_type);
jstring s_ext = jni->NewStringUTF(ext); jstring s_ext = jni->NewStringUTF(name);
jni->CallVoidMethod(lNativeActivity, methodId, s_title, s_ext); jni->CallVoidMethod(lNativeActivity, methodId, s_title, s_ext);
if (s_title) { if (s_title) {
//不需要用ReleaseStringUTFChars,因为是c变量,函数外面自己释放 //不需要用ReleaseStringUTFChars,因为是c变量,函数外面自己释放
...@@ -869,30 +860,6 @@ void toggleOverlayView(ANDROID_APP app, bool pShow) { ...@@ -869,30 +860,6 @@ void toggleOverlayView(ANDROID_APP app, bool pShow) {
app->activity->vm->DetachCurrentThread(); app->activity->vm->DetachCurrentThread();
} }
void process_input(ANDROID_APP app,
struct android_poll_source* source) {
AInputEvent* event = NULL;
if (AInputQueue_getEvent(app->inputQueue, &event) >= 0) {
int type = AInputEvent_getType(event);
bool skip_predispatch = AInputEvent_getType(event)
== AINPUT_EVENT_TYPE_KEY
&& AKeyEvent_getKeyCode(event) == AKEYCODE_BACK;
// skip predispatch (all it does is send to the IME)
if (!skip_predispatch
&& AInputQueue_preDispatchEvent(app->inputQueue, event)) {
return;
}
int32_t handled = 0;
if (app->onInputEvent != NULL)
handled = app->onInputEvent(app, event);
AInputQueue_finishEvent(app->inputQueue, event, handled);
} else {
// LOGE("Failure reading next input event: %s\n", strerror(errno));
}
}
void onGameExit(ANDROID_APP app){ void onGameExit(ANDROID_APP app){
if (!app || !app->activity || !app->activity->vm) if (!app || !app->activity || !app->activity->vm)
return; return;
......
...@@ -6,24 +6,20 @@ ...@@ -6,24 +6,20 @@
*/ */
package cn.garymb.ygomobile; package cn.garymb.ygomobile;
import android.app.NativeActivity;
import android.content.Context; import android.content.Context;
import android.content.Intent; import android.content.Intent;
import android.content.pm.ActivityInfo; import android.content.pm.ActivityInfo;
import android.content.res.Resources;
import android.os.Build;
import android.os.Bundle;
import android.os.Handler;
import android.os.PowerManager; import android.os.PowerManager;
import android.os.Process; import android.os.Process;
import android.util.Log; import android.util.Log;
import android.util.Size;
import android.view.Gravity; import android.view.Gravity;
import android.view.HapticFeedbackConstants; import android.view.HapticFeedbackConstants;
import android.view.KeyEvent; import android.view.KeyEvent;
import android.view.SurfaceHolder; import android.view.MotionEvent;
import android.view.SurfaceView;
import android.view.View; import android.view.View;
import android.widget.FrameLayout; import android.widget.FrameLayout;
import android.widget.ImageView;
import android.widget.PopupWindow; import android.widget.PopupWindow;
import android.widget.TextView; import android.widget.TextView;
import android.widget.Toast; import android.widget.Toast;
...@@ -33,6 +29,7 @@ import java.util.Arrays; ...@@ -33,6 +29,7 @@ import java.util.Arrays;
import cn.garymb.ygodata.YGOGameOptions; import cn.garymb.ygodata.YGOGameOptions;
import cn.garymb.ygomobile.controller.NetworkController; import cn.garymb.ygomobile.controller.NetworkController;
import cn.garymb.ygomobile.core.GameActivity;
import cn.garymb.ygomobile.core.IrrlichtBridge; import cn.garymb.ygomobile.core.IrrlichtBridge;
import cn.garymb.ygomobile.lib.R; import cn.garymb.ygomobile.lib.R;
import cn.garymb.ygomobile.utils.FullScreenUtils; import cn.garymb.ygomobile.utils.FullScreenUtils;
...@@ -47,7 +44,7 @@ import static cn.garymb.ygomobile.core.IrrlichtBridge.ACTION_SHARE_FILE; ...@@ -47,7 +44,7 @@ import static cn.garymb.ygomobile.core.IrrlichtBridge.ACTION_SHARE_FILE;
/** /**
* @author mabin * @author mabin
*/ */
public class YGOMobileActivity extends NativeActivity implements public class YGOMobileActivity extends GameActivity implements
IrrlichtBridge.IrrlichtHost, IrrlichtBridge.IrrlichtHost,
View.OnClickListener, View.OnClickListener,
PopupWindow.OnDismissListener, PopupWindow.OnDismissListener,
...@@ -59,13 +56,11 @@ public class YGOMobileActivity extends NativeActivity implements ...@@ -59,13 +56,11 @@ public class YGOMobileActivity extends NativeActivity implements
private static final int CHAIN_CONTROL_PANEL_Y_REVERT_POSITION = 100; private static final int CHAIN_CONTROL_PANEL_Y_REVERT_POSITION = 100;
private static final int MAX_REFRESH = 30 * 1000; private static final int MAX_REFRESH = 30 * 1000;
protected final int windowsFlags = protected final int windowsFlags =
Build.VERSION.SDK_INT >= 19 ? ( View.SYSTEM_UI_FLAG_LAYOUT_STABLE
View.SYSTEM_UI_FLAG_LAYOUT_STABLE | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
| View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION
| View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_FULLSCREEN
| View.SYSTEM_UI_FLAG_FULLSCREEN | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY;
| View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY) :
View.SYSTEM_UI_FLAG_LOW_PROFILE;
protected View mContentView; protected View mContentView;
protected ComboBoxCompat mGlobalComboBox; protected ComboBoxCompat mGlobalComboBox;
protected EditWindowCompat mGlobalEditText; protected EditWindowCompat mGlobalEditText;
...@@ -75,20 +70,14 @@ public class YGOMobileActivity extends NativeActivity implements ...@@ -75,20 +70,14 @@ public class YGOMobileActivity extends NativeActivity implements
private NetworkController mNetController; private NetworkController mNetController;
private volatile boolean mOverlayShowRequest = false; private volatile boolean mOverlayShowRequest = false;
private volatile int mCompatGUIMode; private volatile int mCompatGUIMode;
private static int sChainControlXPostion = -1; // private static int sChainControlXPostion = -1;
private static int sChainControlYPostion = -1; // private static int sChainControlYPostion = -1;
private GameApplication mApp; private GameApplication mApp;
private Handler handler = new Handler();
private FullScreenUtils mFullScreenUtils; private FullScreenUtils mFullScreenUtils;
private volatile int mPositionX, mPositionY;
private FrameLayout mLayout;
private SurfaceView mSurfaceView;
private boolean replaced = false;
private static boolean USE_SURFACE = true;
private String[] mArgV; private String[] mArgV;
private boolean onGameExiting; private boolean onGameExiting;
// public static int notchHeight;
private GameApplication app() { private GameApplication app() {
if (mApp == null) { if (mApp == null) {
...@@ -105,23 +94,22 @@ public class YGOMobileActivity extends NativeActivity implements ...@@ -105,23 +94,22 @@ public class YGOMobileActivity extends NativeActivity implements
return mApp; return mApp;
} }
@SuppressWarnings("WrongConstant")
@Override @Override
protected void onCreate(Bundle savedInstanceState) { protected void initBeforeOnCreate() {
if (USE_SURFACE) {
mSurfaceView = new SurfaceView(this);
}
mFullScreenUtils = new FullScreenUtils(this, app().isImmerSiveMode()); mFullScreenUtils = new FullScreenUtils(this, app().isImmerSiveMode());
mFullScreenUtils.fullscreen(); mFullScreenUtils.fullscreen();
mFullScreenUtils.onCreate(); mFullScreenUtils.onCreate();
//argv //argv
mArgV = IrrlichtBridge.getArgs(getIntent()); mArgV = IrrlichtBridge.getArgs(getIntent());
// //
super.onCreate(savedInstanceState); }
@Override
protected void initAfterOnCreate() {
Log.e("YGOStarter", "跳转完成" + System.currentTimeMillis()); Log.e("YGOStarter", "跳转完成" + System.currentTimeMillis());
if (sChainControlXPostion < 0) { // if (sChainControlXPostion < 0) {
initPostion(); // initPostion();
} // }
if (app().isLockSreenOrientation()) { if (app().isLockSreenOrientation()) {
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE); setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
} }
...@@ -168,14 +156,14 @@ public class YGOMobileActivity extends NativeActivity implements ...@@ -168,14 +156,14 @@ public class YGOMobileActivity extends NativeActivity implements
} }
private void initPostion() { private void initPostion() {
final Resources res = getResources(); // final Resources res = getResources();
sChainControlXPostion = (int) (CHAIN_CONTROL_PANEL_X_POSITION_LEFT_EDGE * app() // sChainControlXPostion = (int) (CHAIN_CONTROL_PANEL_X_POSITION_LEFT_EDGE * app()
.getXScale()); // .getXScale());
sChainControlYPostion = (int) (app().getSmallerSize() // sChainControlYPostion = (int) (app().getSmallerSize()
- CHAIN_CONTROL_PANEL_Y_REVERT_POSITION // - CHAIN_CONTROL_PANEL_Y_REVERT_POSITION
* app().getYScale() - (res // * app().getYScale() - (res
.getDimensionPixelSize(R.dimen.chain_control_button_height) * 2 + res // .getDimensionPixelSize(R.dimen.chain_control_button_height) * 2 + res
.getDimensionPixelSize(R.dimen.chain_control_margin))); // .getDimensionPixelSize(R.dimen.chain_control_margin)));
} }
@Override @Override
...@@ -184,11 +172,6 @@ public class YGOMobileActivity extends NativeActivity implements ...@@ -184,11 +172,6 @@ public class YGOMobileActivity extends NativeActivity implements
handleExternalCommand(intent); handleExternalCommand(intent);
} }
@Override
protected void onDestroy() {
super.onDestroy();
}
private void handleExternalCommand(Intent intent) { private void handleExternalCommand(Intent intent) {
YGOGameOptions options = intent YGOGameOptions options = intent
.getParcelableExtra(YGOGameOptions.YGO_GAME_OPTIONS_BUNDLE_KEY); .getParcelableExtra(YGOGameOptions.YGO_GAME_OPTIONS_BUNDLE_KEY);
...@@ -210,85 +193,47 @@ public class YGOMobileActivity extends NativeActivity implements ...@@ -210,85 +193,47 @@ public class YGOMobileActivity extends NativeActivity implements
} }
private void fullscreen() { private void fullscreen() {
//如果是沉浸模式 //如果是沉浸模式
if (app().isImmerSiveMode()) { if (app().isImmerSiveMode()) {
mFullScreenUtils.fullscreen(); mFullScreenUtils.fullscreen();
app().attachGame(this); app().attachGame(this);
if (USE_SURFACE) {
changeGameSize();
}
} }
} }
private int[] getGameSize() { @Override
protected Size getGameWindowSize() {
//调整padding //调整padding
float xScale = app().getXScale(); float xScale = app().getXScale();
float yScale = app().getYScale(); float yScale = app().getYScale();
float sw = app().getScreenWidth();
float sh = app().getScreenHeight();
int w = (int) (app().getGameWidth() * xScale); int w = (int) (app().getGameWidth() * xScale);
int h = (int) (app().getGameHeight() * yScale); int h = (int) (app().getGameHeight() * yScale);
Log.i("kk", "w1=" + app().getGameWidth() + ",h1=" + app().getGameHeight() + ",w2=" + w + ",h2=" + h + ",xScale=" + xScale + ",yScale=" + yScale); Log.i(IrrlichtBridge.TAG, "game size=" + app().getGameWidth() + "x" + app().getGameHeight()
return new int[]{w, h}; + ", surface=" + w + "x" + h
} + ", screen=" + sw + "x" + sh
+ ", xScale=" + xScale + ",yScale=" + yScale);
@Override return new Size(w, h);
public int getPositionX() {
synchronized (this) {
return mPositionX;
}
}
@Override
public int getPositionY() {
synchronized (this) {
return mPositionY;
}
} }
@Override @Override
public void setContentView(View view) { public void setContentView(View view) {
int[] size = getGameSize(); super.setContentView(view);
int w = size[0]; app().attachGame(this);
int h = size[1]; //可以通过mLayout.addView添加view,增加功能
mLayout = new FrameLayout(this); //test code
FrameLayout.LayoutParams lp = new FrameLayout.LayoutParams(w, h); // int size = (int) (getResources().getDisplayMetrics().density * 100);
lp.gravity = Gravity.CENTER; // FrameLayout.LayoutParams lp = new FrameLayout.LayoutParams(size, size);
if (USE_SURFACE) { // lp.gravity = Gravity.RIGHT|Gravity.BOTTOM;
mLayout.addView(mSurfaceView, lp); // ImageView imageView = new ImageView(this);
mLayout.addView(view, lp); // imageView.setImageResource(android.R.drawable.sym_def_app_icon);
super.setContentView(mLayout); // imageView.setOnClickListener(new View.OnClickListener() {
app().attachGame(this); // @Override
changeGameSize(); // public void onClick(View v) {
getWindow().takeSurface(null); // refreshTextures();
replaced = true; // }
mSurfaceView.getHolder().addCallback(this); // });
mSurfaceView.requestFocus(); // mLayout.addView(imageView, lp);
getWindow().setGravity(Gravity.CENTER);
} else {
mLayout.addView(view, lp);
getWindow().setGravity(Gravity.CENTER);
super.setContentView(mLayout);
}
}
private void changeGameSize() {
//游戏大小
int[] size = getGameSize();
int w = (int) app().getScreenHeight();
int h = (int) app().getScreenWidth();
int spX = (int) ((w - size[0]) / 2.0f);
int spY = (int) ((h - size[1]) / 2.0f);
boolean update = false;
synchronized (this) {
if (spX != mPositionX || spY != mPositionY) {
mPositionX = spX;
mPositionY = spY;
update = true;
}
}
if (update) {
IrrlichtBridge.setInputFix(mPositionX, mPositionY);
}
} }
private void initExtraView() { private void initExtraView() {
...@@ -382,7 +327,7 @@ public class YGOMobileActivity extends NativeActivity implements ...@@ -382,7 +327,7 @@ public class YGOMobileActivity extends NativeActivity implements
@Override @Override
public void toggleOverlayView(final boolean isShow) { public void toggleOverlayView(final boolean isShow) {
if (mOverlayShowRequest != isShow) { if (mOverlayShowRequest != isShow) {
handler.post(new Runnable() { runOnUiThread(new Runnable() {
@Override @Override
public void run() { public void run() {
mOverlayShowRequest = isShow; mOverlayShowRequest = isShow;
...@@ -409,7 +354,7 @@ public class YGOMobileActivity extends NativeActivity implements ...@@ -409,7 +354,7 @@ public class YGOMobileActivity extends NativeActivity implements
@Override @Override
public void toggleIME(final String hint, final boolean isShow) { public void toggleIME(final String hint, final boolean isShow) {
handler.post(new Runnable() { runOnUiThread(new Runnable() {
@Override @Override
public void run() { public void run() {
if (isShow) { if (isShow) {
...@@ -429,7 +374,7 @@ public class YGOMobileActivity extends NativeActivity implements ...@@ -429,7 +374,7 @@ public class YGOMobileActivity extends NativeActivity implements
@Override @Override
public void showComboBoxCompat(final String[] items, final boolean isShow, final int mode) { public void showComboBoxCompat(final String[] items, final boolean isShow, final int mode) {
handler.post(new Runnable() { runOnUiThread(new Runnable() {
@Override @Override
public void run() { public void run() {
mCompatGUIMode = mode; mCompatGUIMode = mode;
...@@ -446,7 +391,7 @@ public class YGOMobileActivity extends NativeActivity implements ...@@ -446,7 +391,7 @@ public class YGOMobileActivity extends NativeActivity implements
@Override @Override
public void performHapticFeedback() { public void performHapticFeedback() {
handler.post(new Runnable() { runOnUiThread(new Runnable() {
@Override @Override
public void run() { public void run() {
mContentView.performHapticFeedback( mContentView.performHapticFeedback(
...@@ -471,46 +416,6 @@ public class YGOMobileActivity extends NativeActivity implements ...@@ -471,46 +416,6 @@ public class YGOMobileActivity extends NativeActivity implements
IrrlichtBridge.sNativeHandle = nativeHandle; IrrlichtBridge.sNativeHandle = nativeHandle;
} }
@Override
public void surfaceCreated(SurfaceHolder holder) {
if (USE_SURFACE) {
if (!replaced) {
return;
}
}
super.surfaceCreated(holder);
}
@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
if (USE_SURFACE) {
if (!replaced) {
return;
}
}
super.surfaceChanged(holder, format, width, height);
}
@Override
public void surfaceDestroyed(SurfaceHolder holder) {
if (USE_SURFACE) {
if (!replaced) {
return;
}
}
super.surfaceDestroyed(holder);
}
@Override
public void surfaceRedrawNeeded(SurfaceHolder holder) {
if (USE_SURFACE) {
if (!replaced) {
return;
}
}
super.surfaceRedrawNeeded(holder);
}
@Override @Override
public void shareFile(final String type, final String name) { public void shareFile(final String type, final String name) {
//TODO 分享文件 //TODO 分享文件
...@@ -532,14 +437,43 @@ public class YGOMobileActivity extends NativeActivity implements ...@@ -532,14 +437,43 @@ public class YGOMobileActivity extends NativeActivity implements
}); });
} }
private long lasttime;
@Override
public void onBackPressed() {
if (mGlobalComboBox != null && mGlobalComboBox.isShowing()) {
mGlobalComboBox.dismiss();
return;
}
if (mGlobalEditText != null && mGlobalEditText.isShowing()) {
mGlobalEditText.dismiss();
return;
}
if (lasttime == 0 || (System.currentTimeMillis() - lasttime) > 1000) {
lasttime = System.currentTimeMillis();
Toast.makeText(this, R.string.tip_exit_game, Toast.LENGTH_SHORT).show();
return;
}
onGameExit();
}
@Override
protected void onSurfaceTouch(View v, MotionEvent event) {
if (event.getPointerCount() > 1) {
//多指操作不处理
return;
}
super.onSurfaceTouch(v, event);
}
@Override @Override
public void onGameExit() { public void onGameExit() {
if(onGameExiting){ if (onGameExiting) {
return; return;
} }
onGameExiting = true; onGameExiting = true;
Log.e(IrrlichtBridge.TAG, "game exit"); Log.e(IrrlichtBridge.TAG, "game exit");
final Intent intent = new Intent(IrrlichtBridge.ACTION_OPEN_GAME_HOME); final Intent intent = new Intent(IrrlichtBridge.ACTION_OPEN_GAME_HOME);
intent.addCategory(Intent.CATEGORY_DEFAULT); intent.addCategory(Intent.CATEGORY_DEFAULT);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
intent.addFlags(Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED); intent.addFlags(Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED);
...@@ -558,7 +492,7 @@ public class YGOMobileActivity extends NativeActivity implements ...@@ -558,7 +492,7 @@ public class YGOMobileActivity extends NativeActivity implements
} }
boolean isRoot = isTaskRoot(); boolean isRoot = isTaskRoot();
Log.d(IrrlichtBridge.TAG, "isRoot=" + isRoot + ",kill:" + Process.myPid()); Log.d(IrrlichtBridge.TAG, "isRoot=" + isRoot + ",kill:" + Process.myPid());
if(isRoot) { if (isRoot) {
finishAndRemoveTask(); finishAndRemoveTask();
} else { } else {
finish(); finish();
......
package cn.garymb.ygomobile.controller;
import android.os.Looper;
import android.util.Log;
import android.view.InputEvent;
import android.view.InputQueue;
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import cn.garymb.ygomobile.utils.AndroidHideApi;
/**
* 仅测试安卓7-11
*/
public class InputQueueCompat implements InvocationHandler {
private static final String TAG = "kk-java";
private static Constructor<InputQueue> InputQueue_ctr;
private static Method getNativePtr_method;
private static Class<?> FinishedInputEventCallback_class;
//sendInputEvent(InputEvent e, Object token, boolean predispatch,
// FinishedInputEventCallback callback)
private static Method sendInputEvent_method;
private FinishedInputEventCallbackCompat finishedInputEventCallbackCompat;
static {
AndroidHideApi.enableHideApi();
try {
Looper.getMainLooper();
InputQueue_ctr = InputQueue.class.getDeclaredConstructor();
// InputQueue_ctr.setAccessible(true);
getNativePtr_method = InputQueue.class.getMethod("getNativePtr");
// getNativePtr_method.setAccessible(true);
FinishedInputEventCallback_class = Class.forName(InputQueue.class.getName() + "$FinishedInputEventCallback");
sendInputEvent_method = InputQueue.class.getMethod("sendInputEvent", InputEvent.class, Object.class, boolean.class,
FinishedInputEventCallback_class);
} catch (Throwable e) {
Log.e(TAG, "InputQueueCompat init", e);
}
}
private final InputQueue inputQueue;
private final Object callback;
public InputQueueCompat(InputQueue inputQueue) {
this.inputQueue = inputQueue;
if(inputQueue != null) {
callback = Proxy.newProxyInstance(InputQueue.class.getClassLoader(), new Class[]{FinishedInputEventCallback_class},
this);
} else {
callback = null;
}
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) {
//void onFinishedInputEvent(Object token, boolean handled);
if ("onFinishedInputEvent".equals(method.getName())) {
Object token = args[0];
boolean handled = (boolean) args[1];
onFinishedInputEvent(token, handled);
return 0;
}
return 0;
}
public InputQueueCompat() {
this(create());
}
public void setFinishedInputEventCallback(FinishedInputEventCallbackCompat finishedInputEventCallbackCompat) {
this.finishedInputEventCallbackCompat = finishedInputEventCallbackCompat;
}
public boolean isValid() {
return inputQueue != null && sendInputEvent_method != null && getNativePtr_method != null;
}
private static InputQueue create() {
try {
return InputQueue_ctr.newInstance();
} catch (Throwable e) {
Log.w(TAG, "InputQueue<init>", e);
return null;
}
}
public long getNativePtr() {
if (getNativePtr_method == null || inputQueue == null) {
return 0;
}
try {
Long ret = (Long) getNativePtr_method.invoke(inputQueue);
if (ret == null) {
return 0;
}
return ret;
} catch (Throwable e) {
Log.w(TAG, "getNativePtr", e);
return 0;
}
}
public InputQueue getInputQueue() {
return inputQueue;
}
public void sendInputEvent(InputEvent e, Object token, boolean predispatch) {
if (sendInputEvent_method == null) {
return;
}
try {
Log.d(TAG, "inputQueue:sendInputEvent:" + e);
sendInputEvent_method.invoke(inputQueue, e, token, predispatch, callback);
} catch (Throwable ex) {
Log.w(TAG, "inputQueue:sendInputEvent", ex);
}
}
public void onFinishedInputEvent(Object token, boolean handled) {
//TODO
Log.d(TAG, "onFinishedInputEvent:" + token + ", handled=" + handled);
if(this.finishedInputEventCallbackCompat != null){
finishedInputEventCallbackCompat.onFinishedInputEvent(token, handled);
}
}
public interface FinishedInputEventCallbackCompat{
void onFinishedInputEvent(Object token, boolean handled);
}
}
package cn.garymb.ygomobile.utils;
import android.os.Build;
import java.lang.reflect.Method;
public class AndroidHideApi {
private static boolean sBypassedP = false;
public static void enableHideApi() {
if (sBypassedP) {
return;
}
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
try {
Method forNameMethod = Class.class.getDeclaredMethod("forName", String.class);
Class<?> clazz = (Class<?>) forNameMethod.invoke(null, "dalvik.system.VMRuntime");
Method getMethodMethod = Class.class.getDeclaredMethod("getDeclaredMethod", String.class, Class[].class);
Method getRuntime = (Method) getMethodMethod.invoke(clazz, "getRuntime", new Class[0]);
Method setHiddenApiExemptions = (Method) getMethodMethod.invoke(clazz, "setHiddenApiExemptions", new Class[]{String[].class});
Object runtime = getRuntime.invoke(null);
setHiddenApiExemptions.invoke(runtime, new Object[]{
new String[]{
"Landroid/",
"Lcom/android/",
"Ljava/lang/",
"Ldalvik/system/",
"Llibcore/io/",
"Lhuawei/"
}
});
} catch (Throwable e) {
e.printStackTrace();
}
}
sBypassedP = true;
}
}
...@@ -64,6 +64,16 @@ public class App extends GameApplication { ...@@ -64,6 +64,16 @@ public class App extends GameApplication {
public float getYScale() { public float getYScale() {
return AppsSettings.get().getYScale(getGameWidth(), getGameHeight()); return AppsSettings.get().getYScale(getGameWidth(), getGameHeight());
} }
//
// @Override
// public int getGameHeight() {
// return 720;
// }
//
// @Override
// public int getGameWidth() {
// return 1280;
// }
@Override @Override
public String getCardImagePath() { public String getCardImagePath() {
......
...@@ -3,6 +3,7 @@ package cn.garymb.ygomobile; ...@@ -3,6 +3,7 @@ package cn.garymb.ygomobile;
import android.annotation.SuppressLint; import android.annotation.SuppressLint;
import android.content.Context; import android.content.Context;
import android.graphics.Point; import android.graphics.Point;
import android.os.ParcelFileDescriptor;
import android.text.TextUtils; import android.text.TextUtils;
import android.util.Log; import android.util.Log;
import android.view.WindowManager; import android.view.WindowManager;
...@@ -18,9 +19,11 @@ import java.util.Arrays; ...@@ -18,9 +19,11 @@ import java.util.Arrays;
import java.util.List; import java.util.List;
import java.util.Locale; import java.util.Locale;
import cn.garymb.ygomobile.core.IrrlichtBridge;
import cn.garymb.ygomobile.lite.R; import cn.garymb.ygomobile.lite.R;
import cn.garymb.ygomobile.ui.preference.PreferenceFragmentPlus; import cn.garymb.ygomobile.ui.preference.PreferenceFragmentPlus;
import cn.garymb.ygomobile.utils.DeckUtil; import cn.garymb.ygomobile.utils.DeckUtil;
import cn.garymb.ygomobile.utils.DensityUtils;
import cn.garymb.ygomobile.utils.IOUtils; import cn.garymb.ygomobile.utils.IOUtils;
import static cn.garymb.ygomobile.Constants.CORE_DECK_PATH; import static cn.garymb.ygomobile.Constants.CORE_DECK_PATH;
...@@ -33,6 +36,7 @@ import static cn.garymb.ygomobile.Constants.DEF_PREF_KEEP_SCALE; ...@@ -33,6 +36,7 @@ import static cn.garymb.ygomobile.Constants.DEF_PREF_KEEP_SCALE;
import static cn.garymb.ygomobile.Constants.DEF_PREF_NOTCH_HEIGHT; import static cn.garymb.ygomobile.Constants.DEF_PREF_NOTCH_HEIGHT;
import static cn.garymb.ygomobile.Constants.DEF_PREF_ONLY_GAME; import static cn.garymb.ygomobile.Constants.DEF_PREF_ONLY_GAME;
import static cn.garymb.ygomobile.Constants.DEF_PREF_READ_EX; import static cn.garymb.ygomobile.Constants.DEF_PREF_READ_EX;
import static cn.garymb.ygomobile.Constants.DEF_PREF_WINDOW_TOP_BOTTOM;
import static cn.garymb.ygomobile.Constants.PREF_DEF_IMMERSIVE_MODE; import static cn.garymb.ygomobile.Constants.PREF_DEF_IMMERSIVE_MODE;
import static cn.garymb.ygomobile.Constants.PREF_DEF_SENSOR_REFRESH; import static cn.garymb.ygomobile.Constants.PREF_DEF_SENSOR_REFRESH;
import static cn.garymb.ygomobile.Constants.PREF_FONT_SIZE; import static cn.garymb.ygomobile.Constants.PREF_FONT_SIZE;
...@@ -43,6 +47,7 @@ import static cn.garymb.ygomobile.Constants.PREF_NOTCH_HEIGHT; ...@@ -43,6 +47,7 @@ import static cn.garymb.ygomobile.Constants.PREF_NOTCH_HEIGHT;
import static cn.garymb.ygomobile.Constants.PREF_ONLY_GAME; import static cn.garymb.ygomobile.Constants.PREF_ONLY_GAME;
import static cn.garymb.ygomobile.Constants.PREF_READ_EX; import static cn.garymb.ygomobile.Constants.PREF_READ_EX;
import static cn.garymb.ygomobile.Constants.PREF_SENSOR_REFRESH; import static cn.garymb.ygomobile.Constants.PREF_SENSOR_REFRESH;
import static cn.garymb.ygomobile.Constants.PREF_WINDOW_TOP_BOTTOM;
import static cn.garymb.ygomobile.Constants.WINDBOT_DECK_PATH; import static cn.garymb.ygomobile.Constants.WINDBOT_DECK_PATH;
import static cn.garymb.ygomobile.Constants.WINDBOT_PATH; import static cn.garymb.ygomobile.Constants.WINDBOT_PATH;
import static cn.garymb.ygomobile.Constants.YDK_FILE_EX; import static cn.garymb.ygomobile.Constants.YDK_FILE_EX;
...@@ -53,8 +58,8 @@ public class AppsSettings { ...@@ -53,8 +58,8 @@ public class AppsSettings {
private static AppsSettings sAppsSettings; private static AppsSettings sAppsSettings;
private final Point mScreenSize = new Point(); private final Point mScreenSize = new Point();
private final Point mRealScreenSize = new Point(); private final Point mRealScreenSize = new Point();
private Context context; private final Context context;
private PreferenceFragmentPlus.SharedPreferencesPlus mSharedPreferences; private final PreferenceFragmentPlus.SharedPreferencesPlus mSharedPreferences;
private float mDensity; private float mDensity;
private AppsSettings(Context context) { private AppsSettings(Context context) {
...@@ -134,6 +139,7 @@ public class AppsSettings { ...@@ -134,6 +139,7 @@ public class AppsSettings {
} }
public float getXScale(int w, int h) { public float getXScale(int w, int h) {
//曲面屏
if (isKeepScale()) { if (isKeepScale()) {
float sx = getScreenHeight() / w; float sx = getScreenHeight() / w;
float sy = getScreenWidth() / h; float sy = getScreenWidth() / h;
...@@ -156,6 +162,15 @@ public class AppsSettings { ...@@ -156,6 +162,15 @@ public class AppsSettings {
return mSharedPreferences.getBoolean(PREF_KEEP_SCALE, DEF_PREF_KEEP_SCALE); return mSharedPreferences.getBoolean(PREF_KEEP_SCALE, DEF_PREF_KEEP_SCALE);
} }
public int getScreenPadding() {
//ListPreference都是string
String str = mSharedPreferences.getString(PREF_WINDOW_TOP_BOTTOM, null);
if (!TextUtils.isEmpty(str) && TextUtils.isDigitsOnly(str)) {
return Integer.parseInt(str);
}
return 0;
}
public float getScreenWidth() { public float getScreenWidth() {
int w, h; int w, h;
if (isImmerSiveMode()) { if (isImmerSiveMode()) {
...@@ -165,7 +180,11 @@ public class AppsSettings { ...@@ -165,7 +180,11 @@ public class AppsSettings {
w = mScreenSize.x; w = mScreenSize.x;
h = mScreenSize.y; h = mScreenSize.y;
} }
return Math.min(w, h); int ret = Math.min(w, h);
//测试代码,曲面屏左右2变需要留空白,但是游戏画面比例不对,需要修改c那边代码
int fix_h = DensityUtils.dp2px(context, getScreenPadding());
Log.d(IrrlichtBridge.TAG, "screen padding=" + fix_h);
return ret - fix_h * 2;
} }
public float getScreenHeight() { public float getScreenHeight() {
...@@ -518,7 +537,8 @@ public class AppsSettings { ...@@ -518,7 +537,8 @@ public class AppsSettings {
} }
//获得最后卡组绝对路径 //获得最后卡组绝对路径
public @Nullable String getLastDeckPath() { public @Nullable
String getLastDeckPath() {
String path; String path;
if (TextUtils.equals(context.getString(R.string.category_pack), getLastCategory())) { if (TextUtils.equals(context.getString(R.string.category_pack), getLastCategory())) {
path = getResourcePath() + "/" + CORE_PACK_PATH + "/" + getLastDeckName() + YDK_FILE_EX; path = getResourcePath() + "/" + CORE_PACK_PATH + "/" + getLastDeckName() + YDK_FILE_EX;
...@@ -680,6 +700,6 @@ public class AppsSettings { ...@@ -680,6 +700,6 @@ public class AppsSettings {
@Deprecated @Deprecated
//获取收藏文件 //获取收藏文件
public File getFavoriteFile() { public File getFavoriteFile() {
return new File(getResourcePath(), CORE_SYSTEM_PATH); return new File(getResourcePath(), "/favorite.txt");
} }
} }
...@@ -117,6 +117,10 @@ public interface Constants { ...@@ -117,6 +117,10 @@ public interface Constants {
String PREF_KEEP_SCALE = "pref_settings_keep_scale"; String PREF_KEEP_SCALE = "pref_settings_keep_scale";
boolean DEF_PREF_KEEP_SCALE = false; boolean DEF_PREF_KEEP_SCALE = false;
//dp单位,游戏高度减少,留空白
String PREF_WINDOW_TOP_BOTTOM = "pref_settings_window_top_bottom";
int DEF_PREF_WINDOW_TOP_BOTTOM = 0;
int REQUEST_CUT_IMG = 0x1000 + 0x10; int REQUEST_CUT_IMG = 0x1000 + 0x10;
int REQUEST_CHOOSE_FILE = 0x1000 + 0x20; int REQUEST_CHOOSE_FILE = 0x1000 + 0x20;
int REQUEST_CHOOSE_IMG = 0x1000 + 0x21; int REQUEST_CHOOSE_IMG = 0x1000 + 0x21;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment