annotate android/src/org/libsdl/app/SDLActivity.java @ 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
author Michael Pavone <pavone@retrodev.com>
date Sat, 28 Nov 2015 14:30:30 -0800
parents 09f5a349e881
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 }