Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- import android.Manifest;
- import android.content.pm.PackageManager;
- import android.location.Location;
- import android.os.Build;
- import android.os.Bundle;
- import android.support.annotation.NonNull;
- import android.support.v4.app.ActivityCompat;
- import android.support.v4.content.ContextCompat;
- import android.util.Log;
- import android.widget.Toast;
- import com.arellomobile.mvp.presenter.InjectPresenter;
- import com.arellomobile.mvp.presenter.PresenterType;
- import com.google.android.gms.common.ConnectionResult;
- import com.google.android.gms.common.api.GoogleApiClient;
- import com.google.android.gms.location.LocationListener;
- import com.google.android.gms.location.LocationRequest;
- import com.google.android.gms.location.LocationServices;
- import com.google.android.gms.maps.CameraUpdate;
- import com.google.android.gms.maps.CameraUpdateFactory;
- import com.google.android.gms.maps.GoogleMap;
- import com.google.android.gms.maps.OnMapReadyCallback;
- import com.google.android.gms.maps.SupportMapFragment;
- import com.google.android.gms.maps.model.CameraPosition;
- import com.google.android.gms.maps.model.LatLng;
- import com.google.android.gms.maps.model.LatLngBounds;
- import com.google.android.gms.maps.model.Marker;
- import com.google.android.gms.maps.model.MarkerOptions;
- import com.google.android.gms.maps.model.PolylineOptions;
- import com.google.maps.android.PolyUtil;
- import java.util.ArrayList;
- import java.util.List;
- import butterknife.ButterKnife;
- import butterknife.OnClick;
- import ua.maxproject.esculap.R;
- import ua.maxproject.esculap.logic.CoordinatesParser;
- import ua.maxproject.esculap.logic.father.App;
- import ua.maxproject.esculap.model.content.RouteResponse;
- import ua.maxproject.esculap.presenters.MapsPresenter;
- import ua.maxproject.esculap.server_сommunication.api.MapsCommun;
- import ua.maxproject.esculap.server_сommunication.listeners.OnLoadedMedInstListListener;
- import ua.maxproject.esculap.server_сommunication.listeners.OnRouteListener;
- import ua.maxproject.esculap.ui.activities.parents.BaseActivity;
- import ua.maxproject.esculap.ui.view.MapsView;
- public class MapsActivity extends BaseActivity implements OnMapReadyCallback, GoogleApiClient.ConnectionCallbacks,
- GoogleApiClient.OnConnectionFailedListener, LocationListener, MapsView {
- private static final double NIZHYN_LATITUBE = 51.0480100;
- private static final double NIZHYN_LONGITUBE = 31.8868800;
- @InjectPresenter(type = PresenterType.GLOBAL, tag = "mapPresenter")
- MapsPresenter mPresenter;
- private GoogleMap mMap;
- private GoogleApiClient mGoogleApiClient;
- private LatLng mLastLocation;
- private LatLng mSelectedPoint;
- public static final int MY_PERMISSIONS_REQUEST_LOCATION = 99;
- // Нужен для того, что бы сохранить координаты точки, переданной до того, как карта стала готовой
- private ArrayList<MarkerOptions> mSavedMarkers;
- private boolean mMapIsReady = false;
- @OnClick(R.id.element_back_button)
- public void onBackClick(){
- super.onBackPressed();
- }
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.activity_maps);
- ButterKnife.bind(this);
- if (isMarshmallowAndMore()) {
- checkLocationPermission();
- }
- SupportMapFragment mapFragment = (SupportMapFragment) getSupportFragmentManager()
- .findFragmentById(R.id.map);
- mapFragment.getMapAsync(this);
- }
- @Override
- public void onMapReady(GoogleMap googleMap) {
- mMap = googleMap;
- mMap.animateCamera(CameraUpdateFactory.zoomTo(25));
- mMap.setOnMarkerClickListener(new GoogleMap.OnMarkerClickListener() {
- @Override
- public boolean onMarkerClick(Marker marker) {
- try{
- mSelectedPoint = marker.getPosition();
- getRoute(mSelectedPoint);
- return false;
- }catch (Exception c){
- c.printStackTrace();
- Toast.makeText(MapsActivity.this, getString(R.string.to_build_a_route_requires_GPS_enabled), Toast.LENGTH_SHORT).show();
- return false;
- }
- }
- });
- CameraPosition cameraPosition = new CameraPosition.Builder()
- .target(new LatLng(NIZHYN_LATITUBE, NIZHYN_LONGITUBE))
- .zoom(18)
- .build();
- CameraUpdate cameraUpdate = CameraUpdateFactory.newCameraPosition(cameraPosition);
- mMap.animateCamera(cameraUpdate);
- mMapIsReady = true;
- if(mSavedMarkers != null)
- showMarkers();
- if (!isMarshmallowAndMore()) {
- buildGoogleApiClient();
- mMap.setMyLocationEnabled(true);
- mPresenter.mapReady();
- return;
- }
- if (ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION)
- == PackageManager.PERMISSION_GRANTED) {
- buildGoogleApiClient();
- mPresenter.mapReady();
- mMap.setMyLocationEnabled(true);
- }
- }
- @Override
- public void onConnected(Bundle bundle) {
- LocationRequest mLocationRequest = new LocationRequest();
- mLocationRequest.setInterval(10000);
- mLocationRequest.setFastestInterval(10000);
- mLocationRequest.setPriority(LocationRequest.PRIORITY_BALANCED_POWER_ACCURACY);
- if (ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED)
- return;
- LocationServices.FusedLocationApi.requestLocationUpdates(mGoogleApiClient, mLocationRequest, this);
- }
- @Override
- public void onConnectionSuspended(int i) {
- }
- @Override
- public void onLocationChanged(Location location) {
- mLastLocation = new LatLng(location.getLatitude(), location.getLongitude()) ;
- if (mGoogleApiClient != null) {
- LocationServices.FusedLocationApi.removeLocationUpdates(mGoogleApiClient, this);
- }
- }
- @Override
- public void onConnectionFailed(@NonNull ConnectionResult connectionResult) {
- Toast.makeText(this, R.string.no_internet_connection, Toast.LENGTH_SHORT).show();
- }
- @Override
- public void onRequestPermissionsResult(int requestCode, @NonNull String permissions[], @NonNull int[] grantResults) {
- if (requestCode == MY_PERMISSIONS_REQUEST_LOCATION) {
- if (grantResults.length == 0)
- return;
- if (grantResults[0] != PackageManager.PERMISSION_GRANTED) {
- return;
- }
- if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED ) {
- return;
- }
- if (mGoogleApiClient == null)
- buildGoogleApiClient();
- mMap.setMyLocationEnabled(true);
- }
- }
- protected synchronized void buildGoogleApiClient() {
- mGoogleApiClient = new GoogleApiClient.Builder(this)
- .addConnectionCallbacks(this)
- .addOnConnectionFailedListener(this)
- .addApi(LocationServices.API)
- .build();
- mGoogleApiClient.connect();
- }
- @org.jetbrains.annotations.Contract(pure = true)
- private boolean isMarshmallowAndMore(){
- return android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.M;
- }
- /**
- * Получено ли разрешение
- */
- private boolean isGrantedPermission(){
- return ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION)
- == PackageManager.PERMISSION_GRANTED;
- }
- private boolean checkLocationPermission(){
- if (isGrantedPermission())
- return true;
- ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.ACCESS_FINE_LOCATION}, MY_PERMISSIONS_REQUEST_LOCATION);
- return false;
- }
- private void showMarkers() {
- for(int i = 0; i < mSavedMarkers.size(); i ++){
- showMarker(mSavedMarkers.get(i));
- }
- mSavedMarkers = null;
- }
- private void showMarker(MarkerOptions markerOptions) {
- mMap.addMarker(markerOptions);
- CameraPosition cameraPosition = new CameraPosition.Builder()
- .target(markerOptions.getPosition())
- .zoom(12)
- .build();
- CameraUpdate cameraUpdate = CameraUpdateFactory.newCameraPosition(cameraPosition);
- mMap.animateCamera(cameraUpdate);
- }
- @Override
- public void showMarkers(ArrayList<LatLng> latLngs, ArrayList<String> medInstNames) {
- if(!mMapIsReady){
- mSavedMarkers = new ArrayList<>();
- for(int i = 0; i < latLngs.size() && i < medInstNames.size(); i ++) {
- MarkerOptions markerOptions = new MarkerOptions();
- markerOptions.position(latLngs.get(i));
- markerOptions.title(medInstNames.get(i));
- mSavedMarkers.add(markerOptions);
- }
- return;
- }
- for(int i = 0; i < latLngs.size() && i < medInstNames.size(); i ++){
- showMarker(latLngs.get(i), medInstNames.get(i));
- }
- }
- @Override
- public void showMarker(LatLng latLng, String medInstName) {
- MarkerOptions markerOptions = new MarkerOptions();
- markerOptions.position(latLng);
- markerOptions.title(medInstName);
- if(mMap == null){
- mSavedMarkers = new ArrayList<>(1);
- mSavedMarkers.add(markerOptions);
- return;
- }
- showMarker(markerOptions);
- Log.d("1", "completed");
- }
- private void getRoute(LatLng location){
- //TODO перенести в resenter
- String from = CoordinatesParser.getString(mLastLocation);
- String to = CoordinatesParser.getString(location);
- MapsCommun commun = new MapsCommun();
- commun.query(from, to, new OnRouteListener() {
- @Override
- public void onSuccess(RouteResponse response) {
- showRoute(response);
- }
- @Override
- public void onError(int error) {
- }
- });
- }
- public void showRoute(RouteResponse response){
- List<LatLng> mPoints = PolyUtil.decode(response.getPoints());
- PolylineOptions line = new PolylineOptions();
- line.width(4f).color(getResources().getColor(R.color.blue_500));
- LatLngBounds.Builder latLngBuilder = new LatLngBounds.Builder();
- for (int i = 0; i < mPoints.size(); i++) {
- line.add(mPoints.get(i));
- latLngBuilder.include(mPoints.get(i));
- }
- mMap.addPolyline(line);
- int size = getResources().getDisplayMetrics().widthPixels;
- LatLngBounds latLngBounds = latLngBuilder.build();
- CameraUpdate track = CameraUpdateFactory.newLatLngBounds(latLngBounds, size, size, 25);
- mMap.moveCamera(track);
- }
- @Override
- public void sayAppGiveMedInsts(OnLoadedMedInstListListener listener) {
- ((App) getApplication()).getMedInstitutions(listener);
- }
- @Override
- protected void onStop() {
- super.onStop();
- mPresenter.activityIsStopped();
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement