@Override protected void onDestroy() { if (communicator != null) { communicator.sendMessage(new ExitMessage()); communicator.stop(); remoteViewCommunicator.stop(); } velocityTracker.recycle(); super.onDestroy(); }
@Override public boolean onTouchEvent(MotionEvent event) { if (controlling) { velocityTracker.addMovement(event); velocityTracker.computeCurrentVelocity(1); boolean down = event.getActionMasked() == MotionEvent.ACTION_DOWN || event.getActionMasked() == MotionEvent.ACTION_POINTER_DOWN; boolean up = event.getActionMasked() == MotionEvent.ACTION_UP || event.getActionMasked() == MotionEvent.ACTION_POINTER_UP; Finger[] fingers = new Finger[event.getPointerCount()]; for (int i = 0; i < event.getPointerCount(); i++) { fingers[i] = new Finger( event.getPointerId(i), event.getX(i), event.getY(i), velocityTracker.getXVelocity(i), velocityTracker.getYVelocity(i), !(event.getActionIndex() == i && up)); } FingerMessage<?> message = up ? new UpMessage(fingers) : down ? new DownMessage(fingers) : new MoveMessage(fingers); communicator.sendMessage(message); } return super.onTouchEvent(event); }
@Override public void onActivityResult(int requestCode, int resultCode, Intent data) { switch (requestCode) { case REQUEST_DEVICES: // When DeviceListActivity returns with a device to connect devicesShowing = false; if (resultCode == Activity.RESULT_OK) { // Get the device MAC address String address = data.getExtras().getString(Devices.EXTRA_DEVICE_ADDRESS); // Get the BLuetoothDevice object BluetoothDevice device = bluetoothAdapter.getRemoteDevice(address); // Attempt to connect to the device communicator.connect(device); } break; case REQUEST_ENABLE_BT: // When the request to enable Bluetooth returns if (resultCode == Activity.RESULT_OK) { // Bluetooth is now enabled } else { // User did not enable Bluetooth or an error occured Toast.makeText(this, R.string.bluetooth_disabled, Toast.LENGTH_LONG).show(); finish(); } } }
@Override protected void onResume() { super.onResume(); // Performing this check in onResume() covers the case in which BT was // not enabled during onStart(), so we were paused to enable it... // onResume() will be called when ACTION_REQUEST_ENABLE activity returns. if (communicator != null && communicator.getState() == AndroidCommunicator.State.NONE) { communicator.start(); remoteViewCommunicator.start(); } updateActionBarIcon(communicator.getState()); sensorManager.registerListener( sensorListener, sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER), SensorManager.SENSOR_DELAY_FASTEST); }
protected void connect() { Set<BluetoothDevice> pairedDevices = bluetoothAdapter.getBondedDevices(); if (pairedDevices.size() == 1) { communicator.connect(pairedDevices.iterator().next()); } else { Intent serverIntent = new Intent(this, Devices.class); startActivityForResult(serverIntent, REQUEST_DEVICES); devicesShowing = true; } }
@Override protected void onStart() { super.onStart(); if (!bluetoothAdapter.isEnabled()) { Intent enableIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE); startActivityForResult(enableIntent, REQUEST_ENABLE_BT); } else if (communicator.getState() != State.CONNECTED && !devicesShowing) { connect(); } }
@Override public boolean onOptionsItemSelected(MenuItem item) { boolean connect = false; switch (item.getItemId()) { case OPTION_CONNECT: connect = true; break; case OPTION_LOCK_LANDSCAPE: setLockLandscape(!item.isChecked()); item.setChecked(isLockLandscape()); break; case OPTION_ENABLE_REMOTE_VIEW: controlFragment.setRemoteEnabled(!item.isChecked()); item.setChecked(controlFragment.isRemoteEnabled()); break; case OPTION_EXIT: finish(); break; case OPTION_HELP: showHelp(); break; case OPTION_EXAGGERATION: showVerticalExaggerationDialog(); break; case OPTION_FLY_HOME: communicator.sendMessage(new FlyHomeMessage()); break; case OPTION_SEND_LOCATION: setSendLocation(!item.isChecked()); item.setChecked(isSendLocation()); break; case android.R.id.home: getSupportActionBar().selectTab(getSupportActionBar().getTabAt(0)); connect = communicator.getState() != State.CONNECTED; break; } if (connect) { connect(); } return super.onOptionsItemSelected(item); }
@Override public void stateChanged(final State newState) { String toast = null; switch (newState) { case CONNECTED: toast = getString(R.string.title_connected_to) + communicator.getDevice().getName(); // toast = getString(R.string.title_connected_to) + communicator.getHostname(); break; case CONNECTING: toast = getString(R.string.title_connecting); break; case LISTEN: case NONE: toast = getString(R.string.title_not_connected); break; } // state changing can occur on non-ui thread, so ensure toast is run on ui thread final String toastf = toast; runOnUiThread( new Runnable() { @Override public void run() { if (toastf != null) { communicator.toast(toastf); } updateActionBarIcon(newState); if (newState != State.CONNECTED) { for (int i = 0; i < itemModelStates.size(); i++) { itemModelStates.valueAt(i).clear(); } } } }); }
@Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // Normally one shouldn't instantiate all these objects in the onCreate method, // as onCreate is called every time a configuration change occurs (orientation, // keyboard hidden, screen size, etc). But we are handling configuration changes // ourselves. // hide the status bar this.getWindow() .setFlags( WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN); // get local Bluetooth adapter bluetoothAdapter = BluetoothAdapter.getDefaultAdapter(); if (bluetoothAdapter == null) { Toast.makeText(this, R.string.bluetooth_unavailable, Toast.LENGTH_LONG).show(); finish(); return; } communicator = new AndroidCommunicator(this, bluetoothAdapter); communicator.addListener(this); remoteViewCommunicator = new SocketAndroidCommunicator(this); DatasetModelState datasetsState = new DatasetModelState(communicator, this); LayerModelState layersState = new LayerModelState(communicator, this); PlaceModelState placesState = new PlaceModelState(communicator, this); ItemModelState[] states = new ItemModelState[] {datasetsState, layersState, placesState}; for (ItemModelState state : states) { itemModelStates.put(state.getModel().getId(), state); ItemModelFragmentMenuProvider menuProvider = new EmptyMenuProvider(); if (state == placesState) { menuProvider = new PlacesMenuProvider(communicator); } menuProviders.put(state.getModel().getId(), menuProvider); } controlFragment = ControlFragment.newInstance(remoteViewCommunicator); datasetsFragment = ItemModelFragment.newInstance(datasetsState.getModel().getId(), false); layersFragment = ItemModelFragment.newInstance(layersState.getModel().getId(), false); flatLayersFragment = ItemModelFragment.newInstance(layersState.getModel().getId(), true); placesFragment = ItemModelFragment.newInstance(placesState.getModel().getId(), false); tabFragments = new Fragment[] { controlFragment, datasetsFragment, layersFragment, flatLayersFragment, placesFragment }; // create the tabs getSupportActionBar().setNavigationMode(ActionBar.NAVIGATION_MODE_TABS); int[] tabIds = new int[] { R.string.controls_tab, R.string.datasets_tab, R.string.layers_tab, R.string.flat_layers_tab, R.string.places_tab }; for (int i = 0; i < tabIds.length; i++) { ActionBar.Tab tab = getSupportActionBar().newTab(); tab.setTag(tabIds[i]); tab.setText(tabIds[i]); tab.setTabListener(this); getSupportActionBar().addTab(tab); } getSupportActionBar().setDisplayShowTitleEnabled(false); getSupportActionBar().setHomeButtonEnabled(true); // setup the shake sensor sensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE); sensorListener.setOnShakeListener( new ShakeEventListener.OnShakeListener() { @Override public void onShake() { communicator.sendMessage(new ShakeMessage()); } }); // Acquire a reference to the system Location Manager LocationManager locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE); // Define a listener that responds to location updates LocationListener locationListener = new LocationListener() { public void onLocationChanged(Location location) { if (isSendLocation()) { communicator.sendMessage( new LocationMessage( location.getLatitude(), location.getLongitude(), location.getAltitude(), location.getAccuracy(), location.getBearing())); } } public void onStatusChanged(String provider, int status, Bundle extras) {} public void onProviderEnabled(String provider) {} public void onProviderDisabled(String provider) {} }; locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, locationListener); // locationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 0, 0, // locationListener); }