Advertisement
Guest User

карта

a guest
Oct 21st, 2017
146
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 11.46 KB | None | 0 0
  1.  
  2. import android.Manifest;
  3. import android.content.pm.PackageManager;
  4. import android.location.Location;
  5. import android.os.Build;
  6. import android.os.Bundle;
  7. import android.support.annotation.NonNull;
  8. import android.support.v4.app.ActivityCompat;
  9. import android.support.v4.content.ContextCompat;
  10. import android.util.Log;
  11. import android.widget.Toast;
  12.  
  13. import com.arellomobile.mvp.presenter.InjectPresenter;
  14. import com.arellomobile.mvp.presenter.PresenterType;
  15. import com.google.android.gms.common.ConnectionResult;
  16. import com.google.android.gms.common.api.GoogleApiClient;
  17. import com.google.android.gms.location.LocationListener;
  18. import com.google.android.gms.location.LocationRequest;
  19. import com.google.android.gms.location.LocationServices;
  20. import com.google.android.gms.maps.CameraUpdate;
  21. import com.google.android.gms.maps.CameraUpdateFactory;
  22. import com.google.android.gms.maps.GoogleMap;
  23. import com.google.android.gms.maps.OnMapReadyCallback;
  24. import com.google.android.gms.maps.SupportMapFragment;
  25. import com.google.android.gms.maps.model.CameraPosition;
  26. import com.google.android.gms.maps.model.LatLng;
  27. import com.google.android.gms.maps.model.LatLngBounds;
  28. import com.google.android.gms.maps.model.Marker;
  29. import com.google.android.gms.maps.model.MarkerOptions;
  30. import com.google.android.gms.maps.model.PolylineOptions;
  31. import com.google.maps.android.PolyUtil;
  32.  
  33. import java.util.ArrayList;
  34. import java.util.List;
  35.  
  36. import butterknife.ButterKnife;
  37. import butterknife.OnClick;
  38. import ua.maxproject.esculap.R;
  39. import ua.maxproject.esculap.logic.CoordinatesParser;
  40. import ua.maxproject.esculap.logic.father.App;
  41. import ua.maxproject.esculap.model.content.RouteResponse;
  42. import ua.maxproject.esculap.presenters.MapsPresenter;
  43. import ua.maxproject.esculap.server_сommunication.api.MapsCommun;
  44. import ua.maxproject.esculap.server_сommunication.listeners.OnLoadedMedInstListListener;
  45. import ua.maxproject.esculap.server_сommunication.listeners.OnRouteListener;
  46. import ua.maxproject.esculap.ui.activities.parents.BaseActivity;
  47. import ua.maxproject.esculap.ui.view.MapsView;
  48.  
  49. public class MapsActivity extends BaseActivity implements OnMapReadyCallback, GoogleApiClient.ConnectionCallbacks,
  50. GoogleApiClient.OnConnectionFailedListener, LocationListener, MapsView {
  51.  
  52. private static final double NIZHYN_LATITUBE = 51.0480100;
  53. private static final double NIZHYN_LONGITUBE = 31.8868800;
  54.  
  55. @InjectPresenter(type = PresenterType.GLOBAL, tag = "mapPresenter")
  56. MapsPresenter mPresenter;
  57.  
  58. private GoogleMap mMap;
  59. private GoogleApiClient mGoogleApiClient;
  60. private LatLng mLastLocation;
  61. private LatLng mSelectedPoint;
  62. public static final int MY_PERMISSIONS_REQUEST_LOCATION = 99;
  63.  
  64. // Нужен для того, что бы сохранить координаты точки, переданной до того, как карта стала готовой
  65. private ArrayList<MarkerOptions> mSavedMarkers;
  66. private boolean mMapIsReady = false;
  67.  
  68.  
  69. @OnClick(R.id.element_back_button)
  70. public void onBackClick(){
  71. super.onBackPressed();
  72. }
  73.  
  74. @Override
  75. protected void onCreate(Bundle savedInstanceState) {
  76. super.onCreate(savedInstanceState);
  77. setContentView(R.layout.activity_maps);
  78.  
  79. ButterKnife.bind(this);
  80.  
  81. if (isMarshmallowAndMore()) {
  82. checkLocationPermission();
  83. }
  84. SupportMapFragment mapFragment = (SupportMapFragment) getSupportFragmentManager()
  85. .findFragmentById(R.id.map);
  86. mapFragment.getMapAsync(this);
  87. }
  88.  
  89. @Override
  90. public void onMapReady(GoogleMap googleMap) {
  91.  
  92. mMap = googleMap;
  93. mMap.animateCamera(CameraUpdateFactory.zoomTo(25));
  94. mMap.setOnMarkerClickListener(new GoogleMap.OnMarkerClickListener() {
  95. @Override
  96. public boolean onMarkerClick(Marker marker) {
  97. try{
  98. mSelectedPoint = marker.getPosition();
  99. getRoute(mSelectedPoint);
  100. return false;
  101. }catch (Exception c){
  102. c.printStackTrace();
  103. Toast.makeText(MapsActivity.this, getString(R.string.to_build_a_route_requires_GPS_enabled), Toast.LENGTH_SHORT).show();
  104. return false;
  105. }
  106. }
  107. });
  108. CameraPosition cameraPosition = new CameraPosition.Builder()
  109. .target(new LatLng(NIZHYN_LATITUBE, NIZHYN_LONGITUBE))
  110. .zoom(18)
  111. .build();
  112. CameraUpdate cameraUpdate = CameraUpdateFactory.newCameraPosition(cameraPosition);
  113. mMap.animateCamera(cameraUpdate);
  114. mMapIsReady = true;
  115. if(mSavedMarkers != null)
  116. showMarkers();
  117.  
  118. if (!isMarshmallowAndMore()) {
  119. buildGoogleApiClient();
  120. mMap.setMyLocationEnabled(true);
  121. mPresenter.mapReady();
  122.  
  123. return;
  124. }
  125. if (ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION)
  126. == PackageManager.PERMISSION_GRANTED) {
  127. buildGoogleApiClient();
  128. mPresenter.mapReady();
  129. mMap.setMyLocationEnabled(true);
  130. }
  131.  
  132.  
  133. }
  134.  
  135. @Override
  136. public void onConnected(Bundle bundle) {
  137.  
  138. LocationRequest mLocationRequest = new LocationRequest();
  139. mLocationRequest.setInterval(10000);
  140. mLocationRequest.setFastestInterval(10000);
  141. mLocationRequest.setPriority(LocationRequest.PRIORITY_BALANCED_POWER_ACCURACY);
  142. if (ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED)
  143. return;
  144. LocationServices.FusedLocationApi.requestLocationUpdates(mGoogleApiClient, mLocationRequest, this);
  145. }
  146.  
  147. @Override
  148. public void onConnectionSuspended(int i) {
  149.  
  150.  
  151. }
  152.  
  153. @Override
  154. public void onLocationChanged(Location location) {
  155. mLastLocation = new LatLng(location.getLatitude(), location.getLongitude()) ;
  156. if (mGoogleApiClient != null) {
  157. LocationServices.FusedLocationApi.removeLocationUpdates(mGoogleApiClient, this);
  158. }
  159.  
  160.  
  161. }
  162.  
  163. @Override
  164. public void onConnectionFailed(@NonNull ConnectionResult connectionResult) {
  165. Toast.makeText(this, R.string.no_internet_connection, Toast.LENGTH_SHORT).show();
  166. }
  167.  
  168.  
  169. @Override
  170. public void onRequestPermissionsResult(int requestCode, @NonNull String permissions[], @NonNull int[] grantResults) {
  171. if (requestCode == MY_PERMISSIONS_REQUEST_LOCATION) {
  172. if (grantResults.length == 0)
  173. return;
  174. if (grantResults[0] != PackageManager.PERMISSION_GRANTED) {
  175. return;
  176. }
  177. if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED ) {
  178. return;
  179. }
  180. if (mGoogleApiClient == null)
  181. buildGoogleApiClient();
  182. mMap.setMyLocationEnabled(true);
  183. }
  184. }
  185. protected synchronized void buildGoogleApiClient() {
  186. mGoogleApiClient = new GoogleApiClient.Builder(this)
  187. .addConnectionCallbacks(this)
  188. .addOnConnectionFailedListener(this)
  189. .addApi(LocationServices.API)
  190. .build();
  191. mGoogleApiClient.connect();
  192. }
  193. @org.jetbrains.annotations.Contract(pure = true)
  194. private boolean isMarshmallowAndMore(){
  195. return android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.M;
  196. }
  197.  
  198. /**
  199. * Получено ли разрешение
  200. */
  201. private boolean isGrantedPermission(){
  202. return ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION)
  203. == PackageManager.PERMISSION_GRANTED;
  204. }
  205. private boolean checkLocationPermission(){
  206. if (isGrantedPermission())
  207. return true;
  208. ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.ACCESS_FINE_LOCATION}, MY_PERMISSIONS_REQUEST_LOCATION);
  209. return false;
  210. }
  211.  
  212. private void showMarkers() {
  213. for(int i = 0; i < mSavedMarkers.size(); i ++){
  214. showMarker(mSavedMarkers.get(i));
  215. }
  216. mSavedMarkers = null;
  217.  
  218. }
  219. private void showMarker(MarkerOptions markerOptions) {
  220. mMap.addMarker(markerOptions);
  221. CameraPosition cameraPosition = new CameraPosition.Builder()
  222. .target(markerOptions.getPosition())
  223. .zoom(12)
  224. .build();
  225. CameraUpdate cameraUpdate = CameraUpdateFactory.newCameraPosition(cameraPosition);
  226. mMap.animateCamera(cameraUpdate);
  227.  
  228. }
  229. @Override
  230. public void showMarkers(ArrayList<LatLng> latLngs, ArrayList<String> medInstNames) {
  231. if(!mMapIsReady){
  232. mSavedMarkers = new ArrayList<>();
  233.  
  234. for(int i = 0; i < latLngs.size() && i < medInstNames.size(); i ++) {
  235. MarkerOptions markerOptions = new MarkerOptions();
  236. markerOptions.position(latLngs.get(i));
  237. markerOptions.title(medInstNames.get(i));
  238. mSavedMarkers.add(markerOptions);
  239. }
  240. return;
  241. }
  242. for(int i = 0; i < latLngs.size() && i < medInstNames.size(); i ++){
  243. showMarker(latLngs.get(i), medInstNames.get(i));
  244. }
  245. }
  246.  
  247. @Override
  248. public void showMarker(LatLng latLng, String medInstName) {
  249. MarkerOptions markerOptions = new MarkerOptions();
  250. markerOptions.position(latLng);
  251. markerOptions.title(medInstName);
  252. if(mMap == null){
  253. mSavedMarkers = new ArrayList<>(1);
  254. mSavedMarkers.add(markerOptions);
  255. return;
  256. }
  257. showMarker(markerOptions);
  258. Log.d("1", "completed");
  259.  
  260. }
  261.  
  262. private void getRoute(LatLng location){
  263. //TODO перенести в resenter
  264. String from = CoordinatesParser.getString(mLastLocation);
  265. String to = CoordinatesParser.getString(location);
  266. MapsCommun commun = new MapsCommun();
  267. commun.query(from, to, new OnRouteListener() {
  268. @Override
  269. public void onSuccess(RouteResponse response) {
  270. showRoute(response);
  271. }
  272.  
  273. @Override
  274. public void onError(int error) {
  275.  
  276. }
  277. });
  278. }
  279. public void showRoute(RouteResponse response){
  280.  
  281. List<LatLng> mPoints = PolyUtil.decode(response.getPoints());
  282. PolylineOptions line = new PolylineOptions();
  283. line.width(4f).color(getResources().getColor(R.color.blue_500));
  284. LatLngBounds.Builder latLngBuilder = new LatLngBounds.Builder();
  285. for (int i = 0; i < mPoints.size(); i++) {
  286.  
  287. line.add(mPoints.get(i));
  288. latLngBuilder.include(mPoints.get(i));
  289. }
  290. mMap.addPolyline(line);
  291. int size = getResources().getDisplayMetrics().widthPixels;
  292. LatLngBounds latLngBounds = latLngBuilder.build();
  293. CameraUpdate track = CameraUpdateFactory.newLatLngBounds(latLngBounds, size, size, 25);
  294. mMap.moveCamera(track);
  295. }
  296.  
  297. @Override
  298. public void sayAppGiveMedInsts(OnLoadedMedInstListListener listener) {
  299. ((App) getApplication()).getMedInstitutions(listener);
  300. }
  301.  
  302. @Override
  303. protected void onStop() {
  304. super.onStop();
  305. mPresenter.activityIsStopped();
  306. }
  307. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement