annotate android/src/org/libsdl/app/SDLActivity.java @ 1348:040c5600e2d9

Implemented slow rise time of IO pins set as inputs, but not driven by device. Fixes input in Decap Attack and possibly other games with buggy controller code
author Michael Pavone <pavone@retrodev.com>
date Mon, 08 May 2017 22:31:28 -0700
parents 0e5f9d6135be
children 78abbabfd58d
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
856
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1 package org.libsdl.app;
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
2
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
3 import java.util.ArrayList;
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
4 import java.util.Arrays;
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
5 import java.util.Collections;
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
6 import java.util.Comparator;
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
7 import java.util.List;
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
8
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
9 import android.app.*;
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
10 import android.content.*;
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
11 import android.view.*;
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
12 import android.view.inputmethod.BaseInputConnection;
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
13 import android.view.inputmethod.EditorInfo;
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
14 import android.view.inputmethod.InputConnection;
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
15 import android.view.inputmethod.InputMethodManager;
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
16 import android.widget.AbsoluteLayout;
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
17 import android.os.*;
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
18 import android.util.Log;
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
19 import android.graphics.*;
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
20 import android.media.*;
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
21 import android.hardware.*;
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
22
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
23
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
24 /**
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
25 SDL Activity
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
26 */
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
27 public class SDLActivity extends Activity {
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
28 private static final String TAG = "SDL";
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
29
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
30 // Keep track of the paused state
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
31 public static boolean mIsPaused, mIsSurfaceReady, mHasFocus;
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
32 public static boolean mExitCalledFromJava;
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
33
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
34 // Main components
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
35 protected static SDLActivity mSingleton;
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
36 protected static SDLSurface mSurface;
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
37 protected static View mTextEdit;
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
38 protected static ViewGroup mLayout;
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
39 protected static SDLJoystickHandler mJoystickHandler;
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
40
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
41 // This is what SDL runs in. It invokes SDL_main(), eventually
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
42 protected static Thread mSDLThread;
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
43
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
44 // Audio
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
45 protected static AudioTrack mAudioTrack;
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
46
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
47 // Load the .so
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
48 static {
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
49 System.loadLibrary("SDL2");
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
50 //System.loadLibrary("SDL2_image");
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
51 //System.loadLibrary("SDL2_mixer");
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
52 //System.loadLibrary("SDL2_net");
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
53 //System.loadLibrary("SDL2_ttf");
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
54 System.loadLibrary("main");
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
55 }
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
56
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
57
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
58 public static void initialize() {
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
59 // The static nature of the singleton and Android quirkyness force us to initialize everything here
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
60 // Otherwise, when exiting the app and returning to it, these variables *keep* their pre exit values
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
61 mSingleton = null;
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
62 mSurface = null;
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
63 mTextEdit = null;
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
64 mLayout = null;
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
65 mJoystickHandler = null;
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
66 mSDLThread = null;
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
67 mAudioTrack = null;
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
68 mExitCalledFromJava = false;
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
69 mIsPaused = false;
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
70 mIsSurfaceReady = false;
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
71 mHasFocus = true;
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
72 }
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
73
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
74 // Setup
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
75 @Override
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
76 protected void onCreate(Bundle savedInstanceState) {
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
77 Log.v("SDL", "onCreate():" + mSingleton);
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
78 super.onCreate(savedInstanceState);
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
79
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
80 SDLActivity.initialize();
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
81 // So we can call stuff from static callbacks
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
82 mSingleton = this;
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
83
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
84 // Set up the surface
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
85 mSurface = new SDLSurface(getApplication());
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
86
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
87 if(Build.VERSION.SDK_INT >= 12) {
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
88 mJoystickHandler = new SDLJoystickHandler_API12();
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
89 }
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
90 else {
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
91 mJoystickHandler = new SDLJoystickHandler();
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
92 }
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
93
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
94 mLayout = new AbsoluteLayout(this);
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
95 mLayout.addView(mSurface);
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
96
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
97 setContentView(mLayout);
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
98 }
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
99
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
100 // Events
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
101 @Override
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
102 protected void onPause() {
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
103 Log.v("SDL", "onPause()");
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
104 super.onPause();
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
105 SDLActivity.handlePause();
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
106 }
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
107
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
108 @Override
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
109 protected void onResume() {
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
110 Log.v("SDL", "onResume()");
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
111 super.onResume();
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
112 SDLActivity.handleResume();
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
113 }
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
114
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
115
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
116 @Override
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
117 public void onWindowFocusChanged(boolean hasFocus) {
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
118 super.onWindowFocusChanged(hasFocus);
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
119 Log.v("SDL", "onWindowFocusChanged(): " + hasFocus);
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
120
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
121 SDLActivity.mHasFocus = hasFocus;
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
122 if (hasFocus) {
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
123 SDLActivity.handleResume();
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
124 }
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
125 }
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
126
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
127 @Override
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
128 public void onLowMemory() {
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
129 Log.v("SDL", "onLowMemory()");
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
130 super.onLowMemory();
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
131 SDLActivity.nativeLowMemory();
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
132 }
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
133
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
134 @Override
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
135 protected void onDestroy() {
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
136 Log.v("SDL", "onDestroy()");
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
137 // Send a quit message to the application
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
138 SDLActivity.mExitCalledFromJava = true;
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
139 SDLActivity.nativeQuit();
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
140
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
141 // Now wait for the SDL thread to quit
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
142 if (SDLActivity.mSDLThread != null) {
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
143 try {
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
144 SDLActivity.mSDLThread.join();
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
145 } catch(Exception e) {
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
146 Log.v("SDL", "Problem stopping thread: " + e);
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
147 }
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
148 SDLActivity.mSDLThread = null;
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
149
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
150 //Log.v("SDL", "Finished waiting for SDL thread");
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
151 }
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
152
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
153 super.onDestroy();
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
154 // Reset everything in case the user re opens the app
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
155 SDLActivity.initialize();
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
156 }
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
157
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
158 @Override
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
159 public boolean dispatchKeyEvent(KeyEvent event) {
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
160 int keyCode = event.getKeyCode();
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
161 // Ignore certain special keys so they're handled by Android
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
162 if (keyCode == KeyEvent.KEYCODE_VOLUME_DOWN ||
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
163 keyCode == KeyEvent.KEYCODE_VOLUME_UP ||
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
164 keyCode == KeyEvent.KEYCODE_CAMERA ||
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
165 keyCode == 168 || /* API 11: KeyEvent.KEYCODE_ZOOM_IN */
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
166 keyCode == 169 /* API 11: KeyEvent.KEYCODE_ZOOM_OUT */
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
167 ) {
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
168 return false;
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
169 }
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
170 return super.dispatchKeyEvent(event);
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
171 }
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
172
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
173 /** Called by onPause or surfaceDestroyed. Even if surfaceDestroyed
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
174 * is the first to be called, mIsSurfaceReady should still be set
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
175 * to 'true' during the call to onPause (in a usual scenario).
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
176 */
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
177 public static void handlePause() {
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
178 if (!SDLActivity.mIsPaused && SDLActivity.mIsSurfaceReady) {
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
179 SDLActivity.mIsPaused = true;
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
180 SDLActivity.nativePause();
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
181 mSurface.enableSensor(Sensor.TYPE_ACCELEROMETER, false);
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
182 }
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
183 }
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
184
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
185 /** Called by onResume or surfaceCreated. An actual resume should be done only when the surface is ready.
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
186 * Note: Some Android variants may send multiple surfaceChanged events, so we don't need to resume
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
187 * every time we get one of those events, only if it comes after surfaceDestroyed
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
188 */
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
189 public static void handleResume() {
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
190 if (SDLActivity.mIsPaused && SDLActivity.mIsSurfaceReady && SDLActivity.mHasFocus) {
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
191 SDLActivity.mIsPaused = false;
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
192 SDLActivity.nativeResume();
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
193 mSurface.enableSensor(Sensor.TYPE_ACCELEROMETER, true);
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
194 }
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
195 }
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
196
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
197 /* The native thread has finished */
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
198 public static void handleNativeExit() {
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
199 SDLActivity.mSDLThread = null;
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
200 mSingleton.finish();
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
201 }
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
202
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
203
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
204 // Messages from the SDLMain thread
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
205 static final int COMMAND_CHANGE_TITLE = 1;
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
206 static final int COMMAND_UNUSED = 2;
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
207 static final int COMMAND_TEXTEDIT_HIDE = 3;
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
208
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
209 protected static final int COMMAND_USER = 0x8000;
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
210
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
211 /**
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
212 * This method is called by SDL if SDL did not handle a message itself.
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
213 * This happens if a received message contains an unsupported command.
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
214 * Method can be overwritten to handle Messages in a different class.
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
215 * @param command the command of the message.
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
216 * @param param the parameter of the message. May be null.
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
217 * @return if the message was handled in overridden method.
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
218 */
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
219 protected boolean onUnhandledMessage(int command, Object param) {
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
220 return false;
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
221 }
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
222
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
223 /**
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
224 * A Handler class for Messages from native SDL applications.
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
225 * It uses current Activities as target (e.g. for the title).
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
226 * static to prevent implicit references to enclosing object.
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
227 */
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
228 protected static class SDLCommandHandler extends Handler {
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
229 @Override
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
230 public void handleMessage(Message msg) {
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
231 Context context = getContext();
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
232 if (context == null) {
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
233 Log.e(TAG, "error handling message, getContext() returned null");
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
234 return;
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
235 }
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
236 switch (msg.arg1) {
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
237 case COMMAND_CHANGE_TITLE:
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
238 if (context instanceof Activity) {
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
239 ((Activity) context).setTitle((String)msg.obj);
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
240 } else {
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
241 Log.e(TAG, "error handling message, getContext() returned no Activity");
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
242 }
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
243 break;
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
244 case COMMAND_TEXTEDIT_HIDE:
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
245 if (mTextEdit != null) {
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
246 mTextEdit.setVisibility(View.GONE);
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
247
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
248 InputMethodManager imm = (InputMethodManager) context.getSystemService(Context.INPUT_METHOD_SERVICE);
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
249 imm.hideSoftInputFromWindow(mTextEdit.getWindowToken(), 0);
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
250 }
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
251 break;
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
252
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
253 default:
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
254 if ((context instanceof SDLActivity) && !((SDLActivity) context).onUnhandledMessage(msg.arg1, msg.obj)) {
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
255 Log.e(TAG, "error handling message, command is " + msg.arg1);
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
256 }
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
257 }
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
258 }
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
259 }
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
260
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
261 // Handler for the messages
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
262 Handler commandHandler = new SDLCommandHandler();
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
263
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
264 // Send a message from the SDLMain thread
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
265 boolean sendCommand(int command, Object data) {
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
266 Message msg = commandHandler.obtainMessage();
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
267 msg.arg1 = command;
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
268 msg.obj = data;
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
269 return commandHandler.sendMessage(msg);
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
270 }
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
271
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
272 // C functions we call
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
273 public static native void nativeInit();
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
274 public static native void nativeLowMemory();
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
275 public static native void nativeQuit();
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
276 public static native void nativePause();
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
277 public static native void nativeResume();
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
278 public static native void onNativeResize(int x, int y, int format);
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
279 public static native int onNativePadDown(int device_id, int keycode);
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
280 public static native int onNativePadUp(int device_id, int keycode);
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
281 public static native void onNativeJoy(int device_id, int axis,
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
282 float value);
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
283 public static native void onNativeHat(int device_id, int hat_id,
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
284 int x, int y);
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
285 public static native void onNativeKeyDown(int keycode);
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
286 public static native void onNativeKeyUp(int keycode);
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
287 public static native void onNativeKeyboardFocusLost();
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
288 public static native void onNativeTouch(int touchDevId, int pointerFingerId,
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
289 int action, float x,
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
290 float y, float p);
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
291 public static native void onNativeAccel(float x, float y, float z);
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
292 public static native void onNativeSurfaceChanged();
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
293 public static native void onNativeSurfaceDestroyed();
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
294 public static native void nativeFlipBuffers();
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
295 public static native int nativeAddJoystick(int device_id, String name,
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
296 int is_accelerometer, int nbuttons,
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
297 int naxes, int nhats, int nballs);
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
298 public static native int nativeRemoveJoystick(int device_id);
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
299
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
300 public static void flipBuffers() {
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
301 SDLActivity.nativeFlipBuffers();
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
302 }
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
303
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
304 public static boolean setActivityTitle(String title) {
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
305 // Called from SDLMain() thread and can't directly affect the view
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
306 return mSingleton.sendCommand(COMMAND_CHANGE_TITLE, title);
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
307 }
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
308
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
309 public static boolean sendMessage(int command, int param) {
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
310 return mSingleton.sendCommand(command, Integer.valueOf(param));
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
311 }
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
312
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
313 public static Context getContext() {
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
314 return mSingleton;
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
315 }
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
316
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
317 /**
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
318 * @return result of getSystemService(name) but executed on UI thread.
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
319 */
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
320 public Object getSystemServiceFromUiThread(final String name) {
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
321 final Object lock = new Object();
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
322 final Object[] results = new Object[2]; // array for writable variables
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
323 synchronized (lock) {
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
324 runOnUiThread(new Runnable() {
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
325 @Override
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
326 public void run() {
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
327 synchronized (lock) {
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
328 results[0] = getSystemService(name);
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
329 results[1] = Boolean.TRUE;
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
330 lock.notify();
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
331 }
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
332 }
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
333 });
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
334 if (results[1] == null) {
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
335 try {
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
336 lock.wait();
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
337 } catch (InterruptedException ex) {
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
338 ex.printStackTrace();
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
339 }
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
340 }
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
341 }
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
342 return results[0];
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
343 }
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
344
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
345 static class ShowTextInputTask implements Runnable {
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
346 /*
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
347 * This is used to regulate the pan&scan method to have some offset from
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
348 * the bottom edge of the input region and the top edge of an input
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
349 * method (soft keyboard)
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
350 */
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
351 static final int HEIGHT_PADDING = 15;
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
352
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
353 public int x, y, w, h;
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
354
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
355 public ShowTextInputTask(int x, int y, int w, int h) {
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
356 this.x = x;
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
357 this.y = y;
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
358 this.w = w;
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
359 this.h = h;
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
360 }
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
361
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
362 @Override
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
363 public void run() {
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
364 AbsoluteLayout.LayoutParams params = new AbsoluteLayout.LayoutParams(
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
365 w, h + HEIGHT_PADDING, x, y);
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
366
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
367 if (mTextEdit == null) {
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
368 mTextEdit = new DummyEdit(getContext());
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
369
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
370 mLayout.addView(mTextEdit, params);
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
371 } else {
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
372 mTextEdit.setLayoutParams(params);
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
373 }
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
374
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
375 mTextEdit.setVisibility(View.VISIBLE);
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
376 mTextEdit.requestFocus();
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
377
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
378 InputMethodManager imm = (InputMethodManager) getContext().getSystemService(Context.INPUT_METHOD_SERVICE);
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
379 imm.showSoftInput(mTextEdit, 0);
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
380 }
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
381 }
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
382
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
383 public static boolean showTextInput(int x, int y, int w, int h) {
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
384 // Transfer the task to the main thread as a Runnable
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
385 return mSingleton.commandHandler.post(new ShowTextInputTask(x, y, w, h));
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
386 }
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
387
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
388 public static Surface getNativeSurface() {
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
389 return SDLActivity.mSurface.getNativeSurface();
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
390 }
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
391
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
392 // Audio
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
393 public static int audioInit(int sampleRate, boolean is16Bit, boolean isStereo, int desiredFrames) {
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
394 int channelConfig = isStereo ? AudioFormat.CHANNEL_CONFIGURATION_STEREO : AudioFormat.CHANNEL_CONFIGURATION_MONO;
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
395 int audioFormat = is16Bit ? AudioFormat.ENCODING_PCM_16BIT : AudioFormat.ENCODING_PCM_8BIT;
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
396 int frameSize = (isStereo ? 2 : 1) * (is16Bit ? 2 : 1);
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
397
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
398 Log.v("SDL", "SDL audio: wanted " + (isStereo ? "stereo" : "mono") + " " + (is16Bit ? "16-bit" : "8-bit") + " " + (sampleRate / 1000f) + "kHz, " + desiredFrames + " frames buffer");
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
399
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
400 // Let the user pick a larger buffer if they really want -- but ye
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
401 // gods they probably shouldn't, the minimums are horrifyingly high
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
402 // latency already
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
403 desiredFrames = Math.max(desiredFrames, (AudioTrack.getMinBufferSize(sampleRate, channelConfig, audioFormat) + frameSize - 1) / frameSize);
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
404
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
405 if (mAudioTrack == null) {
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
406 mAudioTrack = new AudioTrack(AudioManager.STREAM_MUSIC, sampleRate,
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
407 channelConfig, audioFormat, desiredFrames * frameSize, AudioTrack.MODE_STREAM);
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
408
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
409 // Instantiating AudioTrack can "succeed" without an exception and the track may still be invalid
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
410 // Ref: https://android.googlesource.com/platform/frameworks/base/+/refs/heads/master/media/java/android/media/AudioTrack.java
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
411 // Ref: http://developer.android.com/reference/android/media/AudioTrack.html#getState()
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
412
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
413 if (mAudioTrack.getState() != AudioTrack.STATE_INITIALIZED) {
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
414 Log.e("SDL", "Failed during initialization of Audio Track");
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
415 mAudioTrack = null;
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
416 return -1;
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
417 }
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
418
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
419 mAudioTrack.play();
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
420 }
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
421
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
422 Log.v("SDL", "SDL audio: got " + ((mAudioTrack.getChannelCount() >= 2) ? "stereo" : "mono") + " " + ((mAudioTrack.getAudioFormat() == AudioFormat.ENCODING_PCM_16BIT) ? "16-bit" : "8-bit") + " " + (mAudioTrack.getSampleRate() / 1000f) + "kHz, " + desiredFrames + " frames buffer");
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
423
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
424 return 0;
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
425 }
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
426
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
427 public static void audioWriteShortBuffer(short[] buffer) {
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
428 for (int i = 0; i < buffer.length; ) {
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
429 int result = mAudioTrack.write(buffer, i, buffer.length - i);
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
430 if (result > 0) {
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
431 i += result;
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
432 } else if (result == 0) {
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
433 try {
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
434 Thread.sleep(1);
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
435 } catch(InterruptedException e) {
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
436 // Nom nom
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
437 }
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
438 } else {
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
439 Log.w("SDL", "SDL audio: error return from write(short)");
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
440 return;
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
441 }
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
442 }
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
443 }
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
444
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
445 public static void audioWriteByteBuffer(byte[] buffer) {
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
446 for (int i = 0; i < buffer.length; ) {
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
447 int result = mAudioTrack.write(buffer, i, buffer.length - i);
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
448 if (result > 0) {
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
449 i += result;
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
450 } else if (result == 0) {
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
451 try {
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
452 Thread.sleep(1);
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
453 } catch(InterruptedException e) {
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
454 // Nom nom
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
455 }
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
456 } else {
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
457 Log.w("SDL", "SDL audio: error return from write(byte)");
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
458 return;
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
459 }
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
460 }
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
461 }
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
462
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
463 public static void audioQuit() {
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
464 if (mAudioTrack != null) {
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
465 mAudioTrack.stop();
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
466 mAudioTrack = null;
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
467 }
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
468 }
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
469
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
470 // Input
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
471
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
472 /**
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
473 * @return an array which may be empty but is never null.
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
474 */
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
475 public static int[] inputGetInputDeviceIds(int sources) {
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
476 int[] ids = InputDevice.getDeviceIds();
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
477 int[] filtered = new int[ids.length];
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
478 int used = 0;
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
479 for (int i = 0; i < ids.length; ++i) {
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
480 InputDevice device = InputDevice.getDevice(ids[i]);
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
481 if ((device != null) && ((device.getSources() & sources) != 0)) {
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
482 filtered[used++] = device.getId();
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
483 }
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
484 }
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
485 return Arrays.copyOf(filtered, used);
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
486 }
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
487
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
488 // Joystick glue code, just a series of stubs that redirect to the SDLJoystickHandler instance
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
489 public static boolean handleJoystickMotionEvent(MotionEvent event) {
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
490 return mJoystickHandler.handleMotionEvent(event);
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
491 }
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
492
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
493 public static void pollInputDevices() {
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
494 if (SDLActivity.mSDLThread != null) {
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
495 mJoystickHandler.pollInputDevices();
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
496 }
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
497 }
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
498
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
499 }
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
500
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
501 /**
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
502 Simple nativeInit() runnable
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
503 */
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
504 class SDLMain implements Runnable {
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
505 @Override
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
506 public void run() {
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
507 // Runs SDL_main()
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
508 SDLActivity.nativeInit();
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
509
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
510 //Log.v("SDL", "SDL thread terminated");
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
511 }
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
512 }
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
513
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
514
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
515 /**
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
516 SDLSurface. This is what we draw on, so we need to know when it's created
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
517 in order to do anything useful.
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
518
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
519 Because of this, that's where we set up the SDL thread
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
520 */
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
521 class SDLSurface extends SurfaceView implements SurfaceHolder.Callback,
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
522 View.OnKeyListener, View.OnTouchListener, SensorEventListener {
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
523
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
524 // Sensors
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
525 protected static SensorManager mSensorManager;
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
526 protected static Display mDisplay;
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
527
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
528 // Keep track of the surface size to normalize touch events
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
529 protected static float mWidth, mHeight;
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
530
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
531 // Startup
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
532 public SDLSurface(Context context) {
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
533 super(context);
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
534 getHolder().addCallback(this);
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
535
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
536 setFocusable(true);
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
537 setFocusableInTouchMode(true);
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
538 requestFocus();
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
539 setOnKeyListener(this);
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
540 setOnTouchListener(this);
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
541
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
542 mDisplay = ((WindowManager)context.getSystemService(Context.WINDOW_SERVICE)).getDefaultDisplay();
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
543 mSensorManager = (SensorManager)context.getSystemService(Context.SENSOR_SERVICE);
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
544
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
545 if(Build.VERSION.SDK_INT >= 12) {
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
546 setOnGenericMotionListener(new SDLGenericMotionListener_API12());
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
547 }
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
548
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
549 // Some arbitrary defaults to avoid a potential division by zero
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
550 mWidth = 1.0f;
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
551 mHeight = 1.0f;
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
552 }
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
553
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
554 public Surface getNativeSurface() {
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
555 return getHolder().getSurface();
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
556 }
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
557
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
558 // Called when we have a valid drawing surface
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
559 @Override
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
560 public void surfaceCreated(SurfaceHolder holder) {
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
561 Log.v("SDL", "surfaceCreated()");
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
562 holder.setType(SurfaceHolder.SURFACE_TYPE_GPU);
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
563 }
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
564
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
565 // Called when we lose the surface
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
566 @Override
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
567 public void surfaceDestroyed(SurfaceHolder holder) {
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
568 Log.v("SDL", "surfaceDestroyed()");
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
569 // Call this *before* setting mIsSurfaceReady to 'false'
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
570 SDLActivity.handlePause();
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
571 SDLActivity.mIsSurfaceReady = false;
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
572 SDLActivity.onNativeSurfaceDestroyed();
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
573 }
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
574
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
575 // Called when the surface is resized
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
576 @Override
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
577 public void surfaceChanged(SurfaceHolder holder,
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
578 int format, int width, int height) {
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
579 Log.v("SDL", "surfaceChanged()");
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
580
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
581 int sdlFormat = 0x15151002; // SDL_PIXELFORMAT_RGB565 by default
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
582 switch (format) {
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
583 case PixelFormat.A_8:
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
584 Log.v("SDL", "pixel format A_8");
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
585 break;
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
586 case PixelFormat.LA_88:
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
587 Log.v("SDL", "pixel format LA_88");
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
588 break;
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
589 case PixelFormat.L_8:
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
590 Log.v("SDL", "pixel format L_8");
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
591 break;
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
592 case PixelFormat.RGBA_4444:
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
593 Log.v("SDL", "pixel format RGBA_4444");
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
594 sdlFormat = 0x15421002; // SDL_PIXELFORMAT_RGBA4444
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
595 break;
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
596 case PixelFormat.RGBA_5551:
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
597 Log.v("SDL", "pixel format RGBA_5551");
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
598 sdlFormat = 0x15441002; // SDL_PIXELFORMAT_RGBA5551
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
599 break;
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
600 case PixelFormat.RGBA_8888:
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
601 Log.v("SDL", "pixel format RGBA_8888");
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
602 sdlFormat = 0x16462004; // SDL_PIXELFORMAT_RGBA8888
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
603 break;
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
604 case PixelFormat.RGBX_8888:
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
605 Log.v("SDL", "pixel format RGBX_8888");
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
606 sdlFormat = 0x16261804; // SDL_PIXELFORMAT_RGBX8888
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
607 break;
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
608 case PixelFormat.RGB_332:
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
609 Log.v("SDL", "pixel format RGB_332");
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
610 sdlFormat = 0x14110801; // SDL_PIXELFORMAT_RGB332
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
611 break;
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
612 case PixelFormat.RGB_565:
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
613 Log.v("SDL", "pixel format RGB_565");
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
614 sdlFormat = 0x15151002; // SDL_PIXELFORMAT_RGB565
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
615 break;
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
616 case PixelFormat.RGB_888:
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
617 Log.v("SDL", "pixel format RGB_888");
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
618 // Not sure this is right, maybe SDL_PIXELFORMAT_RGB24 instead?
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
619 sdlFormat = 0x16161804; // SDL_PIXELFORMAT_RGB888
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
620 break;
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
621 default:
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
622 Log.v("SDL", "pixel format unknown " + format);
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
623 break;
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
624 }
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
625
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
626 mWidth = width;
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
627 mHeight = height;
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
628 SDLActivity.onNativeResize(width, height, sdlFormat);
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
629 Log.v("SDL", "Window size:" + width + "x"+height);
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
630
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
631 // Set mIsSurfaceReady to 'true' *before* making a call to handleResume
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
632 SDLActivity.mIsSurfaceReady = true;
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
633 SDLActivity.onNativeSurfaceChanged();
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
634
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
635
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
636 if (SDLActivity.mSDLThread == null) {
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
637 // This is the entry point to the C app.
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
638 // Start up the C app thread and enable sensor input for the first time
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
639
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
640 SDLActivity.mSDLThread = new Thread(new SDLMain(), "SDLThread");
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
641 enableSensor(Sensor.TYPE_ACCELEROMETER, true);
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
642 SDLActivity.mSDLThread.start();
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
643
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
644 // Set up a listener thread to catch when the native thread ends
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
645 new Thread(new Runnable(){
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
646 @Override
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
647 public void run(){
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
648 try {
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
649 SDLActivity.mSDLThread.join();
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
650 }
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
651 catch(Exception e){}
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
652 finally{
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
653 // Native thread has finished
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
654 if (! SDLActivity.mExitCalledFromJava) {
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
655 SDLActivity.handleNativeExit();
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
656 }
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
657 }
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
658 }
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
659 }).start();
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
660 }
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
661 }
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
662
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
663 // unused
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
664 @Override
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
665 public void onDraw(Canvas canvas) {}
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
666
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
667
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
668 // Key events
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
669 @Override
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
670 public boolean onKey(View v, int keyCode, KeyEvent event) {
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
671 // Dispatch the different events depending on where they come from
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
672 // Some SOURCE_DPAD or SOURCE_GAMEPAD are also SOURCE_KEYBOARD
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
673 // So, we try to process them as DPAD or GAMEPAD events first, if that fails we try them as KEYBOARD
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
674
903
0e5f9d6135be Make nexus player remote useable as a controller for games that only require a dpad + start + c. Use warning() instead of fprintf(stder,...) in io.c
Michael Pavone <pavone@retrodev.com>
parents: 856
diff changeset
675 if ( (event.getSource() & InputDevice.SOURCE_GAMEPAD) == InputDevice.SOURCE_GAMEPAD) {
856
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
676 if (event.getAction() == KeyEvent.ACTION_DOWN) {
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
677 if (SDLActivity.onNativePadDown(event.getDeviceId(), keyCode) == 0) {
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
678 return true;
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
679 }
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
680 } else if (event.getAction() == KeyEvent.ACTION_UP) {
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
681 if (SDLActivity.onNativePadUp(event.getDeviceId(), keyCode) == 0) {
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
682 return true;
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
683 }
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
684 }
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
685 }
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
686
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
687 if( (event.getSource() & InputDevice.SOURCE_KEYBOARD) != 0) {
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
688 if (event.getAction() == KeyEvent.ACTION_DOWN) {
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
689 //Log.v("SDL", "key down: " + keyCode);
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
690 SDLActivity.onNativeKeyDown(keyCode);
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
691 return true;
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
692 }
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
693 else if (event.getAction() == KeyEvent.ACTION_UP) {
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
694 //Log.v("SDL", "key up: " + keyCode);
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
695 SDLActivity.onNativeKeyUp(keyCode);
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
696 return true;
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
697 }
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
698 }
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
699
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
700 return false;
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
701 }
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
702
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
703 // Touch events
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
704 @Override
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
705 public boolean onTouch(View v, MotionEvent event) {
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
706 /* Ref: http://developer.android.com/training/gestures/multi.html */
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
707 final int touchDevId = event.getDeviceId();
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
708 final int pointerCount = event.getPointerCount();
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
709 int action = event.getActionMasked();
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
710 int pointerFingerId;
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
711 int i = -1;
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
712 float x,y,p;
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
713
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
714 switch(action) {
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
715 case MotionEvent.ACTION_MOVE:
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
716 for (i = 0; i < pointerCount; i++) {
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
717 pointerFingerId = event.getPointerId(i);
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
718 x = event.getX(i) / mWidth;
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
719 y = event.getY(i) / mHeight;
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
720 p = event.getPressure(i);
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
721 SDLActivity.onNativeTouch(touchDevId, pointerFingerId, action, x, y, p);
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
722 }
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
723 break;
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
724
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
725 case MotionEvent.ACTION_UP:
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
726 case MotionEvent.ACTION_DOWN:
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
727 // Primary pointer up/down, the index is always zero
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
728 i = 0;
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
729 case MotionEvent.ACTION_POINTER_UP:
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
730 case MotionEvent.ACTION_POINTER_DOWN:
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
731 // Non primary pointer up/down
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
732 if (i == -1) {
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
733 i = event.getActionIndex();
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
734 }
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
735
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
736 pointerFingerId = event.getPointerId(i);
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
737 x = event.getX(i) / mWidth;
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
738 y = event.getY(i) / mHeight;
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
739 p = event.getPressure(i);
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
740 SDLActivity.onNativeTouch(touchDevId, pointerFingerId, action, x, y, p);
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
741 break;
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
742
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
743 default:
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
744 break;
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
745 }
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
746
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
747 return true;
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
748 }
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
749
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
750 // Sensor events
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
751 public void enableSensor(int sensortype, boolean enabled) {
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
752 // TODO: This uses getDefaultSensor - what if we have >1 accels?
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
753 if (enabled) {
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
754 mSensorManager.registerListener(this,
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
755 mSensorManager.getDefaultSensor(sensortype),
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
756 SensorManager.SENSOR_DELAY_GAME, null);
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
757 } else {
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
758 mSensorManager.unregisterListener(this,
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
759 mSensorManager.getDefaultSensor(sensortype));
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
760 }
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
761 }
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
762
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
763 @Override
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
764 public void onAccuracyChanged(Sensor sensor, int accuracy) {
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
765 // TODO
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
766 }
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
767
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
768 @Override
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
769 public void onSensorChanged(SensorEvent event) {
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
770 if (event.sensor.getType() == Sensor.TYPE_ACCELEROMETER) {
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
771 float x, y;
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
772 switch (mDisplay.getRotation()) {
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
773 case Surface.ROTATION_90:
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
774 x = -event.values[1];
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
775 y = event.values[0];
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
776 break;
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
777 case Surface.ROTATION_270:
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
778 x = event.values[1];
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
779 y = -event.values[0];
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
780 break;
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
781 case Surface.ROTATION_180:
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
782 x = -event.values[1];
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
783 y = -event.values[0];
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
784 break;
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
785 default:
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
786 x = event.values[0];
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
787 y = event.values[1];
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
788 break;
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
789 }
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
790 SDLActivity.onNativeAccel(-x / SensorManager.GRAVITY_EARTH,
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
791 y / SensorManager.GRAVITY_EARTH,
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
792 event.values[2] / SensorManager.GRAVITY_EARTH - 1);
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
793 }
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
794 }
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
795 }
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
796
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
797 /* This is a fake invisible editor view that receives the input and defines the
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
798 * pan&scan region
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
799 */
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
800 class DummyEdit extends View implements View.OnKeyListener {
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
801 InputConnection ic;
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
802
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
803 public DummyEdit(Context context) {
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
804 super(context);
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
805 setFocusableInTouchMode(true);
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
806 setFocusable(true);
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
807 setOnKeyListener(this);
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
808 }
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
809
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
810 @Override
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
811 public boolean onCheckIsTextEditor() {
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
812 return true;
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
813 }
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
814
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
815 @Override
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
816 public boolean onKey(View v, int keyCode, KeyEvent event) {
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
817
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
818 // This handles the hardware keyboard input
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
819 if (event.isPrintingKey()) {
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
820 if (event.getAction() == KeyEvent.ACTION_DOWN) {
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
821 ic.commitText(String.valueOf((char) event.getUnicodeChar()), 1);
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
822 }
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
823 return true;
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
824 }
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
825
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
826 if (event.getAction() == KeyEvent.ACTION_DOWN) {
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
827 SDLActivity.onNativeKeyDown(keyCode);
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
828 return true;
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
829 } else if (event.getAction() == KeyEvent.ACTION_UP) {
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
830 SDLActivity.onNativeKeyUp(keyCode);
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
831 return true;
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
832 }
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
833
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
834 return false;
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
835 }
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
836
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
837 //
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
838 @Override
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
839 public boolean onKeyPreIme (int keyCode, KeyEvent event) {
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
840 // As seen on StackOverflow: http://stackoverflow.com/questions/7634346/keyboard-hide-event
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
841 // FIXME: Discussion at http://bugzilla.libsdl.org/show_bug.cgi?id=1639
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
842 // FIXME: This is not a 100% effective solution to the problem of detecting if the keyboard is showing or not
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
843 // FIXME: A more effective solution would be to change our Layout from AbsoluteLayout to Relative or Linear
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
844 // FIXME: And determine the keyboard presence doing this: http://stackoverflow.com/questions/2150078/how-to-check-visibility-of-software-keyboard-in-android
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
845 // FIXME: An even more effective way would be if Android provided this out of the box, but where would the fun be in that :)
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
846 if (event.getAction()==KeyEvent.ACTION_UP && keyCode == KeyEvent.KEYCODE_BACK) {
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
847 if (SDLActivity.mTextEdit != null && SDLActivity.mTextEdit.getVisibility() == View.VISIBLE) {
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
848 SDLActivity.onNativeKeyboardFocusLost();
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
849 }
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
850 }
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
851 return super.onKeyPreIme(keyCode, event);
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
852 }
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
853
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
854 @Override
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
855 public InputConnection onCreateInputConnection(EditorInfo outAttrs) {
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
856 ic = new SDLInputConnection(this, true);
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
857
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
858 outAttrs.imeOptions = EditorInfo.IME_FLAG_NO_EXTRACT_UI
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
859 | 33554432 /* API 11: EditorInfo.IME_FLAG_NO_FULLSCREEN */;
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
860
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
861 return ic;
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
862 }
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
863 }
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
864
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
865 class SDLInputConnection extends BaseInputConnection {
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
866
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
867 public SDLInputConnection(View targetView, boolean fullEditor) {
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
868 super(targetView, fullEditor);
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
869
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
870 }
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
871
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
872 @Override
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
873 public boolean sendKeyEvent(KeyEvent event) {
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
874
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
875 /*
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
876 * This handles the keycodes from soft keyboard (and IME-translated
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
877 * input from hardkeyboard)
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
878 */
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
879 int keyCode = event.getKeyCode();
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
880 if (event.getAction() == KeyEvent.ACTION_DOWN) {
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
881 if (event.isPrintingKey()) {
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
882 commitText(String.valueOf((char) event.getUnicodeChar()), 1);
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
883 }
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
884 SDLActivity.onNativeKeyDown(keyCode);
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
885 return true;
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
886 } else if (event.getAction() == KeyEvent.ACTION_UP) {
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
887
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
888 SDLActivity.onNativeKeyUp(keyCode);
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
889 return true;
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
890 }
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
891 return super.sendKeyEvent(event);
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
892 }
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
893
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
894 @Override
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
895 public boolean commitText(CharSequence text, int newCursorPosition) {
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
896
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
897 nativeCommitText(text.toString(), newCursorPosition);
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
898
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
899 return super.commitText(text, newCursorPosition);
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
900 }
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
901
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
902 @Override
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
903 public boolean setComposingText(CharSequence text, int newCursorPosition) {
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
904
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
905 nativeSetComposingText(text.toString(), newCursorPosition);
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
906
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
907 return super.setComposingText(text, newCursorPosition);
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
908 }
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
909
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
910 public native void nativeCommitText(String text, int newCursorPosition);
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
911
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
912 public native void nativeSetComposingText(String text, int newCursorPosition);
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
913
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
914 @Override
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
915 public boolean deleteSurroundingText(int beforeLength, int afterLength) {
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
916 // Workaround to capture backspace key. Ref: http://stackoverflow.com/questions/14560344/android-backspace-in-webview-baseinputconnection
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
917 if (beforeLength == 1 && afterLength == 0) {
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
918 // backspace
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
919 return super.sendKeyEvent(new KeyEvent(KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_DEL))
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
920 && super.sendKeyEvent(new KeyEvent(KeyEvent.ACTION_UP, KeyEvent.KEYCODE_DEL));
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
921 }
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
922
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
923 return super.deleteSurroundingText(beforeLength, afterLength);
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
924 }
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
925 }
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
926
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
927 /* A null joystick handler for API level < 12 devices (the accelerometer is handled separately) */
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
928 class SDLJoystickHandler {
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
929
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
930 public boolean handleMotionEvent(MotionEvent event) {
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
931 return false;
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
932 }
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
933
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
934 public void pollInputDevices() {
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
935 }
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
936 }
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
937
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
938 /* Actual joystick functionality available for API >= 12 devices */
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
939 class SDLJoystickHandler_API12 extends SDLJoystickHandler {
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
940
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
941 class SDLJoystick {
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
942 public int device_id;
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
943 public String name;
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
944 public ArrayList<InputDevice.MotionRange> axes;
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
945 public ArrayList<InputDevice.MotionRange> hats;
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
946 }
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
947 class RangeComparator implements Comparator<InputDevice.MotionRange>
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
948 {
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
949 @Override
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
950 public int compare(InputDevice.MotionRange arg0, InputDevice.MotionRange arg1) {
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
951 return arg0.getAxis() - arg1.getAxis();
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
952 }
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
953 }
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
954
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
955 private ArrayList<SDLJoystick> mJoysticks;
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
956
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
957 public SDLJoystickHandler_API12() {
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
958
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
959 mJoysticks = new ArrayList<SDLJoystick>();
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
960 }
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
961
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
962 @Override
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
963 public void pollInputDevices() {
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
964 int[] deviceIds = InputDevice.getDeviceIds();
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
965 // It helps processing the device ids in reverse order
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
966 // For example, in the case of the XBox 360 wireless dongle,
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
967 // so the first controller seen by SDL matches what the receiver
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
968 // considers to be the first controller
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
969
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
970 for(int i=deviceIds.length-1; i>-1; i--) {
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
971 SDLJoystick joystick = getJoystick(deviceIds[i]);
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
972 if (joystick == null) {
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
973 joystick = new SDLJoystick();
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
974 InputDevice joystickDevice = InputDevice.getDevice(deviceIds[i]);
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
975 if( (joystickDevice.getSources() & InputDevice.SOURCE_CLASS_JOYSTICK) != 0) {
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
976 joystick.device_id = deviceIds[i];
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
977 joystick.name = joystickDevice.getName();
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
978 joystick.axes = new ArrayList<InputDevice.MotionRange>();
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
979 joystick.hats = new ArrayList<InputDevice.MotionRange>();
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
980
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
981 List<InputDevice.MotionRange> ranges = joystickDevice.getMotionRanges();
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
982 Collections.sort(ranges, new RangeComparator());
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
983 for (InputDevice.MotionRange range : ranges ) {
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
984 if ((range.getSource() & InputDevice.SOURCE_CLASS_JOYSTICK) != 0 ) {
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
985 if (range.getAxis() == MotionEvent.AXIS_HAT_X ||
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
986 range.getAxis() == MotionEvent.AXIS_HAT_Y) {
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
987 joystick.hats.add(range);
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
988 }
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
989 else {
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
990 joystick.axes.add(range);
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
991 }
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
992 }
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
993 }
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
994
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
995 mJoysticks.add(joystick);
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
996 SDLActivity.nativeAddJoystick(joystick.device_id, joystick.name, 0, -1,
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
997 joystick.axes.size(), joystick.hats.size()/2, 0);
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
998 }
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
999 }
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1000 }
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1001
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1002 /* Check removed devices */
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1003 ArrayList<Integer> removedDevices = new ArrayList<Integer>();
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1004 for(int i=0; i < mJoysticks.size(); i++) {
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1005 int device_id = mJoysticks.get(i).device_id;
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1006 int j;
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1007 for (j=0; j < deviceIds.length; j++) {
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1008 if (device_id == deviceIds[j]) break;
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1009 }
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1010 if (j == deviceIds.length) {
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1011 removedDevices.add(device_id);
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1012 }
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1013 }
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1014
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1015 for(int i=0; i < removedDevices.size(); i++) {
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1016 int device_id = removedDevices.get(i);
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1017 SDLActivity.nativeRemoveJoystick(device_id);
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1018 for (int j=0; j < mJoysticks.size(); j++) {
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1019 if (mJoysticks.get(j).device_id == device_id) {
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1020 mJoysticks.remove(j);
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1021 break;
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1022 }
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1023 }
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1024 }
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1025 }
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1026
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1027 protected SDLJoystick getJoystick(int device_id) {
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1028 for(int i=0; i < mJoysticks.size(); i++) {
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1029 if (mJoysticks.get(i).device_id == device_id) {
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1030 return mJoysticks.get(i);
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1031 }
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1032 }
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1033 return null;
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1034 }
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1035
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1036 @Override
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1037 public boolean handleMotionEvent(MotionEvent event) {
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1038 if ( (event.getSource() & InputDevice.SOURCE_JOYSTICK) != 0) {
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1039 int actionPointerIndex = event.getActionIndex();
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1040 int action = event.getActionMasked();
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1041 switch(action) {
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1042 case MotionEvent.ACTION_MOVE:
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1043 SDLJoystick joystick = getJoystick(event.getDeviceId());
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1044 if ( joystick != null ) {
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1045 for (int i = 0; i < joystick.axes.size(); i++) {
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1046 InputDevice.MotionRange range = joystick.axes.get(i);
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1047 /* Normalize the value to -1...1 */
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1048 float value = ( event.getAxisValue( range.getAxis(), actionPointerIndex) - range.getMin() ) / range.getRange() * 2.0f - 1.0f;
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1049 SDLActivity.onNativeJoy(joystick.device_id, i, value );
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1050 }
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1051 for (int i = 0; i < joystick.hats.size(); i+=2) {
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1052 int hatX = Math.round(event.getAxisValue( joystick.hats.get(i).getAxis(), actionPointerIndex ) );
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1053 int hatY = Math.round(event.getAxisValue( joystick.hats.get(i+1).getAxis(), actionPointerIndex ) );
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1054 SDLActivity.onNativeHat(joystick.device_id, i/2, hatX, hatY );
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1055 }
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1056 }
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1057 break;
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1058 default:
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1059 break;
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1060 }
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1061 }
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1062 return true;
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1063 }
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1064 }
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1065
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1066 class SDLGenericMotionListener_API12 implements View.OnGenericMotionListener {
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1067 // Generic Motion (mouse hover, joystick...) events go here
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1068 // We only have joysticks yet
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1069 @Override
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1070 public boolean onGenericMotion(View v, MotionEvent event) {
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1071 return SDLActivity.handleJoystickMotionEvent(event);
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1072 }
09f5a349e881 Added android project layout
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1073 }