Android: apply code simplications found with lint / Android Studio

This commit is contained in:
Sylvain Becker 2020-10-27 21:14:49 +01:00
parent ddc0727bba
commit 97cf314526
4 changed files with 217 additions and 217 deletions

View File

@ -2,7 +2,8 @@ package org.libsdl.app;
import android.content.Context; import android.content.Context;
import java.lang.reflect.*; import java.lang.Class;
import java.lang.reflect.Method;
/** /**
SDL library initialization SDL library initialization
@ -51,16 +52,16 @@ public class SDL {
// To use ReLinker, just add it as a dependency. For more information, see // To use ReLinker, just add it as a dependency. For more information, see
// https://github.com/KeepSafe/ReLinker for ReLinker's repository. // https://github.com/KeepSafe/ReLinker for ReLinker's repository.
// //
Class relinkClass = mContext.getClassLoader().loadClass("com.getkeepsafe.relinker.ReLinker"); Class<?> relinkClass = mContext.getClassLoader().loadClass("com.getkeepsafe.relinker.ReLinker");
Class relinkListenerClass = mContext.getClassLoader().loadClass("com.getkeepsafe.relinker.ReLinker$LoadListener"); Class<?> relinkListenerClass = mContext.getClassLoader().loadClass("com.getkeepsafe.relinker.ReLinker$LoadListener");
Class contextClass = mContext.getClassLoader().loadClass("android.content.Context"); Class<?> contextClass = mContext.getClassLoader().loadClass("android.content.Context");
Class stringClass = mContext.getClassLoader().loadClass("java.lang.String"); Class<?> stringClass = mContext.getClassLoader().loadClass("java.lang.String");
// Get a 'force' instance of the ReLinker, so we can ensure libraries are reinstalled if // Get a 'force' instance of the ReLinker, so we can ensure libraries are reinstalled if
// they've changed during updates. // they've changed during updates.
Method forceMethod = relinkClass.getDeclaredMethod("force"); Method forceMethod = relinkClass.getDeclaredMethod("force");
Object relinkInstance = forceMethod.invoke(null); Object relinkInstance = forceMethod.invoke(null);
Class relinkInstanceClass = relinkInstance.getClass(); Class<?> relinkInstanceClass = relinkInstance.getClass();
// Actually load the library! // Actually load the library!
Method loadMethod = relinkInstanceClass.getDeclaredMethod("loadLibrary", contextClass, stringClass, stringClass, relinkListenerClass); Method loadMethod = relinkInstanceClass.getDeclaredMethod("loadLibrary", contextClass, stringClass, stringClass, relinkListenerClass);
@ -77,7 +78,7 @@ public class SDL {
catch (final SecurityException se) { catch (final SecurityException se) {
throw se; throw se;
} }
} }
} }
protected static Context mContext; protected static Context mContext;

View File

@ -1,34 +1,61 @@
package org.libsdl.app; package org.libsdl.app;
import java.util.Hashtable; import android.app.Activity;
import java.util.Locale; import android.app.AlertDialog;
import java.lang.reflect.Method; import android.app.Dialog;
import java.lang.Math; import android.app.UiModeManager;
import android.content.ClipboardManager;
import android.app.*; import android.content.ClipData;
import android.content.*; import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.pm.ActivityInfo;
import android.content.pm.ApplicationInfo;
import android.content.pm.PackageManager;
import android.content.res.Configuration; import android.content.res.Configuration;
import android.graphics.Bitmap;
import android.graphics.Color;
import android.graphics.PixelFormat;
import android.graphics.PorterDuff;
import android.graphics.drawable.Drawable;
import android.hardware.Sensor;
import android.hardware.SensorEvent;
import android.hardware.SensorEventListener;
import android.hardware.SensorManager;
import android.net.Uri;
import android.os.Build;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.text.InputType; import android.text.InputType;
import android.view.*; import android.util.DisplayMetrics;
import android.util.Log;
import android.util.SparseArray;
import android.view.Display;
import android.view.Gravity;
import android.view.InputDevice;
import android.view.KeyEvent;
import android.view.MotionEvent;
import android.view.PointerIcon;
import android.view.Surface;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
import android.view.View;
import android.view.ViewGroup;
import android.view.Window;
import android.view.WindowManager;
import android.view.inputmethod.BaseInputConnection; import android.view.inputmethod.BaseInputConnection;
import android.view.inputmethod.EditorInfo; import android.view.inputmethod.EditorInfo;
import android.view.inputmethod.InputConnection; import android.view.inputmethod.InputConnection;
import android.view.inputmethod.InputMethodManager; import android.view.inputmethod.InputMethodManager;
import android.widget.RelativeLayout;
import android.widget.Button; import android.widget.Button;
import android.widget.LinearLayout; import android.widget.LinearLayout;
import android.widget.RelativeLayout;
import android.widget.TextView; import android.widget.TextView;
import android.os.*;
import android.util.DisplayMetrics; import java.util.Hashtable;
import android.util.Log; import java.util.Locale;
import android.util.SparseArray;
import android.graphics.*;
import android.graphics.drawable.Drawable;
import android.hardware.*;
import android.content.pm.ActivityInfo;
import android.content.pm.PackageManager;
import android.content.pm.ApplicationInfo;
import android.net.Uri;
/** /**
SDL Activity SDL Activity
@ -40,7 +67,7 @@ public class SDLActivity extends Activity implements View.OnSystemUiVisibilityCh
public static final boolean mHasMultiWindow = (Build.VERSION.SDK_INT >= 24); public static final boolean mHasMultiWindow = (Build.VERSION.SDK_INT >= 24);
// Cursor types // Cursor types
private static final int SDL_SYSTEM_CURSOR_NONE = -1; // private static final int SDL_SYSTEM_CURSOR_NONE = -1;
private static final int SDL_SYSTEM_CURSOR_ARROW = 0; private static final int SDL_SYSTEM_CURSOR_ARROW = 0;
private static final int SDL_SYSTEM_CURSOR_IBEAM = 1; private static final int SDL_SYSTEM_CURSOR_IBEAM = 1;
private static final int SDL_SYSTEM_CURSOR_WAIT = 2; private static final int SDL_SYSTEM_CURSOR_WAIT = 2;
@ -93,8 +120,7 @@ public class SDLActivity extends Activity implements View.OnSystemUiVisibilityCh
if (mMotionListener == null) { if (mMotionListener == null) {
if (Build.VERSION.SDK_INT >= 26) { if (Build.VERSION.SDK_INT >= 26) {
mMotionListener = new SDLGenericMotionListener_API26(); mMotionListener = new SDLGenericMotionListener_API26();
} else } else if (Build.VERSION.SDK_INT >= 24) {
if (Build.VERSION.SDK_INT >= 24) {
mMotionListener = new SDLGenericMotionListener_API24(); mMotionListener = new SDLGenericMotionListener_API24();
} else { } else {
mMotionListener = new SDLGenericMotionListener_API12(); mMotionListener = new SDLGenericMotionListener_API12();
@ -172,7 +198,7 @@ public class SDLActivity extends Activity implements View.OnSystemUiVisibilityCh
mTextEdit = null; mTextEdit = null;
mLayout = null; mLayout = null;
mClipboardHandler = null; mClipboardHandler = null;
mCursors = new Hashtable<Integer, PointerIcon>(); mCursors = new Hashtable<>();
mLastCursorID = 0; mLastCursorID = 0;
mSDLThread = null; mSDLThread = null;
mIsResumedCalled = false; mIsResumedCalled = false;
@ -243,7 +269,7 @@ public class SDLActivity extends Activity implements View.OnSystemUiVisibilityCh
mSingleton = this; mSingleton = this;
SDL.setContext(this); SDL.setContext(this);
mClipboardHandler = new SDLClipboardHandler_API11(); mClipboardHandler = new SDLClipboardHandler();
mHIDDeviceManager = HIDDeviceManager.acquire(this); mHIDDeviceManager = HIDDeviceManager.acquire(this);
@ -564,11 +590,10 @@ public class SDLActivity extends Activity implements View.OnSystemUiVisibilityCh
mSDLThread.start(); mSDLThread.start();
// No nativeResume(), don't signal Android_ResumeSem // No nativeResume(), don't signal Android_ResumeSem
mSurface.handleResume();
} else { } else {
nativeResume(); nativeResume();
mSurface.handleResume();
} }
mSurface.handleResume();
mCurrentNativeState = mNextNativeState; mCurrentNativeState = mNextNativeState;
} }
@ -620,34 +645,32 @@ public class SDLActivity extends Activity implements View.OnSystemUiVisibilityCh
} }
break; break;
case COMMAND_CHANGE_WINDOW_STYLE: case COMMAND_CHANGE_WINDOW_STYLE:
if (Build.VERSION.SDK_INT < 19) { if (Build.VERSION.SDK_INT >= 19) {
// This version of Android doesn't support the immersive fullscreen mode if (context instanceof Activity) {
break; Window window = ((Activity) context).getWindow();
} if (window != null) {
if (context instanceof Activity) { if ((msg.obj instanceof Integer) && ((Integer) msg.obj != 0)) {
Window window = ((Activity) context).getWindow(); int flags = View.SYSTEM_UI_FLAG_FULLSCREEN |
if (window != null) {
if ((msg.obj instanceof Integer) && (((Integer) msg.obj).intValue() != 0)) {
int flags = View.SYSTEM_UI_FLAG_FULLSCREEN |
View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION |
View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY |
View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN |
View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION |
View.SYSTEM_UI_FLAG_LAYOUT_STABLE | View.INVISIBLE; View.SYSTEM_UI_FLAG_LAYOUT_STABLE | View.INVISIBLE;
window.getDecorView().setSystemUiVisibility(flags); window.getDecorView().setSystemUiVisibility(flags);
window.addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN); window.addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN);
window.clearFlags(WindowManager.LayoutParams.FLAG_FORCE_NOT_FULLSCREEN); window.clearFlags(WindowManager.LayoutParams.FLAG_FORCE_NOT_FULLSCREEN);
SDLActivity.mFullscreenModeActive = true; SDLActivity.mFullscreenModeActive = true;
} else { } else {
int flags = View.SYSTEM_UI_FLAG_LAYOUT_STABLE | View.SYSTEM_UI_FLAG_VISIBLE; int flags = View.SYSTEM_UI_FLAG_LAYOUT_STABLE | View.SYSTEM_UI_FLAG_VISIBLE;
window.getDecorView().setSystemUiVisibility(flags); window.getDecorView().setSystemUiVisibility(flags);
window.addFlags(WindowManager.LayoutParams.FLAG_FORCE_NOT_FULLSCREEN); window.addFlags(WindowManager.LayoutParams.FLAG_FORCE_NOT_FULLSCREEN);
window.clearFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN); window.clearFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN);
SDLActivity.mFullscreenModeActive = false; SDLActivity.mFullscreenModeActive = false;
}
} }
} else {
Log.e(TAG, "error handling message, getContext() returned no Activity");
} }
} else {
Log.e(TAG, "error handling message, getContext() returned no Activity");
} }
break; break;
case COMMAND_TEXTEDIT_HIDE: case COMMAND_TEXTEDIT_HIDE:
@ -670,7 +693,7 @@ public class SDLActivity extends Activity implements View.OnSystemUiVisibilityCh
if (context instanceof Activity) { if (context instanceof Activity) {
Window window = ((Activity) context).getWindow(); Window window = ((Activity) context).getWindow();
if (window != null) { if (window != null) {
if ((msg.obj instanceof Integer) && (((Integer) msg.obj).intValue() != 0)) { if ((msg.obj instanceof Integer) && ((Integer) msg.obj != 0)) {
window.addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON); window.addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
} else { } else {
window.clearFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON); window.clearFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
@ -723,53 +746,53 @@ public class SDLActivity extends Activity implements View.OnSystemUiVisibilityCh
msg.obj = data; msg.obj = data;
boolean result = commandHandler.sendMessage(msg); boolean result = commandHandler.sendMessage(msg);
if ((Build.VERSION.SDK_INT >= 19) && (command == COMMAND_CHANGE_WINDOW_STYLE)) { if (Build.VERSION.SDK_INT >= 19) {
// Ensure we don't return until the resize has actually happened, if (command == COMMAND_CHANGE_WINDOW_STYLE) {
// or 500ms have passed. // Ensure we don't return until the resize has actually happened,
// or 500ms have passed.
boolean bShouldWait = false; boolean bShouldWait = false;
if (data instanceof Integer) { if (data instanceof Integer) {
// Let's figure out if we're already laid out fullscreen or not. // Let's figure out if we're already laid out fullscreen or not.
Display display = ((WindowManager)getSystemService(Context.WINDOW_SERVICE)).getDefaultDisplay(); Display display = ((WindowManager) getSystemService(Context.WINDOW_SERVICE)).getDefaultDisplay();
android.util.DisplayMetrics realMetrics = new android.util.DisplayMetrics(); DisplayMetrics realMetrics = new DisplayMetrics();
display.getRealMetrics( realMetrics ); display.getRealMetrics(realMetrics);
boolean bFullscreenLayout = ((realMetrics.widthPixels == mSurface.getWidth()) && boolean bFullscreenLayout = ((realMetrics.widthPixels == mSurface.getWidth()) &&
(realMetrics.heightPixels == mSurface.getHeight())); (realMetrics.heightPixels == mSurface.getHeight()));
if (((Integer)data).intValue() == 1) { if ((Integer) data == 1) {
// If we aren't laid out fullscreen or actively in fullscreen mode already, we're going // If we aren't laid out fullscreen or actively in fullscreen mode already, we're going
// to change size and should wait for surfaceChanged() before we return, so the size // to change size and should wait for surfaceChanged() before we return, so the size
// is right back in native code. If we're already laid out fullscreen, though, we're // is right back in native code. If we're already laid out fullscreen, though, we're
// not going to change size even if we change decor modes, so we shouldn't wait for // not going to change size even if we change decor modes, so we shouldn't wait for
// surfaceChanged() -- which may not even happen -- and should return immediately. // surfaceChanged() -- which may not even happen -- and should return immediately.
bShouldWait = !bFullscreenLayout; bShouldWait = !bFullscreenLayout;
} } else {
else { // If we're laid out fullscreen (even if the status bar and nav bar are present),
// If we're laid out fullscreen (even if the status bar and nav bar are present), // or are actively in fullscreen, we're going to change size and should wait for
// or are actively in fullscreen, we're going to change size and should wait for // surfaceChanged before we return, so the size is right back in native code.
// surfaceChanged before we return, so the size is right back in native code. bShouldWait = bFullscreenLayout;
bShouldWait = bFullscreenLayout;
}
}
if (bShouldWait && (SDLActivity.getContext() != null)) {
// We'll wait for the surfaceChanged() method, which will notify us
// when called. That way, we know our current size is really the
// size we need, instead of grabbing a size that's still got
// the navigation and/or status bars before they're hidden.
//
// We'll wait for up to half a second, because some devices
// take a surprisingly long time for the surface resize, but
// then we'll just give up and return.
//
synchronized(SDLActivity.getContext()) {
try {
SDLActivity.getContext().wait(500);
} }
catch (InterruptedException ie) { }
ie.printStackTrace();
if (bShouldWait && (SDLActivity.getContext() != null)) {
// We'll wait for the surfaceChanged() method, which will notify us
// when called. That way, we know our current size is really the
// size we need, instead of grabbing a size that's still got
// the navigation and/or status bars before they're hidden.
//
// We'll wait for up to half a second, because some devices
// take a surprisingly long time for the surface resize, but
// then we'll just give up and return.
//
synchronized (SDLActivity.getContext()) {
try {
SDLActivity.getContext().wait(500);
} catch (InterruptedException ie) {
ie.printStackTrace();
}
} }
} }
} }
@ -863,9 +886,9 @@ public class SDLActivity extends Activity implements View.OnSystemUiVisibilityCh
orientation_portrait = ActivityInfo.SCREEN_ORIENTATION_REVERSE_PORTRAIT; orientation_portrait = ActivityInfo.SCREEN_ORIENTATION_REVERSE_PORTRAIT;
} }
boolean is_landscape_allowed = (orientation_landscape == -1 ? false : true); boolean is_landscape_allowed = (orientation_landscape != -1);
boolean is_portrait_allowed = (orientation_portrait == -1 ? false : true); boolean is_portrait_allowed = (orientation_portrait != -1);
int req = -1; /* Requested orientation */ int req; /* Requested orientation */
/* No valid hint, nothing is explicitly allowed */ /* No valid hint, nothing is explicitly allowed */
if (!is_portrait_allowed && !is_landscape_allowed) { if (!is_portrait_allowed && !is_landscape_allowed) {
@ -1001,7 +1024,7 @@ public class SDLActivity extends Activity implements View.OnSystemUiVisibilityCh
if (mSingleton == null) { if (mSingleton == null) {
return false; return false;
} }
return mSingleton.sendCommand(command, Integer.valueOf(param)); return mSingleton.sendCommand(command, param);
} }
/** /**
@ -1025,13 +1048,10 @@ public class SDLActivity extends Activity implements View.OnSystemUiVisibilityCh
if (Build.MANUFACTURER.equals("Amlogic") && Build.MODEL.equals("X96-W")) { if (Build.MANUFACTURER.equals("Amlogic") && Build.MODEL.equals("X96-W")) {
return true; return true;
} }
if (Build.MANUFACTURER.equals("Amlogic") && Build.MODEL.startsWith("TV")) { return Build.MANUFACTURER.equals("Amlogic") && Build.MODEL.startsWith("TV");
return true;
}
return false;
} }
public static double getDiagonal() public static double getDiagonal()
{ {
DisplayMetrics metrics = new DisplayMetrics(); DisplayMetrics metrics = new DisplayMetrics();
Activity activity = (Activity)getContext(); Activity activity = (Activity)getContext();
@ -1043,9 +1063,7 @@ public class SDLActivity extends Activity implements View.OnSystemUiVisibilityCh
double dWidthInches = metrics.widthPixels / (double)metrics.xdpi; double dWidthInches = metrics.widthPixels / (double)metrics.xdpi;
double dHeightInches = metrics.heightPixels / (double)metrics.ydpi; double dHeightInches = metrics.heightPixels / (double)metrics.ydpi;
double dDiagonal = Math.sqrt((dWidthInches * dWidthInches) + (dHeightInches * dHeightInches)); return Math.sqrt((dWidthInches * dWidthInches) + (dHeightInches * dHeightInches));
return dDiagonal;
} }
/** /**
@ -1075,7 +1093,7 @@ public class SDLActivity extends Activity implements View.OnSystemUiVisibilityCh
} }
try { try {
final Configuration config = getContext().getResources().getConfiguration(); final Configuration config = getContext().getResources().getConfiguration();
final Class configClass = config.getClass(); final Class<?> configClass = config.getClass();
return configClass.getField("SEM_DESKTOP_MODE_ENABLED").getInt(configClass) return configClass.getField("SEM_DESKTOP_MODE_ENABLED").getInt(configClass)
== configClass.getField("semDesktopModeEnabled").getInt(config); == configClass.getField("semDesktopModeEnabled").getInt(config);
} catch(Exception ignored) { } catch(Exception ignored) {
@ -1124,7 +1142,7 @@ public class SDLActivity extends Activity implements View.OnSystemUiVisibilityCh
// This method is called by SDLControllerManager's API 26 Generic Motion Handler. // This method is called by SDLControllerManager's API 26 Generic Motion Handler.
public static View getContentView() public static View getContentView()
{ {
return mSingleton.mLayout; return mLayout;
} }
static class ShowTextInputTask implements Runnable { static class ShowTextInputTask implements Runnable {
@ -1209,7 +1227,6 @@ public class SDLActivity extends Activity implements View.OnSystemUiVisibilityCh
*/ */
public static void setSurfaceViewFormat(int format) { public static void setSurfaceViewFormat(int format) {
mSingleton.sendCommand(COMMAND_CHANGE_SURFACEVIEW_FORMAT, format); mSingleton.sendCommand(COMMAND_CHANGE_SURFACEVIEW_FORMAT, format);
return;
} }
// Input // Input
@ -1220,8 +1237,8 @@ public class SDLActivity extends Activity implements View.OnSystemUiVisibilityCh
public static void initTouch() { public static void initTouch() {
int[] ids = InputDevice.getDeviceIds(); int[] ids = InputDevice.getDeviceIds();
for (int i = 0; i < ids.length; ++i) { for (int id : ids) {
InputDevice device = InputDevice.getDevice(ids[i]); InputDevice device = InputDevice.getDevice(id);
if (device != null && (device.getSources() & InputDevice.SOURCE_TOUCHSCREEN) != 0) { if (device != null && (device.getSources() & InputDevice.SOURCE_TOUCHSCREEN) != 0) {
nativeAddTouch(device.getId(), device.getName()); nativeAddTouch(device.getId(), device.getName());
} }
@ -1352,7 +1369,7 @@ public class SDLActivity extends Activity implements View.OnSystemUiVisibilityCh
int[] buttonIds = args.getIntArray("buttonIds"); int[] buttonIds = args.getIntArray("buttonIds");
String[] buttonTexts = args.getStringArray("buttonTexts"); String[] buttonTexts = args.getStringArray("buttonTexts");
final SparseArray<Button> mapping = new SparseArray<Button>(); final SparseArray<Button> mapping = new SparseArray<>();
LinearLayout buttons = new LinearLayout(this); LinearLayout buttons = new LinearLayout(this);
buttons.setOrientation(LinearLayout.HORIZONTAL); buttons.setOrientation(LinearLayout.HORIZONTAL);
@ -1432,14 +1449,16 @@ public class SDLActivity extends Activity implements View.OnSystemUiVisibilityCh
private final Runnable rehideSystemUi = new Runnable() { private final Runnable rehideSystemUi = new Runnable() {
@Override @Override
public void run() { public void run() {
int flags = View.SYSTEM_UI_FLAG_FULLSCREEN | if (Build.VERSION.SDK_INT >= 19) {
int flags = View.SYSTEM_UI_FLAG_FULLSCREEN |
View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION |
View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY |
View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN |
View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION |
View.SYSTEM_UI_FLAG_LAYOUT_STABLE | View.INVISIBLE; View.SYSTEM_UI_FLAG_LAYOUT_STABLE | View.INVISIBLE;
SDLActivity.this.getWindow().getDecorView().setSystemUiVisibility(flags); SDLActivity.this.getWindow().getDecorView().setSystemUiVisibility(flags);
}
} }
}; };
@ -1584,11 +1603,8 @@ public class SDLActivity extends Activity implements View.OnSystemUiVisibilityCh
@Override @Override
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) { public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) { boolean result = (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED);
nativePermissionResult(requestCode, true); nativePermissionResult(requestCode, result);
} else {
nativePermissionResult(requestCode, false);
}
} }
/** /**
@ -1639,13 +1655,12 @@ class SDLMain implements Runnable {
Log.v("SDL", "Finished main function"); Log.v("SDL", "Finished main function");
if (SDLActivity.mSingleton == null || SDLActivity.mSingleton.isFinishing()) { if (SDLActivity.mSingleton != null && !SDLActivity.mSingleton.isFinishing()) {
// Activity is already being destroyed
} else {
// Let's finish the Activity // Let's finish the Activity
SDLActivity.mSDLThread = null; SDLActivity.mSDLThread = null;
SDLActivity.mSingleton.finish(); SDLActivity.mSingleton.finish();
} } // else: Activity is already being destroyed
} }
} }
@ -1770,13 +1785,13 @@ class SDLSurface extends SurfaceView implements SurfaceHolder.Callback,
try try
{ {
if (Build.VERSION.SDK_INT >= 17) { if (Build.VERSION.SDK_INT >= 17) {
android.util.DisplayMetrics realMetrics = new android.util.DisplayMetrics(); DisplayMetrics realMetrics = new DisplayMetrics();
mDisplay.getRealMetrics( realMetrics ); mDisplay.getRealMetrics( realMetrics );
nDeviceWidth = realMetrics.widthPixels; nDeviceWidth = realMetrics.widthPixels;
nDeviceHeight = realMetrics.heightPixels; nDeviceHeight = realMetrics.heightPixels;
} }
} catch(Exception ignored) {
} }
catch ( java.lang.Throwable throwable ) {}
synchronized(SDLActivity.getContext()) { synchronized(SDLActivity.getContext()) {
// In case we're waiting on a size change after going fullscreen, send a notification. // In case we're waiting on a size change after going fullscreen, send a notification.
@ -1793,12 +1808,7 @@ class SDLSurface extends SurfaceView implements SurfaceHolder.Callback,
boolean skip = false; boolean skip = false;
int requestedOrientation = SDLActivity.mSingleton.getRequestedOrientation(); int requestedOrientation = SDLActivity.mSingleton.getRequestedOrientation();
if (requestedOrientation == ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED) if (requestedOrientation == ActivityInfo.SCREEN_ORIENTATION_PORTRAIT || requestedOrientation == ActivityInfo.SCREEN_ORIENTATION_SENSOR_PORTRAIT) {
{
// Accept any
}
else if (requestedOrientation == ActivityInfo.SCREEN_ORIENTATION_PORTRAIT || requestedOrientation == ActivityInfo.SCREEN_ORIENTATION_SENSOR_PORTRAIT)
{
if (mWidth > mHeight) { if (mWidth > mHeight) {
skip = true; skip = true;
} }
@ -1859,11 +1869,11 @@ class SDLSurface extends SurfaceView implements SurfaceHolder.Callback,
} }
} }
// if (event.getAction() == KeyEvent.ACTION_DOWN) { // if (event.getAction() == KeyEvent.ACTION_DOWN) {
// Log.v("SDL", "key down: " + keyCode + ", deviceId = " + deviceId + ", source = " + source); // Log.v("SDL", "key down: " + keyCode + ", deviceId = " + deviceId + ", source = " + source);
// } else if (event.getAction() == KeyEvent.ACTION_UP) { // } else if (event.getAction() == KeyEvent.ACTION_UP) {
// Log.v("SDL", "key up: " + keyCode + ", deviceId = " + deviceId + ", source = " + source); // Log.v("SDL", "key up: " + keyCode + ", deviceId = " + deviceId + ", source = " + source);
// } // }
// Dispatch the different events depending on where they come from // Dispatch the different events depending on where they come from
// Some SOURCE_JOYSTICK, SOURCE_DPAD or SOURCE_GAMEPAD are also SOURCE_KEYBOARD // Some SOURCE_JOYSTICK, SOURCE_DPAD or SOURCE_GAMEPAD are also SOURCE_KEYBOARD
@ -1923,11 +1933,10 @@ class SDLSurface extends SurfaceView implements SurfaceHolder.Callback,
final int pointerCount = event.getPointerCount(); final int pointerCount = event.getPointerCount();
int action = event.getActionMasked(); int action = event.getActionMasked();
int pointerFingerId; int pointerFingerId;
int mouseButton;
int i = -1; int i = -1;
float x,y,p; float x,y,p;
/** /*
* Prevent id to be -1, since it's used in SDL internal for synthetic events * Prevent id to be -1, since it's used in SDL internal for synthetic events
* Appears when using Android emulator, eg: * Appears when using Android emulator, eg:
* adb shell input mouse tap 100 100 * adb shell input mouse tap 100 100
@ -1941,10 +1950,13 @@ class SDLSurface extends SurfaceView implements SurfaceHolder.Callback,
// 12290 = 0x3002 = 0x2002 | 0x1002 = SOURCE_MOUSE | SOURCE_TOUCHSCREEN // 12290 = 0x3002 = 0x2002 | 0x1002 = SOURCE_MOUSE | SOURCE_TOUCHSCREEN
// 0x2 = SOURCE_CLASS_POINTER // 0x2 = SOURCE_CLASS_POINTER
if (event.getSource() == InputDevice.SOURCE_MOUSE || event.getSource() == (InputDevice.SOURCE_MOUSE | InputDevice.SOURCE_TOUCHSCREEN)) { if (event.getSource() == InputDevice.SOURCE_MOUSE || event.getSource() == (InputDevice.SOURCE_MOUSE | InputDevice.SOURCE_TOUCHSCREEN)) {
int mouseButton = 1;
try { try {
mouseButton = (Integer) event.getClass().getMethod("getButtonState").invoke(event); Object object = event.getClass().getMethod("getButtonState").invoke(event);
} catch(Exception e) { if (object != null) {
mouseButton = 1; // oh well. mouseButton = (Integer) object;
}
} catch(Exception ignored) {
} }
// We need to check if we're in relative mouse mode and get the axis offset rather than the x/y values // We need to check if we're in relative mouse mode and get the axis offset rather than the x/y values
@ -1975,6 +1987,7 @@ class SDLSurface extends SurfaceView implements SurfaceHolder.Callback,
case MotionEvent.ACTION_DOWN: case MotionEvent.ACTION_DOWN:
// Primary pointer up/down, the index is always zero // Primary pointer up/down, the index is always zero
i = 0; i = 0;
/* fallthrough */
case MotionEvent.ACTION_POINTER_UP: case MotionEvent.ACTION_POINTER_UP:
case MotionEvent.ACTION_POINTER_DOWN: case MotionEvent.ACTION_POINTER_DOWN:
// Non primary pointer up/down // Non primary pointer up/down
@ -2041,7 +2054,7 @@ class SDLSurface extends SurfaceView implements SurfaceHolder.Callback,
// Since we may have an orientation set, we won't receive onConfigurationChanged events. // Since we may have an orientation set, we won't receive onConfigurationChanged events.
// We thus should check here. // We thus should check here.
int newOrientation = SDLActivity.SDL_ORIENTATION_UNKNOWN; int newOrientation;
float x, y; float x, y;
switch (mDisplay.getRotation()) { switch (mDisplay.getRotation()) {
@ -2060,6 +2073,7 @@ class SDLSurface extends SurfaceView implements SurfaceHolder.Callback,
y = -event.values[1]; y = -event.values[1];
newOrientation = SDLActivity.SDL_ORIENTATION_PORTRAIT_FLIPPED; newOrientation = SDLActivity.SDL_ORIENTATION_PORTRAIT_FLIPPED;
break; break;
case Surface.ROTATION_0:
default: default:
x = event.values[0]; x = event.values[0];
y = event.values[1]; y = event.values[1];
@ -2106,8 +2120,7 @@ class SDLSurface extends SurfaceView implements SurfaceHolder.Callback,
// Change our action value to what SDL's code expects. // Change our action value to what SDL's code expects.
if (action == MotionEvent.ACTION_BUTTON_PRESS) { if (action == MotionEvent.ACTION_BUTTON_PRESS) {
action = MotionEvent.ACTION_DOWN; action = MotionEvent.ACTION_DOWN;
} } else { /* MotionEvent.ACTION_BUTTON_RELEASE */
else if (action == MotionEvent.ACTION_BUTTON_RELEASE) {
action = MotionEvent.ACTION_UP; action = MotionEvent.ACTION_UP;
} }
@ -2272,31 +2285,20 @@ class SDLInputConnection extends BaseInputConnection {
} }
} }
interface SDLClipboardHandler { class SDLClipboardHandler implements
ClipboardManager.OnPrimaryClipChangedListener {
boolean clipboardHasText(); protected ClipboardManager mClipMgr;
String clipboardGetText();
void clipboardSetText(String string);
} SDLClipboardHandler() {
mClipMgr = (ClipboardManager) SDL.getContext().getSystemService(Context.CLIPBOARD_SERVICE);
class SDLClipboardHandler_API11 implements
SDLClipboardHandler,
android.content.ClipboardManager.OnPrimaryClipChangedListener {
protected android.content.ClipboardManager mClipMgr;
SDLClipboardHandler_API11() {
mClipMgr = (android.content.ClipboardManager) SDL.getContext().getSystemService(Context.CLIPBOARD_SERVICE);
mClipMgr.addPrimaryClipChangedListener(this); mClipMgr.addPrimaryClipChangedListener(this);
} }
@Override
public boolean clipboardHasText() { public boolean clipboardHasText() {
return mClipMgr.hasPrimaryClip(); return mClipMgr.hasPrimaryClip();
} }
@Override
public String clipboardGetText() { public String clipboardGetText() {
ClipData clip = mClipMgr.getPrimaryClip(); ClipData clip = mClipMgr.getPrimaryClip();
if (clip != null) { if (clip != null) {
@ -2311,7 +2313,6 @@ class SDLClipboardHandler_API11 implements
return null; return null;
} }
@Override
public void clipboardSetText(String string) { public void clipboardSetText(String string) {
mClipMgr.removePrimaryClipChangedListener(this); mClipMgr.removePrimaryClipChangedListener(this);
ClipData clip = ClipData.newPlainText(null, string); ClipData clip = ClipData.newPlainText(null, string);

View File

@ -1,6 +1,10 @@
package org.libsdl.app; package org.libsdl.app;
import android.media.*; import android.media.AudioFormat;
import android.media.AudioManager;
import android.media.AudioRecord;
import android.media.AudioTrack;
import android.media.MediaRecorder;
import android.os.Build; import android.os.Build;
import android.util.Log; import android.util.Log;
@ -199,7 +203,6 @@ public class SDLAudioManager
results[0] = mAudioRecord.getSampleRate(); results[0] = mAudioRecord.getSampleRate();
results[1] = mAudioRecord.getAudioFormat(); results[1] = mAudioRecord.getAudioFormat();
results[2] = mAudioRecord.getChannelCount(); results[2] = mAudioRecord.getChannelCount();
results[3] = desiredFrames;
} else { } else {
if (mAudioTrack == null) { if (mAudioTrack == null) {
@ -223,8 +226,8 @@ public class SDLAudioManager
results[0] = mAudioTrack.getSampleRate(); results[0] = mAudioTrack.getSampleRate();
results[1] = mAudioTrack.getAudioFormat(); results[1] = mAudioTrack.getAudioFormat();
results[2] = mAudioTrack.getChannelCount(); results[2] = mAudioTrack.getChannelCount();
results[3] = desiredFrames;
} }
results[3] = desiredFrames;
Log.v(TAG, "Opening " + (isCapture ? "capture" : "playback") + ", got " + results[3] + " frames of " + results[2] + " channel " + getAudioFormatString(results[1]) + " audio at " + results[0] + " Hz"); Log.v(TAG, "Opening " + (isCapture ? "capture" : "playback") + ", got " + results[3] + " frames of " + results[2] + " channel " + getAudioFormatString(results[1]) + " audio at " + results[0] + " Hz");

View File

@ -6,9 +6,14 @@ import java.util.Comparator;
import java.util.List; import java.util.List;
import android.content.Context; import android.content.Context;
import android.os.*; import android.os.Build;
import android.view.*; import android.os.VibrationEffect;
import android.os.Vibrator;
import android.util.Log; import android.util.Log;
import android.view.InputDevice;
import android.view.KeyEvent;
import android.view.MotionEvent;
import android.view.View;
public class SDLControllerManager public class SDLControllerManager
@ -98,7 +103,7 @@ public class SDLControllerManager
int sources = device.getSources(); int sources = device.getSources();
/* This is called for every button press, so let's not spam the logs */ /* This is called for every button press, so let's not spam the logs */
/** /*
if ((sources & InputDevice.SOURCE_CLASS_JOYSTICK) != 0) { if ((sources & InputDevice.SOURCE_CLASS_JOYSTICK) != 0) {
Log.v(TAG, "Input device " + device.getName() + " has class joystick."); Log.v(TAG, "Input device " + device.getName() + " has class joystick.");
} }
@ -108,7 +113,7 @@ public class SDLControllerManager
if ((sources & InputDevice.SOURCE_GAMEPAD) == InputDevice.SOURCE_GAMEPAD) { if ((sources & InputDevice.SOURCE_GAMEPAD) == InputDevice.SOURCE_GAMEPAD) {
Log.v(TAG, "Input device " + device.getName() + " is a gamepad."); Log.v(TAG, "Input device " + device.getName() + " is a gamepad.");
} }
**/ */
return ((sources & InputDevice.SOURCE_CLASS_JOYSTICK) != 0 || return ((sources & InputDevice.SOURCE_CLASS_JOYSTICK) != 0 ||
((sources & InputDevice.SOURCE_DPAD) == InputDevice.SOURCE_DPAD) || ((sources & InputDevice.SOURCE_DPAD) == InputDevice.SOURCE_DPAD) ||
@ -167,11 +172,11 @@ class SDLJoystickHandler_API16 extends SDLJoystickHandler {
} }
} }
private ArrayList<SDLJoystick> mJoysticks; private final ArrayList<SDLJoystick> mJoysticks;
public SDLJoystickHandler_API16() { public SDLJoystickHandler_API16() {
mJoysticks = new ArrayList<SDLJoystick>(); mJoysticks = new ArrayList<>();
} }
@Override @Override
@ -187,8 +192,8 @@ class SDLJoystickHandler_API16 extends SDLJoystickHandler {
joystick.device_id = device_id; joystick.device_id = device_id;
joystick.name = joystickDevice.getName(); joystick.name = joystickDevice.getName();
joystick.desc = getJoystickDescriptor(joystickDevice); joystick.desc = getJoystickDescriptor(joystickDevice);
joystick.axes = new ArrayList<InputDevice.MotionRange>(); joystick.axes = new ArrayList<>();
joystick.hats = new ArrayList<InputDevice.MotionRange>(); joystick.hats = new ArrayList<>();
List<InputDevice.MotionRange> ranges = joystickDevice.getMotionRanges(); List<InputDevice.MotionRange> ranges = joystickDevice.getMotionRanges();
Collections.sort(ranges, new RangeComparator()); Collections.sort(ranges, new RangeComparator());
@ -203,8 +208,8 @@ class SDLJoystickHandler_API16 extends SDLJoystickHandler {
} }
mJoysticks.add(joystick); mJoysticks.add(joystick);
SDLControllerManager.nativeAddJoystick(joystick.device_id, joystick.name, joystick.desc, SDLControllerManager.nativeAddJoystick(joystick.device_id, joystick.name, joystick.desc,
getVendorId(joystickDevice), getProductId(joystickDevice), false, getVendorId(joystickDevice), getProductId(joystickDevice), false,
getButtonMask(joystickDevice), joystick.axes.size(), joystick.hats.size()/2, 0); getButtonMask(joystickDevice), joystick.axes.size(), joystick.hats.size()/2, 0);
} }
} }
@ -220,7 +225,7 @@ class SDLJoystickHandler_API16 extends SDLJoystickHandler {
} }
if (i == deviceIds.length) { if (i == deviceIds.length) {
if (removedDevices == null) { if (removedDevices == null) {
removedDevices = new ArrayList<Integer>(); removedDevices = new ArrayList<>();
} }
removedDevices.add(device_id); removedDevices.add(device_id);
} }
@ -253,25 +258,21 @@ class SDLJoystickHandler_API16 extends SDLJoystickHandler {
if ((event.getSource() & InputDevice.SOURCE_JOYSTICK) != 0) { if ((event.getSource() & InputDevice.SOURCE_JOYSTICK) != 0) {
int actionPointerIndex = event.getActionIndex(); int actionPointerIndex = event.getActionIndex();
int action = event.getActionMasked(); int action = event.getActionMasked();
switch(action) { if (action == MotionEvent.ACTION_MOVE) {
case MotionEvent.ACTION_MOVE: SDLJoystick joystick = getJoystick(event.getDeviceId());
SDLJoystick joystick = getJoystick(event.getDeviceId()); if (joystick != null) {
if ( joystick != null ) { for (int i = 0; i < joystick.axes.size(); i++) {
for (int i = 0; i < joystick.axes.size(); i++) { InputDevice.MotionRange range = joystick.axes.get(i);
InputDevice.MotionRange range = joystick.axes.get(i); /* Normalize the value to -1...1 */
/* Normalize the value to -1...1 */ float value = (event.getAxisValue(range.getAxis(), actionPointerIndex) - range.getMin()) / range.getRange() * 2.0f - 1.0f;
float value = ( event.getAxisValue( range.getAxis(), actionPointerIndex) - range.getMin() ) / range.getRange() * 2.0f - 1.0f; SDLControllerManager.onNativeJoy(joystick.device_id, i, value);
SDLControllerManager.onNativeJoy(joystick.device_id, i, value );
}
for (int i = 0; i < joystick.hats.size()/2; i++) {
int hatX = Math.round(event.getAxisValue( joystick.hats.get(2 * i).getAxis(), actionPointerIndex ));
int hatY = Math.round(event.getAxisValue( joystick.hats.get(2 * i + 1).getAxis(), actionPointerIndex ));
SDLControllerManager.onNativeHat(joystick.device_id, i, hatX, hatY);
}
} }
break; for (int i = 0; i < joystick.hats.size() / 2; i++) {
default: int hatX = Math.round(event.getAxisValue(joystick.hats.get(2 * i).getAxis(), actionPointerIndex));
break; int hatY = Math.round(event.getAxisValue(joystick.hats.get(2 * i + 1).getAxis(), actionPointerIndex));
SDLControllerManager.onNativeHat(joystick.device_id, i, hatX, hatY);
}
}
} }
} }
return true; return true;
@ -437,16 +438,16 @@ class SDLHapticHandler_API26 extends SDLHapticHandler {
class SDLHapticHandler { class SDLHapticHandler {
class SDLHaptic { static class SDLHaptic {
public int device_id; public int device_id;
public String name; public String name;
public Vibrator vib; public Vibrator vib;
} }
private ArrayList<SDLHaptic> mHaptics; private final ArrayList<SDLHaptic> mHaptics;
public SDLHapticHandler() { public SDLHapticHandler() {
mHaptics = new ArrayList<SDLHaptic>(); mHaptics = new ArrayList<>();
} }
public void run(int device_id, float intensity, int length) { public void run(int device_id, float intensity, int length) {
@ -517,14 +518,14 @@ class SDLHapticHandler {
if (device_id == deviceIds[i]) break; if (device_id == deviceIds[i]) break;
} }
if (device_id == deviceId_VIBRATOR_SERVICE && hasVibratorService) { if (device_id != deviceId_VIBRATOR_SERVICE || !hasVibratorService) {
// don't remove the vibrator if it is still present if (i == deviceIds.length) {
} else if (i == deviceIds.length) { if (removedDevices == null) {
if (removedDevices == null) { removedDevices = new ArrayList<>();
removedDevices = new ArrayList<Integer>(); }
removedDevices.add(device_id);
} }
removedDevices.add(device_id); } // else: don't remove the vibrator if it is still present
}
} }
if (removedDevices != null) { if (removedDevices != null) {
@ -664,8 +665,7 @@ class SDLGenericMotionListener_API24 extends SDLGenericMotionListener_API12 {
public float getEventX(MotionEvent event) { public float getEventX(MotionEvent event) {
if (mRelativeModeEnabled) { if (mRelativeModeEnabled) {
return event.getAxisValue(MotionEvent.AXIS_RELATIVE_X); return event.getAxisValue(MotionEvent.AXIS_RELATIVE_X);
} } else {
else {
return event.getX(0); return event.getX(0);
} }
} }
@ -674,14 +674,12 @@ class SDLGenericMotionListener_API24 extends SDLGenericMotionListener_API12 {
public float getEventY(MotionEvent event) { public float getEventY(MotionEvent event) {
if (mRelativeModeEnabled) { if (mRelativeModeEnabled) {
return event.getAxisValue(MotionEvent.AXIS_RELATIVE_Y); return event.getAxisValue(MotionEvent.AXIS_RELATIVE_Y);
} } else {
else {
return event.getY(0); return event.getY(0);
} }
} }
} }
class SDLGenericMotionListener_API26 extends SDLGenericMotionListener_API24 { class SDLGenericMotionListener_API26 extends SDLGenericMotionListener_API24 {
// Generic Motion (mouse hover, joystick...) events go here // Generic Motion (mouse hover, joystick...) events go here
private boolean mRelativeModeEnabled; private boolean mRelativeModeEnabled;
@ -762,15 +760,12 @@ class SDLGenericMotionListener_API26 extends SDLGenericMotionListener_API24 {
if (!SDLActivity.isDeXMode() || (Build.VERSION.SDK_INT >= 27)) { if (!SDLActivity.isDeXMode() || (Build.VERSION.SDK_INT >= 27)) {
if (enabled) { if (enabled) {
SDLActivity.getContentView().requestPointerCapture(); SDLActivity.getContentView().requestPointerCapture();
} } else {
else {
SDLActivity.getContentView().releasePointerCapture(); SDLActivity.getContentView().releasePointerCapture();
} }
mRelativeModeEnabled = enabled; mRelativeModeEnabled = enabled;
return true; return true;
} } else {
else
{
return false; return false;
} }
} }