package com.quickblox.sample.location.activities;
import android.Manifest;
import android.app.Dialog;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.location.Criteria;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.os.Bundle;
import android.support.v4.app.ActivityCompat;
import android.view.View;
import android.widget.EditText;
import com.google.android.gms.common.ConnectionResult;
import com.google.android.gms.common.GooglePlayServicesUtil;
import com.google.android.gms.maps.CameraUpdateFactory;
import com.google.android.gms.maps.GoogleMap;
import com.google.android.gms.maps.MapFragment;
import com.google.android.gms.maps.OnMapReadyCallback;
import com.google.android.gms.maps.model.BitmapDescriptorFactory;
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 com.quickblox.core.QBEntityCallback;
import com.quickblox.core.exception.QBResponseException;
import com.quickblox.location.QBLocations;
import com.quickblox.location.model.QBLocation;
import com.quickblox.location.request.QBLocationRequestBuilder;
import com.quickblox.sample.core.ui.activity.CoreBaseActivity;
import com.quickblox.sample.core.utils.DialogUtils;
import com.quickblox.sample.core.utils.ResourceUtils;
import com.quickblox.sample.core.utils.Toaster;
import com.quickblox.sample.location.R;
import com.quickblox.sample.location.model.Data;
import com.quickblox.sample.location.utils.Consts;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;
public class MapActivity extends CoreBaseActivity implements LocationListener, OnMapReadyCallback {
private GoogleMap googleMap;
private Location lastLocation;
private Map<Marker, Data> storageMap = new HashMap<Marker, Data>();
private Marker myMarker;
private DialogInterface.OnClickListener checkInPositiveButton;
private DialogInterface.OnClickListener checkInNegativeButton;
public static void start(Context context) {
Intent intent = new Intent(context, MapActivity.class);
context.startActivity(intent);
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_map);
initGooglePlayStatus();
initLocationRequestBuilder();
}
private void initGooglePlayStatus() {
// Getting Google Play availability status
int status = GooglePlayServicesUtil.isGooglePlayServicesAvailable(getBaseContext());
// Showing status
if (status != ConnectionResult.SUCCESS) {
// Google Play Services are not available
int requestCode = Consts.PLAY_SERVICE_REQUEST_CODE;
Dialog dialog = GooglePlayServicesUtil.getErrorDialog(status, this, requestCode);
dialog.show();
} else {
// Google Play Services are available
// Init Map
initMapFragment();
initLocationManager();
}
}
private void initLocationRequestBuilder() {
// Retrieve other users' locations from QuickBlox
//
QBLocationRequestBuilder getLocationsBuilder = new QBLocationRequestBuilder();
getLocationsBuilder.setPerPage(Consts.LOCATION_PER_PAGE);
getLocationsBuilder.setLastOnly();
QBLocations.getLocations(getLocationsBuilder).performAsync(new QBEntityCallback<ArrayList<QBLocation>>() {
@Override
public void onSuccess(ArrayList<QBLocation> qbLocations, Bundle bundle) {
// show all locations on the map
//
for (QBLocation location : qbLocations) {
Marker marker = googleMap.addMarker(new MarkerOptions().position(new LatLng(
location.getLatitude(), location.getLongitude())).icon(
BitmapDescriptorFactory.fromResource(R.drawable.map_marker_other)));
Data data = new Data(location.getUser().getLogin(), location.getStatus());
storageMap.put(marker, data);
}
}
public void onError(QBResponseException e) {
Toaster.longToast(getString(R.string.dlg_location_error) + e.getErrors().toString());
}
});
}
private void setUpMapIfNeeded(GoogleMap googleMapUpdated) {
if (googleMap == null) {
googleMap = googleMapUpdated;
if (googleMap != null) {
googleMap.setMapType(GoogleMap.MAP_TYPE_HYBRID);
googleMap.setOnMarkerClickListener(new GoogleMap.OnMarkerClickListener() {
@Override
public boolean onMarkerClick(Marker marker) {
String message;
if (marker.equals(myMarker)) {
message = getString(R.string.dlg_it_is_me);
} else {
Data data = storageMap.get(marker);
String status = data.getUserStatus() != null ? data.getUserStatus() : getString(R.string.empty);
message = getString(R.string.dlg_user_login) + data.getUserName()
+ getString(R.string.dlg_status) + status;
}
Toaster.longToast(message);
return false;
}
});
}
}
}
private void initMapFragment() {
MapFragment mapFragment = ((MapFragment) getFragmentManager().findFragmentById(R.id.map_fragment));
mapFragment.getMapAsync(this);
}
private void initLocationManager() {
LocationManager locationManager = (LocationManager) getSystemService(LOCATION_SERVICE);
Criteria criteria = new Criteria();
String provider = locationManager.getBestProvider(criteria, true);
if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
// TODO: Consider calling
// ActivityCompat#requestPermissions
// here to request the missing permissions, and then overriding
// public void onRequestPermissionsResult(int requestCode, String[] permissions,
// int[] grantResults)
// to handle the case where the user grants the permission. See the documentation
// for ActivityCompat#requestPermissions for more details.
return;
}
Location location = locationManager.getLastKnownLocation(provider);
if (location != null) {
onLocationChanged(location);
}
locationManager.requestLocationUpdates(provider, Consts.LOCATION_MIN_TIME, 0, this);
}
@Override
public void onLocationChanged(Location location) {
lastLocation = location;
double latitude = location.getLatitude();
double longitude = location.getLongitude();
LatLng latLng = new LatLng(latitude, longitude);
if (myMarker == null) {
myMarker = googleMap.addMarker(new MarkerOptions().position(latLng).icon(
BitmapDescriptorFactory.fromResource(R.drawable.map_marker_my)));
googleMap.moveCamera(CameraUpdateFactory.newLatLng(latLng));
} else {
myMarker.setPosition(latLng);
}
}
@Override
public void onStatusChanged(String provider, int status, Bundle extras) {
}
@Override
public void onProviderEnabled(String provider) {
}
@Override
public void onProviderDisabled(String provider) {
}
public void onClickButtons(View view) {
switch (view.getId()) {
case R.id.check_in_button:
final EditText inputEditText = new EditText(this);
inputEditText.setTextColor(ResourceUtils.getColor(R.color.text_color_medium_dark_grey));
initAlertListeners(inputEditText);
final Dialog checkInAlert = DialogUtils.createDialog(this, R.string.dlg_check_in,
R.string.dlg_enter_message, inputEditText, checkInPositiveButton, checkInNegativeButton);
initAlertListeners(inputEditText);
checkInAlert.show();
break;
}
}
private void initAlertListeners(final EditText input) {
checkInPositiveButton = new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int whichButton) {
// check in
double lat = lastLocation.getLatitude();
double lng = lastLocation.getLongitude();
// ================= QuickBlox ====================
// Share own location
QBLocation location = new QBLocation(lat, lng, input.getText().toString());
QBLocations.createLocation(location).performAsync(new QBEntityCallback<QBLocation>() {
@Override
public void onSuccess(QBLocation qbLocation, Bundle bundle) {
Toaster.longToast(R.string.dlg_check_in_success);
}
public void onError(QBResponseException errors) {
Toaster.longToast(getString(R.string.dlg_location_error) + errors.getErrors().toString());
}
});
}
};
checkInNegativeButton = new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int whichButton) {
// Canceled.
}
};
}
@Override
public void onMapReady(GoogleMap googleMap) {
setUpMapIfNeeded(googleMap);
}
}