-
-
Save anonymous/17b39b55c48f0bb0944b634307fd4b41 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
package pl.itberries.msh.discoverity; | |
import android.Manifest; | |
import android.content.pm.PackageManager; | |
import android.graphics.PointF; | |
import android.location.Location; | |
import android.location.LocationManager; | |
import android.support.v4.app.ActivityCompat; | |
import android.support.v4.content.ContextCompat; | |
import android.support.v7.app.AppCompatActivity; | |
import android.os.Bundle; | |
import android.view.Gravity; | |
import android.view.Menu; | |
import android.view.MenuInflater; | |
import android.view.MenuItem; | |
import android.view.View; | |
import android.widget.Button; | |
import android.widget.Toast; | |
import com.mapbox.mapboxsdk.camera.CameraPosition; | |
import com.mapbox.mapboxsdk.constants.MyLocationTracking; | |
import com.mapbox.mapboxsdk.constants.Style; | |
import com.mapbox.mapboxsdk.geometry.LatLng; | |
import com.mapbox.mapboxsdk.geometry.LatLngBounds; | |
import com.mapbox.mapboxsdk.maps.MapView; | |
import com.mapbox.mapboxsdk.maps.MapboxMap; | |
import com.mapbox.mapboxsdk.maps.OnMapReadyCallback; | |
import com.mapbox.mapboxsdk.maps.Projection; | |
import com.mapbox.mapboxsdk.maps.UiSettings; | |
import com.mapbox.mapboxsdk.offline.OfflineManager; | |
import com.mapbox.mapboxsdk.offline.OfflineRegion; | |
import com.mapbox.mapboxsdk.offline.OfflineRegionError; | |
import com.mapbox.mapboxsdk.offline.OfflineRegionStatus; | |
import com.mapbox.mapboxsdk.offline.OfflineTilePyramidRegionDefinition; | |
import javax.inject.Inject; | |
import butterknife.Bind; | |
import butterknife.ButterKnife; | |
import static pl.itberries.msh.discoverity.App.app; | |
public class MainActivity extends AppCompatActivity { | |
public static final double INITIAL_ZOOM = 16.0; | |
@Bind(R.id.baseMapView) | |
MapView mapView; | |
private OfflineManager manager; | |
@Override | |
protected void onCreate(Bundle savedInstanceState) { | |
super.onCreate(savedInstanceState); | |
setContentView(R.layout.activity_main); | |
ButterKnife.bind(this); | |
app(this).getComponent().inject(this); | |
manager = OfflineManager.getInstance(MainActivity.this); | |
manager.setAccessToken(getString(R.string.mapboxToken)); | |
mapView.onCreate(savedInstanceState); | |
mapView.getMapAsync(new OnMapReadyCallback() { | |
@Override | |
public void onMapReady(final MapboxMap mapboxMap) { | |
requestPermissions(Manifest.permission.ACCESS_FINE_LOCATION, | |
Manifest.permission.ACCESS_COARSE_LOCATION); | |
requestPermissions(Manifest.permission.CAMERA); | |
trackUser(mapboxMap); | |
mapboxMap.setStyle(Style.MAPBOX_STREETS); | |
UiSettings uiSettings = mapboxMap.getUiSettings(); | |
uiSettings.setAttributionMargins(7, 7, 7, 7); | |
uiSettings.setAttributionGravity(Gravity.START | Gravity.TOP); | |
uiSettings.setTiltGesturesEnabled(false); | |
uiSettings.setRotateGesturesEnabled(false); | |
uiSettings.setScrollGesturesEnabled(false); | |
uiSettings.setLogoGravity(Gravity.TOP | Gravity.CENTER_HORIZONTAL); | |
manager.listOfflineRegions(new OfflineManager.ListOfflineRegionsCallback() { | |
@Override | |
public void onList(OfflineRegion[] offlineRegions) { | |
Toast.makeText(MainActivity.this, "Offline regions: " + offlineRegions.length, Toast.LENGTH_LONG).show(); | |
} | |
@Override | |
public void onError(String error) { | |
} | |
}); | |
} | |
}); | |
} | |
void resumeUserTracking() { | |
mapView.getMapAsync(new OnMapReadyCallback() { | |
@Override | |
public void onMapReady(MapboxMap mapboxMap) { | |
trackUser(mapboxMap); | |
} | |
}); | |
} | |
private void trackUser(MapboxMap mapboxMap) { | |
LocationManager locationManager = (LocationManager) getSystemService(LOCATION_SERVICE); | |
Location last = locationManager.getLastKnownLocation(LocationManager.GPS_PROVIDER); | |
mapboxMap.setCameraPosition(new CameraPosition.Builder() | |
.zoom(INITIAL_ZOOM) | |
.target(last != null ? new LatLng(last.getLatitude(), last.getLongitude()) : null) | |
.build() | |
); | |
mapboxMap.getTrackingSettings().setMyLocationTrackingMode(MyLocationTracking.TRACKING_FOLLOW); | |
mapboxMap.setMyLocationEnabled(true); | |
} | |
@Override | |
public void onResume() { | |
super.onResume(); | |
mapView.onResume(); | |
} | |
@Override | |
public void onPause() { | |
super.onPause(); | |
mapView.onPause(); | |
} | |
@Override | |
public void onLowMemory() { | |
super.onLowMemory(); | |
mapView.onLowMemory(); | |
} | |
@Override | |
protected void onDestroy() { | |
super.onDestroy(); | |
mapView.onDestroy(); | |
} | |
@Override | |
protected void onSaveInstanceState(Bundle outState) { | |
super.onSaveInstanceState(outState); | |
mapView.onSaveInstanceState(outState); | |
} | |
@Override | |
public boolean onCreateOptionsMenu(Menu menu) { | |
MenuInflater inflater = getMenuInflater(); | |
inflater.inflate(R.menu.menu_main, menu); | |
return true; | |
} | |
@Override | |
public boolean onOptionsItemSelected(MenuItem item) { | |
switch (item.getItemId()) { | |
case R.id.action_remember_map_area: | |
downloadWithinBounds(); | |
return true; | |
case R.id.action_forget_map_areas: | |
deleteAllRegions(); | |
return true; | |
default: | |
return super.onOptionsItemSelected(item); | |
} | |
} | |
private void downloadWithinBounds() { | |
mapView.getMapAsync(new OnMapReadyCallback() { | |
@Override | |
public void onMapReady(MapboxMap mapboxMap) { | |
Projection projection = mapboxMap.getProjection(); | |
LatLng topLeft = projection.fromScreenLocation(new PointF(0, 0)); | |
LatLng bottomRight = projection.fromScreenLocation( | |
new PointF(mapView.getWidth(), mapView.getHeight())); | |
manager.createOfflineRegion(new OfflineTilePyramidRegionDefinition( | |
Style.MAPBOX_STREETS, | |
new LatLngBounds.Builder() | |
.include(topLeft) | |
.include(bottomRight) | |
.build(), | |
mapboxMap.getCameraPosition().zoom, | |
mapboxMap.getMaxZoom(), | |
1.0f | |
), new byte[0], new OfflineManager.CreateOfflineRegionCallback() { | |
@Override | |
public void onCreate(OfflineRegion offlineRegion) { | |
offlineRegion.setDownloadState(OfflineRegion.STATE_ACTIVE); | |
offlineRegion.setObserver(new OfflineRegion.OfflineRegionObserver() { | |
@Override | |
public void onStatusChanged(OfflineRegionStatus status) { | |
if (status.isComplete()) { | |
Toast.makeText(MainActivity.this, "Done saving map.", Toast.LENGTH_SHORT).show(); | |
} | |
} | |
@Override | |
public void onError(OfflineRegionError error) { | |
} | |
@Override | |
public void mapboxTileCountLimitExceeded(long limit) { | |
} | |
}); | |
} | |
@Override | |
public void onError(String error) { | |
} | |
}); | |
} | |
}); | |
} | |
private void deleteAllRegions() { | |
manager.listOfflineRegions(new OfflineManager.ListOfflineRegionsCallback() { | |
@Override | |
public void onList(OfflineRegion[] offlineRegions) { | |
for (OfflineRegion region : offlineRegions) { | |
region.delete(new OfflineRegion.OfflineRegionDeleteCallback() { | |
@Override | |
public void onDelete() { | |
} | |
@Override | |
public void onError(String error) { | |
} | |
}); | |
} | |
} | |
@Override | |
public void onError(String error) { | |
} | |
}); | |
} | |
private void requestPermissions(String... permissions) { | |
if (!hasAllPermissions(permissions)) { | |
ActivityCompat.requestPermissions(this, permissions, 1); | |
} | |
} | |
private boolean hasAllPermissions(String... permissions) { | |
for (String permission : permissions) { | |
if (ContextCompat.checkSelfPermission(this, | |
permission) != PackageManager.PERMISSION_GRANTED) { | |
return false; | |
} | |
} | |
return true; | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment