Skip to content

Commit

Permalink
fix: osm tiles are not visible on android 6.x
Browse files Browse the repository at this point in the history
It is due to the new android 6.x permissions policy.

Fix #96
  • Loading branch information
ojacquemart committed Jan 2, 2016
1 parent 317d1b3 commit 7216b3a
Show file tree
Hide file tree
Showing 3 changed files with 125 additions and 36 deletions.
7 changes: 7 additions & 0 deletions app/res/values-fr/strings.xml
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,13 @@
<string name="error_no_location_found">Aucune position disponible</string>
<string name="error_no_gmaps_app_found">Aucune application de navigation trouvée</string>

<!-- Permissions -->
<string name="permission_location_explanation">Votre position est nécessaire pour placer une icône sur la carte</string>
<string name="permission_storage_explanation">Les cartes sont stockées sur votre appareil pour réduire l\'utilisation de votre data</string>
<string name="permission_location_not_granted">Votre position est nécessaire pour vous localiser sur la carte</string>
<string name="permission_storage_not_granted">Le stockage est nécessaire pour la mise en cache des cartes</string>


<!-- Home Preferences -->
<string name="prefs_home_title">Affichage stations</string>
<string name="prefs_station_id_visible_title">Numéro</string>
Expand Down
6 changes: 6 additions & 0 deletions app/res/values/strings.xml
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,12 @@
<string name="error_no_location_found">No location available</string>
<string name="error_no_gmaps_app_found">No navigation app found</string>

<!-- Permissions -->
<string name="permission_location_explanation">Your location is needed to place an icon on the map</string>
<string name="permission_storage_explanation">We store tiles to your devices storage to reduce data usage</string>
<string name="permission_location_not_granted">Location permission is required for user location on map</string>
<string name="permission_storage_not_granted">"Storage permission is needed for offline map data caching</string>

<!-- Home Preferences -->
<string name="prefs_home_title">Stations display</string>
<string name="prefs_station_id_visible_title">Id</string>
Expand Down
148 changes: 112 additions & 36 deletions app/src/com/vlille/checker/ui/fragment/MapFragment.java
Original file line number Diff line number Diff line change
@@ -1,7 +1,11 @@
package com.vlille.checker.ui.fragment;

import android.Manifest;
import android.content.pm.PackageManager;
import android.os.Bundle;
import android.support.design.widget.FloatingActionButton;
import android.support.v4.app.ActivityCompat;
import android.support.v4.content.ContextCompat;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
Expand All @@ -13,53 +17,125 @@
import com.vlille.checker.ui.delegate.StationUpdateDelegate;
import com.vlille.checker.ui.osm.MapState;
import com.vlille.checker.ui.osm.MapView;
import com.vlille.checker.utils.ToastUtils;
import org.droidparts.annotation.inject.InjectDependency;
import org.droidparts.fragment.support.v4.Fragment;
import org.osmdroid.util.GeoPoint;

import java.util.HashMap;
import java.util.List;

import java.util.Map;

