Java tutorial
/* * Copyright (c) 2016 Jhansi Tavva. All Rights Reserved. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.android.jhansi.designchallenge; import android.Manifest; import android.content.Context; import android.content.Intent; import android.content.IntentSender; import android.content.pm.PackageManager; import android.location.Address; import android.location.Geocoder; import android.location.Location; import android.location.LocationManager; import android.os.Bundle; import android.provider.Settings; import android.support.v4.app.ActivityCompat; import android.support.v4.app.Fragment; import android.util.Log; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.TextView; 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.CameraUpdateFactory; import com.google.android.gms.maps.GoogleMap; import com.google.android.gms.maps.MapView; import com.google.android.gms.maps.MapsInitializer; import com.google.android.gms.maps.OnMapReadyCallback; import com.google.android.gms.maps.model.BitmapDescriptorFactory; import com.google.android.gms.maps.model.CameraPosition; import com.google.android.gms.maps.model.LatLng; import com.google.android.gms.maps.model.Marker; import com.google.android.gms.maps.model.MarkerOptions; import java.util.List; import java.util.Locale; /** * A simple {@link Fragment} subclass. */ public class MapFragment extends Fragment implements GoogleApiClient.ConnectionCallbacks, GoogleApiClient.OnConnectionFailedListener, LocationListener { MapView mMapView; private static GoogleMap googleMap; private LocationRequest mLocationRequest; private final static int CONNECTION_FAILURE_RESOLUTION_REQUEST = 9000; private GoogleApiClient mGoogleApiClient; private TextView textViewAddress; private CameraPosition cp; public static final String TAG = MapFragment.class.getSimpleName(); private View view; /* GPS Constant Permission */ private static final int MY_PERMISSION_ACCESS_FINE_LOCATION = 12; public MapFragment() { // Required empty public constructor } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { // Inflate the layout for this fragment if (container == null) { return null; } view = inflater.inflate(R.layout.fragment_map, container, false); mMapView = (MapView) view.findViewById(R.id.location_map); mMapView.onCreate(savedInstanceState); mMapView.onResume();// needed to get the map to display immediately // retain this fragment setRetainInstance(true); try { MapsInitializer.initialize(getActivity().getApplicationContext()); } catch (Exception e) { e.printStackTrace(); } setUpMapIfNeeded(); // For setting up the MapFragment mGoogleApiClient = new GoogleApiClient.Builder(getActivity().getApplicationContext()) .addConnectionCallbacks(this).addOnConnectionFailedListener(this).addApi(LocationServices.API) .build(); // Create the LocationRequest object mLocationRequest = LocationRequest.create().setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY) .setInterval(10 * 1000) // 10 seconds, in milliseconds .setFastestInterval(1000); // 1 second, in milliseconds TextView textViewUserInfo = (TextView) view.findViewById(R.id.tv_user_info); textViewUserInfo.setText(CommonUtil.getUserName()); textViewAddress = (TextView) view.findViewById(R.id.tv_address); return view; } public void setUpMapIfNeeded() { // Do a null check to confirm that we have not already instantiated the map. if (googleMap == null) { mMapView.getMapAsync(new OnMapReadyCallback() { @Override public void onMapReady(GoogleMap gMap) { googleMap = gMap; setUpMap(); } }); } } private void setUpMap() { MapsInitializer.initialize(getActivity()); googleMap.getUiSettings().setMyLocationButtonEnabled(false); } @Override public void onResume() { super.onResume(); mMapView.onResume(); setUpMapIfNeeded(); mGoogleApiClient.connect(); if (cp != null && googleMap != null) { googleMap.moveCamera(CameraUpdateFactory.newCameraPosition(cp)); cp = null; } } @Override public void onPause() { super.onPause(); mMapView.onPause(); cp = googleMap.getCameraPosition(); if (mGoogleApiClient.isConnected()) { LocationServices.FusedLocationApi.removeLocationUpdates(mGoogleApiClient, this); mGoogleApiClient.disconnect(); } // googleMap = null; } @Override public void onDestroy() { super.onDestroy(); mMapView.onDestroy(); } @Override public void onLowMemory() { super.onLowMemory(); mMapView.onLowMemory(); } @Override public void onConnected(Bundle bundle) { Log.i(TAG, "Location services connected."); Location location = null; if (ActivityCompat.checkSelfPermission(getActivity(), Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED) { if (!ActivityCompat.shouldShowRequestPermissionRationale(getActivity(), Manifest.permission.ACCESS_FINE_LOCATION)) { //} else { ActivityCompat.requestPermissions(getActivity(), new String[] { Manifest.permission.ACCESS_FINE_LOCATION }, MY_PERMISSION_ACCESS_FINE_LOCATION); } } else { LocationManager mLocationManager = (LocationManager) getActivity() .getSystemService(Context.LOCATION_SERVICE); if (!mLocationManager.isProviderEnabled(LocationManager.GPS_PROVIDER)) { startActivity(new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS)); } location = LocationServices.FusedLocationApi.getLastLocation(mGoogleApiClient); } if (location == null) { LocationServices.FusedLocationApi.requestLocationUpdates(mGoogleApiClient, mLocationRequest, this); } else { handleNewLocation(location); } } private void handleNewLocation(Location location) { Log.d(TAG, location.toString()); Double latitude, longitude; latitude = location.getLatitude(); longitude = location.getLongitude(); LatLng latLng = new LatLng(latitude, longitude); MarkerOptions markerOptions = new MarkerOptions().position(new LatLng(latitude, longitude)); markerOptions.icon(BitmapDescriptorFactory.fromResource(R.drawable.ic_2_9_location_pin)); // For dropping a markerOptions at a point on the Map Marker gmapMarker = googleMap.addMarker(markerOptions); final String strAdress = getCompleteAddressString(latitude, longitude); googleMap.setInfoWindowAdapter(new GoogleMap.InfoWindowAdapter() { public View getInfoWindow(Marker arg0) { View v = getActivity().getLayoutInflater().inflate(R.layout.custom_infowindow, null); TextView textView_address = (TextView) v.findViewById(R.id.info_address); textView_address.setText(strAdress); return v; } public View getInfoContents(Marker arg0) { return null; } }); // For zooming automatically to the Dropped PIN Location CameraPosition cameraPosition = new CameraPosition.Builder().target(latLng).zoom(15).build(); googleMap.animateCamera(CameraUpdateFactory.newCameraPosition(cameraPosition)); gmapMarker.showInfoWindow(); textViewAddress.setText(strAdress); } @Override public void onConnectionSuspended(int i) { Log.i(TAG, "Location services suspended. Please reconnect."); } @Override public void onConnectionFailed(ConnectionResult connectionResult) { if (connectionResult.hasResolution()) { try { // Start an Activity that tries to resolve the error connectionResult.startResolutionForResult(getActivity(), CONNECTION_FAILURE_RESOLUTION_REQUEST); } catch (IntentSender.SendIntentException e) { e.printStackTrace(); // There was an error with the resolution intent. Try again. mGoogleApiClient.connect(); } } else { Log.i(TAG, "Location services connection failed with code " + connectionResult.getErrorCode()); } } @Override public void onLocationChanged(Location location) { handleNewLocation(location); } private String getCompleteAddressString(double LATITUDE, double LONGITUDE) { String strAdd = ""; Geocoder geocoder = new Geocoder(getActivity(), Locale.getDefault()); try { List<Address> addresses = geocoder.getFromLocation(LATITUDE, LONGITUDE, 1); if (addresses != null) { Address returnedAddress = addresses.get(0); StringBuilder strReturnedAddress = new StringBuilder(""); strReturnedAddress.append(returnedAddress.getAddressLine(0)).append(" "); strReturnedAddress.append(returnedAddress.getLocality()); strAdd = strReturnedAddress.toString(); Log.w(TAG, "" + strReturnedAddress.toString()); } else { Log.w(TAG, "No Address returned!"); } } catch (Exception e) { e.printStackTrace(); Log.w(TAG, "Canont get Address!"); } return strAdd; } }