/* Copyright (C) 2013 Patrik Wållgren, Victor Olausson, This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see <http://www.gnu.org/licenses/ */ package bgsep.virtualgamepad; import java.util.ArrayList; import java.util.Observable; import java.util.Observer; import android.app.Activity; import android.content.Context; import android.content.Intent; import android.hardware.SensorManager; import android.os.Bundle; import android.os.Vibrator; import android.view.Menu; import android.view.MenuItem; import android.view.View; import android.view.ViewConfiguration; import android.view.WindowManager.LayoutParams; import android.widget.ImageView; import bgsep.communication.Communication; import bgsep.model.Button; import bgsep.model.Gyro; /** * The activity for the NES controller * @author Victor Olausson * @author Patrik Wållgren * */ public class NesActivity extends Activity implements Observer { private ImageView imageAbutton, imageBbutton, imageLeftArrow, imageRightArrow, imageUpArrow, imageDownArrow, imageSelect, imageStart; private Button aButton, bButton, leftArrowButton, rightArrowButton, upArrowButton, downArrowButton, selectButton, startButton; private ArrayList<Button> buttons; private Communication comm; private boolean hapticFeedback; private boolean useAccelerometer; private Gyro gyro; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_nes); // Keep screen on getWindow().addFlags(LayoutParams.FLAG_KEEP_SCREEN_ON); //Dim soft menu keys if present if (!ViewConfiguration.get(this).hasPermanentMenuKey()) getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LOW_PROFILE); Intent i = getIntent(); hapticFeedback = i.getBooleanExtra("hapticFeedback", false); useAccelerometer = i.getBooleanExtra("useAccelerometer", false); comm = Communication.getInstance(); initImages(); initButtons(); if(useAccelerometer) initGyro(); } @Override public void update(Observable o, Object obj) { if(o instanceof Button) { Button button = (Button)o; if(button.isPressed()) button.getButtonView().setImageResource(button.getPressedDrawableID()); else button.getButtonView().setImageResource(button.getUnPressedDrawableID()); } } @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.nes, menu); return true; } @Override public boolean onOptionsItemSelected(MenuItem item) { // Handle item selection Intent i; switch (item.getItemId()) { case R.id.action_gc: i = new Intent(this, GcActivity.class); i.putExtra("hapticFeedback", hapticFeedback); i.putExtra("useAccelerometer", useAccelerometer); startActivity(i); finish(); return true; case R.id.action_ps: i = new Intent(this, PsActivity.class); i.putExtra("hapticFeedback", hapticFeedback); i.putExtra("useAccelerometer", useAccelerometer); startActivity(i); finish(); return true; default: return super.onOptionsItemSelected(item); } } private void initImages() { imageAbutton = (ImageView) findViewById(R.id.nes_a_button); imageBbutton = (ImageView) findViewById(R.id.nes_b_button); imageLeftArrow = (ImageView) findViewById(R.id.nes_left_arrow); imageRightArrow = (ImageView) findViewById(R.id.nes_right_arrow); imageUpArrow = (ImageView) findViewById(R.id.nes_up_arrow); imageDownArrow = (ImageView) findViewById(R.id.nes_down_arrow); imageSelect = (ImageView) findViewById(R.id.nes_select_button); imageStart = (ImageView) findViewById(R.id.nes_start_button); } private void initButtons() { Vibrator vibrator = (Vibrator)getSystemService(Context.VIBRATOR_SERVICE); leftArrowButton = new Button(imageLeftArrow, R.drawable.nes_left_arrow, R.drawable.nes_left_arrow_pressed, 0, this, vibrator, hapticFeedback); rightArrowButton = new Button(imageRightArrow, R.drawable.nes_right_arrow, R.drawable.nes_right_arrow_pressed, 1, this, vibrator, hapticFeedback); upArrowButton = new Button(imageUpArrow, R.drawable.nes_up_arrow, R.drawable.nes_up_arrow_pressed, 2, this, vibrator, hapticFeedback); downArrowButton = new Button(imageDownArrow, R.drawable.nes_down_arrow, R.drawable.nes_down_arrow_pressed, 3, this, vibrator, hapticFeedback); aButton = new Button(imageAbutton, R.drawable.nes_a_button, R.drawable.nes_a_button_pressed, 4, this, vibrator, hapticFeedback); bButton = new Button(imageBbutton, R.drawable.nes_b_button, R.drawable.nes_b_button_pressed, 5, this, vibrator, hapticFeedback); selectButton = new Button(imageSelect, R.drawable.nes_select_button, R.drawable.nes_select_button_pressed, 6, this, vibrator, hapticFeedback); startButton = new Button(imageStart, R.drawable.nes_start_button, R.drawable.nes_start_button_pressed, 7, this, vibrator, hapticFeedback); buttons = new ArrayList<Button>(); buttons.add(aButton); buttons.add(bButton); buttons.add(leftArrowButton); buttons.add(rightArrowButton); buttons.add(upArrowButton); buttons.add(downArrowButton); buttons.add(selectButton); buttons.add(startButton); for(Button b : buttons) b.addObserver(comm); } private void initGyro() { SensorManager sensorManager = (SensorManager)getSystemService(Context.SENSOR_SERVICE); gyro = new Gyro(sensorManager); gyro.setLeftRightGyroID(8, 9); gyro.setEnabled(useAccelerometer); gyro.registerListener(); gyro.addObserver(comm); } @Override public void onDestroy() { super.onDestroy(); releaseAliciaKeys(); } @Override public void onPause() { super.onPause(); releaseAliciaKeys(); } @Override public void onResume() { super.onResume(); if(useAccelerometer) gyro.registerListener(); } private void releaseAliciaKeys() { if(useAccelerometer) gyro.unregisterListener(); unPressAllButtons(); } private void unPressAllButtons() { for(Button b : buttons) b.setPressed(false); } }