package org.osmdroid.intro; import android.Manifest; import android.content.pm.PackageManager; import android.os.Build; import android.os.Bundle; import android.preference.PreferenceManager; import android.support.design.widget.Snackbar; import android.support.v4.app.Fragment; import android.support.v4.content.ContextCompat; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.Toast; import org.osmdroid.R; import org.osmdroid.config.Configuration; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; /** * created on 1/5/2017. * * @author Alex O'Ree */ public class PermissionsFragment extends Fragment implements View.OnClickListener { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View v = inflater.inflate(R.layout.intro_permissions, container,false); if (Build.VERSION.SDK_INT >= 23 && needsPermissions()) { v.findViewById(R.id.askPermissions).setOnClickListener(this); v.findViewById(R.id.askPermissions).setVisibility(View.VISIBLE); } else { v.findViewById(R.id.askPermissions).setVisibility(View.GONE); } return v; } @Override public void onClick(View v) { if (Build.VERSION.SDK_INT >= 23) { checkPermissions(); } else { Configuration.getInstance().load(getContext(), PreferenceManager.getDefaultSharedPreferences(getContext())); } } // START PERMISSION CHECK final private int REQUEST_CODE_ASK_MULTIPLE_PERMISSIONS = 124; private boolean needsPermissions() { List<String> permissions = new ArrayList<>(); if (ContextCompat.checkSelfPermission(getContext(), Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED) { permissions.add(Manifest.permission.ACCESS_FINE_LOCATION); } if (ContextCompat.checkSelfPermission(getContext(), Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) { permissions.add(Manifest.permission.WRITE_EXTERNAL_STORAGE); } if (permissions.isEmpty()) { return false; } // else: We already have permissions, so handle as normal return true; } private void checkPermissions() { List<String> permissions = new ArrayList<>(); String message = "osmdroid permissions:"; if (ContextCompat.checkSelfPermission(getContext(), Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED) { permissions.add(Manifest.permission.ACCESS_FINE_LOCATION); message += "\nLocation to show user location."; } if (ContextCompat.checkSelfPermission(getContext(), Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) { permissions.add(Manifest.permission.WRITE_EXTERNAL_STORAGE); message += "\nStorage access to store map tiles."; } if (!permissions.isEmpty()) { //Toast.makeText(getContext(), message, Toast.LENGTH_LONG).show(); String[] params = permissions.toArray(new String[permissions.size()]); requestPermissions(params, REQUEST_CODE_ASK_MULTIPLE_PERMISSIONS); } // else: We already have permissions, so handle as normal } @Override public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) { switch (requestCode) { case REQUEST_CODE_ASK_MULTIPLE_PERMISSIONS: { Map<String, Integer> perms = new HashMap<>(); // Initial perms.put(Manifest.permission.ACCESS_FINE_LOCATION, PackageManager.PERMISSION_GRANTED); perms.put(Manifest.permission.WRITE_EXTERNAL_STORAGE, PackageManager.PERMISSION_GRANTED); // Fill with results for (int i = 0; i < permissions.length; i++) perms.put(permissions[i], grantResults[i]); // Check for ACCESS_FINE_LOCATION and WRITE_EXTERNAL_STORAGE Boolean location = perms.get(Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED; Boolean storage = perms.get(Manifest.permission.WRITE_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED; if (location && storage) { // All Permissions Granted //Toast.makeText(getContext(), "All permissions granted", Toast.LENGTH_SHORT).show(); Snackbar.make(getView(), "All permissions granted", Snackbar.LENGTH_LONG).show(); } else if (location) { Toast.makeText(getContext(), "Storage permission is required to store map tiles to reduce data usage and for offline usage.", Toast.LENGTH_LONG).show(); } else if (storage) { Toast.makeText(getContext(), "Location permission is required to show the user's location on map.", Toast.LENGTH_LONG).show(); } else { // !location && !storage case // Permission Denied Toast.makeText(getContext(), "Storage permission is required to store map tiles to reduce data usage and for offline usage." + "\nLocation permission is required to show the user's location on map.", Toast.LENGTH_SHORT).show(); } Configuration.getInstance().load(getContext(), PreferenceManager.getDefaultSharedPreferences(getContext())); } break; default: super.onRequestPermissionsResult(requestCode, permissions, grantResults); } } }