/**
* A fragment to localize and bookmark stations from a map, using OpenStreetMap.
*/
public class MapFragment extends Fragment implements StationUpdateDelegate {

private static final String TAG = MapFragment.class.getSimpleName();
private static final String TAG = MapFragment.class.getSimpleName();

private static final Map<Integer, PermissionConfig> PERMISSIONS_CONFIG = new HashMap<>();
static {
PERMISSIONS_CONFIG.put(PermissionConfig.LOCATION, new PermissionConfig(PermissionConfig.LOCATION,
Manifest.permission.ACCESS_FINE_LOCATION,
R.string.permission_location_explanation,
R.string.permission_location_not_granted));
PERMISSIONS_CONFIG.put(PermissionConfig.STORAGE, new PermissionConfig(PermissionConfig.STORAGE,
Manifest.permission.WRITE_EXTERNAL_STORAGE,
R.string.permission_storage_explanation,
R.string.permission_storage_not_granted));
}

@InjectDependency
private StationEntityManager stationEntityManager;
private MapState state = new MapState();

private MapView mapView;

private List<Station> stations;

static class PermissionConfig {
public static int LOCATION = 1;
public static int STORAGE = 2;

private MapState state = new MapState();
private MapView mapView;
private List<Station> stations;

@Override
public void onCreate(Bundle bundle) {
super.onCreate(bundle);
Log.d(TAG, "onCreate");
int requestCode;
String permission;
int explanation;
int notGrantedText;

PermissionConfig(int requestCode, String permission, int explanation, int notGrantedText) {
this.requestCode = requestCode;
this.permission = permission;
this.explanation = explanation;
this.notGrantedText = notGrantedText;
}
}

@Override
public void onCreate(Bundle bundle) {
super.onCreate(bundle);
Log.d(TAG, "onCreate");

checkPermissions();

if (!this.state.isInitialized()) {
this.state.save(MapView.DEFAULT_CENTER_GEO_POINT, MapView.DEFAULT_ZOOM_LEVEL);
}
}

private void checkPermissions() {
Log.d(TAG, "checkPermissions");
for (PermissionConfig permissionConfig : PERMISSIONS_CONFIG.values()) {
checkPermission(permissionConfig);
}
}

private void checkPermission(PermissionConfig permissionConfig) {
Log.v(TAG, "Check for permission " + permissionConfig.permission);

int permissionCheck = ContextCompat.checkSelfPermission(getActivity(), permissionConfig.permission);
if (permissionCheck != PackageManager.PERMISSION_GRANTED) {
if (ActivityCompat.shouldShowRequestPermissionRationale(getActivity(), permissionConfig.permission)) {
ToastUtils.show(getActivity(), permissionConfig.explanation);
} else {
// No explanation needed, we can request the permission.
ActivityCompat.requestPermissions(getActivity(), new String[]{permissionConfig.permission}, permissionConfig.requestCode);
}
}
}

@Override
public void onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults) {
PermissionConfig permissionConfig = PERMISSIONS_CONFIG.get(requestCode);
if (permissionConfig != null) {
handleOnRequestPermissionsResult(permissionConfig, permissions, grantResults);
}
}

private void handleOnRequestPermissionsResult(PermissionConfig permissionConfig, String[] permissions, int[] grantResults) {
Log.v(TAG, "Handle permission result for " + permissionConfig.permission);
boolean granted = grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED;
if (!granted) {
ToastUtils.show(getActivity(), permissionConfig.notGrantedText);
}
}

public void setCenter(GeoPoint center) {
Log.d(TAG, "setCenter " + center);
this.state.currentCenter = center;
this.state.zoomLevel = MapView.DEFAULT_ZOOM_LEVEL;
}
@Override

@Override
public View onCreateView(Bundle savedInstanceState,
LayoutInflater inflater, ViewGroup container) {
super.onCreate(savedInstanceState);
Log.d(TAG, "onCreateView");
super.onCreate(savedInstanceState);
Log.d(TAG, "onCreateView");

final View view = inflater.inflate(R.layout.maps, container, false);
mapView = (MapView) view.findViewById(R.id.mapview);
final View view = inflater.inflate(R.layout.maps, container, false);
mapView = (MapView) view.findViewById(R.id.mapview);

return view;
}
return view;
}

@Override
public void onActivityCreated(Bundle savedInstanceState) {
Expand Down Expand Up @@ -92,23 +168,23 @@ public void onClick(View v) {
});
}

@Override
public void onResume() {
super.onResume();
mapView.updateStations();
}
@Override
public void onPause() {
super.onPause();
Log.d(TAG, "onPause");
GeoPoint mapCenter = (GeoPoint) mapView.getMapCenter();
if (mapView.isLocationOn()) {
mapCenter = null;
}
state.save(mapCenter, mapView.getZoomLevel());
}
@Override
public void onResume() {
super.onResume();

mapView.updateStations();
}

@Override
public void onPause() {
super.onPause();
Log.d(TAG, "onPause");

GeoPoint mapCenter = (GeoPoint) mapView.getMapCenter();
if (mapView.isLocationOn()) {
mapCenter = null;
}
state.save(mapCenter, mapView.getZoomLevel());
}

}

0 comments on commit 7216b3a

Please sign in to comment.