package com.maciekjanusz.compassproject.ui; import android.app.Activity; import android.app.AlertDialog; import android.app.Dialog; import android.content.DialogInterface; import android.content.Intent; import android.content.IntentSender; import android.content.SharedPreferences; import android.content.pm.PackageManager; import android.os.Bundle; import android.preference.PreferenceManager; import android.support.annotation.NonNull; import android.support.design.widget.CoordinatorLayout; import android.support.design.widget.Snackbar; import android.support.v7.app.AppCompatActivity; import android.support.v7.widget.Toolbar; import android.util.Log; import android.view.Menu; import android.view.MenuInflater; import android.view.MenuItem; import android.view.View; import com.google.android.gms.common.ConnectionResult; import com.google.android.gms.common.GoogleApiAvailability; import com.google.android.gms.common.GooglePlayServicesNotAvailableException; import com.google.android.gms.common.GooglePlayServicesRepairableException; import com.google.android.gms.location.places.Place; import com.google.android.gms.location.places.ui.PlacePicker; import com.google.android.gms.maps.model.LatLng; import com.maciekjanusz.compassproject.R; import com.maciekjanusz.compassproject.input.LocationInputDialogFragment; import com.maciekjanusz.compassproject.navigation.NavigationService; import com.maciekjanusz.compassproject.preferences.PreferencesActivity; import butterknife.Bind; import butterknife.ButterKnife; import de.greenrobot.event.EventBus; import static com.maciekjanusz.compassproject.preferences.AppPreferences.SHOW_WIDGET_INFO_PREF; public class CompassActivity extends AppCompatActivity implements LocationInputDialogFragment.Callbacks { private static final int REQUEST_PLACE_PICKER = 999; private static final int REQUEST_RESOLVE_ERROR = 998; private static final String TAG = "CompassActivity"; @Bind(R.id.snackbar_layout) CoordinatorLayout snackbarCoordinator; @Bind(R.id.toolbar) Toolbar toolbar; private boolean resolvingError = false; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_compass); ButterKnife.bind(this); setSupportActionBar(toolbar); // Check for sensors availability PackageManager packageManager = getPackageManager(); boolean sensorsAvailable = (packageManager.hasSystemFeature(PackageManager.FEATURE_SENSOR_COMPASS) && packageManager.hasSystemFeature(PackageManager.FEATURE_SENSOR_ACCELEROMETER)); if(sensorsAvailable) { // if sensors are available, proceed with adding compassFragment if (findViewById(R.id.fragment_container) != null) { if (savedInstanceState != null) { return; } // Create a new Fragment to be placed in the activity layout CompassFragment compassFragment = new CompassFragment(); // Add the fragment to the 'fragment_container' FrameLayout getSupportFragmentManager().beginTransaction() .add(R.id.fragment_container, compassFragment).commit(); } } else { // show dialog with finish() on dismiss AlertDialog.Builder builder = new AlertDialog.Builder(this); builder.setMessage(getString(R.string.sensors_unavailable_error)); builder.setOnCancelListener(new DialogInterface.OnCancelListener() { @Override public void onCancel(DialogInterface dialog) { finish(); } }); builder.show(); } } @Override protected void onPause() { super.onPause(); EventBus.getDefault().unregister(this); } @Override protected void onResume() { super.onResume(); EventBus.getDefault().register(this); } @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { if (requestCode == REQUEST_PLACE_PICKER) { // This result is from the PlacePicker dialog. if (resultCode == Activity.RESULT_OK) { // retrieve latitude and longitude from result data final Place place = PlacePicker.getPlace(data, this); LatLng latLng = place.getLatLng(); Log.i(TAG, "Lat: " + latLng.latitude + " Lon: " + latLng.longitude); onLocationPicked(latLng); } } else if (requestCode == REQUEST_RESOLVE_ERROR) { // This result is from the google play services error resolution intent resolvingError = false; if (resultCode == RESULT_OK) { Snackbar.make(snackbarCoordinator, R.string.resolution_successful, Snackbar.LENGTH_LONG).show(); } } else { super.onActivityResult(requestCode, resultCode, data); } } /** * This event fires when google play services client fails to connect. * * param connectionResult {@link ConnectionResult} from * {@link com.google.android.gms.common.api.GoogleApiClient.OnConnectionFailedListener#onConnectionFailed(ConnectionResult)} */ @SuppressWarnings("unused") public void onEvent(@NonNull ConnectionResult connectionResult) { // stop navigation service stopService(new Intent(this, NavigationService.class)); if(resolvingError) { // if already resolving, return return; } if(connectionResult.hasResolution()) { try { resolvingError = true; connectionResult.startResolutionForResult(this, REQUEST_RESOLVE_ERROR); } catch (IntentSender.SendIntentException e) { Snackbar.make(snackbarCoordinator, R.string.resolution_failed, Snackbar.LENGTH_LONG).show(); } } else { showErrorDialog(connectionResult.getErrorCode()); resolvingError = true; } } @Override public void onLocationPicked(LatLng latLng) { // location has been picked -> start navigation service Intent serviceIntent = new Intent(this, NavigationService.class); serviceIntent.putExtra(NavigationService.EXTRA_DESTINATION, latLng); startService(serviceIntent); } @Override public void onInvalidLocationPicked() { Snackbar.make(snackbarCoordinator, R.string.location_invalid, Snackbar.LENGTH_SHORT).show(); } @Override public void onPlacePickerChosen() { startPlacePicker(); } private void startPlacePicker() { try { Intent intent = new PlacePicker.IntentBuilder().build(this); startActivityForResult(intent, CompassActivity.REQUEST_PLACE_PICKER); // if something goes wrong, proceed with error resolution: } catch (GooglePlayServicesRepairableException e) { showErrorDialog(e.getConnectionStatusCode()); } catch (GooglePlayServicesNotAvailableException e) { showErrorDialog(e.errorCode); } } private void showErrorDialog(int errorCode) { Dialog dialog = GoogleApiAvailability.getInstance() .getErrorDialog(this, errorCode, REQUEST_RESOLVE_ERROR); dialog.setOnDismissListener(new DialogInterface.OnDismissListener() { @Override public void onDismiss(DialogInterface dialog) { resolvingError = false; } }); dialog.show(); } public void showWidgetInfoSnackbar() { final SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(this); boolean showWidgetInfo = sharedPreferences.getBoolean(SHOW_WIDGET_INFO_PREF, true); if(showWidgetInfo) { Snackbar.make(snackbarCoordinator, R.string.widget_info, Snackbar.LENGTH_LONG) .setAction(R.string.do_not_show_again, new View.OnClickListener() { @Override public void onClick(View v) { sharedPreferences .edit() .putBoolean(SHOW_WIDGET_INFO_PREF, false) .apply(); } }).show(); } } @Override public boolean onCreateOptionsMenu(Menu menu) { MenuInflater inflater = getMenuInflater(); inflater.inflate(R.menu.menu_compass_activity, menu); return true; } @Override public boolean onOptionsItemSelected(MenuItem item) { int id = item.getItemId(); switch (id) { case R.id.action_settings: startActivity(new Intent(this, PreferencesActivity.class)); return true; } return super.onOptionsItemSelected(item); } }