1 package osg.AndroidExample;
2 
3 import android.app.Activity;
4 import android.app.AlertDialog;
5 import android.content.Context;
6 import android.content.DialogInterface;
7 import android.content.res.Resources;
8 import android.graphics.Color;
9 import android.graphics.PointF;
10 import android.os.Bundle;
11 import android.util.FloatMath;
12 import android.util.Log;
13 import android.view.KeyEvent;
14 import android.view.LayoutInflater;
15 import android.view.MenuItem;
16 import android.view.MotionEvent;
17 import android.view.View;
18 import android.view.Menu;
19 import android.view.MenuInflater;
20 import android.view.WindowManager;
21 import android.view.View.OnClickListener;
22 import android.view.inputmethod.InputMethodManager;
23 import android.widget.Button;
24 import android.widget.EditText;
25 import android.widget.TextView;
26 import android.widget.Toast;
27 import android.widget.ImageButton;
28 
29 import java.io.File;
30 
31 public class osgViewer extends Activity implements View.OnTouchListener, View.OnKeyListener
32 {
33 	enum moveTypes { NONE , DRAG, MDRAG, ZOOM ,ACTUALIZE}
34 	enum navType { PRINCIPAL , SECONDARY }
35 	enum lightType { ON , OFF }
36 
37 	moveTypes mode=moveTypes.NONE;
38 	navType navMode = navType.PRINCIPAL;
39 	lightType lightMode = lightType.ON;
40 
41 	PointF oneFingerOrigin = new PointF(0,0);
42 	long timeOneFinger=0;
43 	PointF twoFingerOrigin = new PointF(0,0);
44 	long timeTwoFinger=0;
45 	float distanceOrigin;
46 
47 	private static final String TAG = "OSG Activity";
48 	//Ui elements
49     EGLview mView;
50     Button uiCenterViewButton;
51 
52     //Dialogs
53     AlertDialog removeLayerDialog;
54     AlertDialog loadLayerAddress;
55 
56     //Main Android Activity life cycle
onCreate(Bundle icicle)57     @Override protected void onCreate(Bundle icicle)
58     {
59         super.onCreate(icicle);
60         setContentView(R.layout.ui_layout_gles);
61 
62         // get the gl view and attach touch listeners
63 		mView= (EGLview) findViewById(R.id.surfaceGLES);
64 		mView.setOnTouchListener(this);
65 		mView.setOnKeyListener(this);
66 
67 	    uiCenterViewButton = (Button) findViewById(R.id.uiButtonCenter);
68 	    uiCenterViewButton.setOnClickListener(uiListenerCenterView);
69     }
70 
onPause()71     @Override protected void onPause() {
72         super.onPause();
73         mView.onPause();
74     }
onResume()75     @Override protected void onResume() {
76         super.onResume();
77         mView.onResume();
78     }
79 
80     //Main view event processing
81     @Override
onKey(View v, int keyCode, KeyEvent event)82 	public boolean onKey(View v, int keyCode, KeyEvent event) {
83 
84 		return true;
85 	}
86     @Override
onKeyDown(int keyCode, KeyEvent event)87     public boolean onKeyDown(int keyCode, KeyEvent event){
88     	//DO NOTHING this will render useless every menu key except Home
89     	int keyChar= event.getUnicodeChar();
90     	osgNativeLib.keyboardDown(keyChar);
91     	return true;
92     }
93     @Override
onKeyUp(int keyCode, KeyEvent event)94     public boolean onKeyUp(int keyCode, KeyEvent event){
95     	switch (keyCode){
96     	case KeyEvent.KEYCODE_BACK:
97     		super.onDestroy();
98     		this.finish();
99     		break;
100     	case KeyEvent.KEYCODE_SEARCH:
101     		break;
102     	case KeyEvent.KEYCODE_MENU:
103     		this.openOptionsMenu();
104     		break;
105     	default:
106     		int keyChar= event.getUnicodeChar();
107     		osgNativeLib.keyboardUp(keyChar);
108     	}
109 
110     	return true;
111     }
112     @Override
onTouch(View v, MotionEvent event)113     public boolean onTouch(View v, MotionEvent event) {
114 
115     	//dumpEvent(event);
116 
117     	long time_arrival = event.getEventTime();
118     	int n_points = event.getPointerCount();
119     	int action = event.getAction() & MotionEvent.ACTION_MASK;
120 
121     	switch(n_points){
122     	case 1:
123     		switch(action){
124     		case MotionEvent.ACTION_DOWN:
125 	    		mode = moveTypes.DRAG;
126 
127 	    		osgNativeLib.mouseMoveEvent(event.getX(0), event.getY(0));
128 	    		if(navMode==navType.PRINCIPAL)
129 	    			osgNativeLib.mouseButtonPressEvent(event.getX(0), event.getY(0), 2);
130 	    		else
131 	    			osgNativeLib.mouseButtonPressEvent(event.getX(0), event.getY(0), 1);
132 
133 	    		oneFingerOrigin.x=event.getX(0);
134 	    		oneFingerOrigin.y=event.getY(0);
135     			break;
136     		case MotionEvent.ACTION_CANCEL:
137     			switch(mode){
138     			case DRAG:
139     				osgNativeLib.mouseMoveEvent(event.getX(0), event.getY(0));
140     				if(navMode==navType.PRINCIPAL)
141     					osgNativeLib.mouseButtonReleaseEvent(event.getX(0), event.getY(0), 2);
142     				else
143     					osgNativeLib.mouseButtonReleaseEvent(event.getX(0), event.getY(0), 1);
144     				break;
145     			default :
146     				Log.e(TAG,"There has been an anomaly in touch input 1point/action");
147     			}
148     			mode = moveTypes.NONE;
149     			break;
150     		case MotionEvent.ACTION_MOVE:
151 
152     			osgNativeLib.mouseMoveEvent(event.getX(0), event.getY(0));
153 
154     			oneFingerOrigin.x=event.getX(0);
155 	    		oneFingerOrigin.y=event.getY(0);
156 
157     			break;
158     		case MotionEvent.ACTION_UP:
159     			switch(mode){
160     			case DRAG:
161     				if(navMode==navType.PRINCIPAL)
162     					osgNativeLib.mouseButtonReleaseEvent(event.getX(0), event.getY(0), 2);
163     				else
164     					osgNativeLib.mouseButtonReleaseEvent(event.getX(0), event.getY(0), 1);
165     				break;
166     			default :
167     				Log.e(TAG,"There has been an anomaly in touch input 1 point/action");
168     			}
169     			mode = moveTypes.NONE;
170     			break;
171     		default :
172     			Log.e(TAG,"1 point Action not captured");
173     		}
174     		break;
175     	case 2:
176     		switch (action){
177     		case MotionEvent.ACTION_POINTER_DOWN:
178     			//Free previous Action
179     			switch(mode){
180     			case DRAG:
181     				if(navMode==navType.PRINCIPAL)
182     					osgNativeLib.mouseButtonReleaseEvent(event.getX(0), event.getY(0), 2);
183     				else
184     					osgNativeLib.mouseButtonReleaseEvent(event.getX(0), event.getY(0), 1);
185     				break;
186     			}
187     			mode = moveTypes.ZOOM;
188     			distanceOrigin = sqrDistance(event);
189     			twoFingerOrigin.x=event.getX(1);
190     			twoFingerOrigin.y=event.getY(1);
191     			oneFingerOrigin.x=event.getX(0);
192 	    		oneFingerOrigin.y=event.getY(0);
193 
194     			osgNativeLib.mouseMoveEvent(oneFingerOrigin.x,oneFingerOrigin.y);
195     			osgNativeLib.mouseButtonPressEvent(oneFingerOrigin.x,oneFingerOrigin.y, 3);
196     			osgNativeLib.mouseMoveEvent(oneFingerOrigin.x,oneFingerOrigin.y);
197 
198     		case MotionEvent.ACTION_MOVE:
199     			float distance = sqrDistance(event);
200     			float result = distance-distanceOrigin;
201     			distanceOrigin=distance;
202 
203     			if(result>1||result<-1){
204     	    		oneFingerOrigin.y=oneFingerOrigin.y+result;
205     				osgNativeLib.mouseMoveEvent(oneFingerOrigin.x,oneFingerOrigin.y);
206     			}
207 
208     			break;
209     		case MotionEvent.ACTION_POINTER_UP:
210     			mode =moveTypes.NONE;
211     			osgNativeLib.mouseButtonReleaseEvent(oneFingerOrigin.x,oneFingerOrigin.y, 3);
212     			break;
213     		case MotionEvent.ACTION_UP:
214     			mode =moveTypes.NONE;
215     			osgNativeLib.mouseButtonReleaseEvent(oneFingerOrigin.x,oneFingerOrigin.y, 3);
216     			break;
217     		default :
218     			Log.e(TAG,"2 point Action not captured");
219     		}
220     		break;
221     	}
222 
223 		return true;
224 	}
225 
226     //Ui Listeners
227     OnClickListener uiListenerCenterView = new OnClickListener() {
228         public void onClick(View v) {
229         	//Log.d(TAG, "Center View");
230         	osgNativeLib.keyboardDown(32);
231         	osgNativeLib.keyboardUp(32);
232         }
233     };
234 
235     //Menu
236 
237     //Android Life Cycle Menu
238     @Override
onCreateOptionsMenu(Menu menu)239     public boolean onCreateOptionsMenu(Menu menu) {
240         MenuInflater inflater = getMenuInflater();
241         inflater.inflate(R.menu.appmenu, menu);
242         return super.onCreateOptionsMenu(menu);
243     }
244     @Override
onOptionsItemSelected(MenuItem item)245     public boolean onOptionsItemSelected(MenuItem item) {
246         // Handle item selection
247         switch (item.getItemId()) {
248         case R.id.menuShowKeyboard:
249         	Log.d(TAG,"Keyboard");
250         	InputMethodManager mgr= (InputMethodManager)this.getSystemService(Context.INPUT_METHOD_SERVICE);
251     		mgr.toggleSoftInput(InputMethodManager.SHOW_IMPLICIT, 0);
252             return true;
253         default:
254             return super.onOptionsItemSelected(item);
255         }
256     }
257 
258     //Utilities
259     /** Show an event in the LogCat view, for debugging */
dumpEvent(MotionEvent event)260     private void dumpEvent(MotionEvent event) {
261        String names[] = { "DOWN", "UP", "MOVE", "CANCEL", "OUTSIDE",
262              "POINTER_DOWN", "POINTER_UP", "7?", "8?", "9?" };
263        StringBuilder sb = new StringBuilder();
264        int action = event.getAction();
265        int actionCode = action & MotionEvent.ACTION_MASK;
266        sb.append("event ACTION_").append(names[actionCode]);
267        if (actionCode == MotionEvent.ACTION_POINTER_DOWN
268              || actionCode == MotionEvent.ACTION_POINTER_UP) {
269           sb.append("(pid ").append(
270                 action >> MotionEvent.ACTION_POINTER_ID_SHIFT);
271           sb.append(")");
272        }
273        sb.append("[");
274        for (int i = 0; i < event.getPointerCount(); i++) {
275           sb.append("#").append(i);
276           sb.append("(pid ").append(event.getPointerId(i));
277           sb.append(")=").append((int) event.getX(i));
278           sb.append(",").append((int) event.getY(i));
279           if (i + 1 < event.getPointerCount())
280              sb.append(";");
281        }
282        sb.append("]");
283        //Log.d(TAG, sb.toString());
284     }
sqrDistance(MotionEvent event)285     private float sqrDistance(MotionEvent event) {
286         float x = event.getX(0) - event.getX(1);
287         float y = event.getY(0) - event.getY(1);
288         return (float)(Math.sqrt(x * x + y * y));
289      }
290 
291 }