diff --git a/oeffi/src/de/schildbach/oeffi/directions/DirectionsActivity.java b/oeffi/src/de/schildbach/oeffi/directions/DirectionsActivity.java index 9671e94..06c47b4 100644 --- a/oeffi/src/de/schildbach/oeffi/directions/DirectionsActivity.java +++ b/oeffi/src/de/schildbach/oeffi/directions/DirectionsActivity.java @@ -167,21 +167,25 @@ public class DirectionsActivity extends OeffiMainActivity implements ActivityCom private static final int DIALOG_CLEAR_HISTORY = 1; - private static final int REQUEST_CODE_LOCATION_PERMISSION_FROM = 1; - private static final int REQUEST_CODE_LOCATION_PERMISSION_VIA = 2; - private static final int REQUEST_CODE_LOCATION_PERMISSION_TO = 3; - private static final int REQUEST_CODE_PICK_CONTACT_FROM = 4; - private static final int REQUEST_CODE_PICK_CONTACT_VIA = 5; - private static final int REQUEST_CODE_PICK_CONTACT_TO = 6; - private static final int REQUEST_CODE_PICK_STATION_FROM = 7; - private static final int REQUEST_CODE_PICK_STATION_VIA = 8; - private static final int REQUEST_CODE_PICK_STATION_TO = 9; + private static final int REQUEST_CODE_CONTACTS_PERMISSION_FROM = 1; + private static final int REQUEST_CODE_CONTACTS_PERMISSION_VIA = 2; + private static final int REQUEST_CODE_CONTACTS_PERMISSION_TO = 3; + private static final int REQUEST_CODE_LOCATION_PERMISSION_FROM = 4; + private static final int REQUEST_CODE_LOCATION_PERMISSION_VIA = 5; + private static final int REQUEST_CODE_LOCATION_PERMISSION_TO = 6; + private static final int REQUEST_CODE_PICK_CONTACT_FROM = 7; + private static final int REQUEST_CODE_PICK_CONTACT_VIA = 8; + private static final int REQUEST_CODE_PICK_CONTACT_TO = 9; + private static final int REQUEST_CODE_PICK_STATION_FROM = 10; + private static final int REQUEST_CODE_PICK_STATION_VIA = 11; + private static final int REQUEST_CODE_PICK_STATION_TO = 12; private static final Logger log = LoggerFactory.getLogger(DirectionsActivity.class); private static final String INTENT_EXTRA_FROM_LOCATION = DirectionsActivity.class.getName() + ".from_location"; private static final String INTENT_EXTRA_TO_LOCATION = DirectionsActivity.class.getName() + ".to_location"; private static final String INTENT_EXTRA_TIME_SPEC = DirectionsActivity.class.getName() + ".time_spec"; + private static final Intent INTENT_PICK_CONTACTS = new Intent(Intent.ACTION_PICK, CommonDataKinds.StructuredPostal.CONTENT_URI); public static void start(final Context context, @Nullable final Location fromLocation, @Nullable final Location toLocation, @Nullable final TimeSpec timeSpec, final int intentFlags) { @@ -197,14 +201,16 @@ public class DirectionsActivity extends OeffiMainActivity implements ActivityCom private class LocationContextMenuItemClickListener implements PopupMenu.OnMenuItemClickListener { private final LocationView locationView; + private final int contactsPermissionRequestCode; private final int locationPermissionRequestCode; private final int pickContactRequestCode; private final int pickStationRequestCode; public LocationContextMenuItemClickListener(final LocationView locationView, - final int locationPermissionRequestCode, final int pickContactRequestCode, - final int pickStationRequestCode) { + final int contactsPermissionRequestCode, final int locationPermissionRequestCode, + final int pickContactRequestCode, final int pickStationRequestCode) { this.locationView = locationView; + this.contactsPermissionRequestCode = contactsPermissionRequestCode; this.locationPermissionRequestCode = locationPermissionRequestCode; this.pickContactRequestCode = pickContactRequestCode; this.pickStationRequestCode = pickStationRequestCode; @@ -220,8 +226,12 @@ public class DirectionsActivity extends OeffiMainActivity implements ActivityCom new String[] { Manifest.permission.ACCESS_FINE_LOCATION }, locationPermissionRequestCode); return true; } else if (item.getItemId() == R.id.directions_location_contact) { - startActivityForResult(new Intent(Intent.ACTION_PICK, CommonDataKinds.StructuredPostal.CONTENT_URI), - pickContactRequestCode); + if (ContextCompat.checkSelfPermission(DirectionsActivity.this, + Manifest.permission.READ_CONTACTS) == PackageManager.PERMISSION_GRANTED) + startActivityForResult(INTENT_PICK_CONTACTS, pickContactRequestCode); + else + ActivityCompat.requestPermissions(DirectionsActivity.this, + new String[] { Manifest.permission.READ_CONTACTS }, contactsPermissionRequestCode); return true; } else if (item.getItemId() == R.id.directions_location_favorite_station) { if (network != null) @@ -308,13 +318,15 @@ public class DirectionsActivity extends OeffiMainActivity implements ActivityCom viewFromLocation.setAdapter(autoCompleteAdapter); viewFromLocation.setListener(locationChangeListener); viewFromLocation.setContextMenuItemClickListener(new LocationContextMenuItemClickListener(viewFromLocation, - REQUEST_CODE_LOCATION_PERMISSION_FROM, REQUEST_CODE_PICK_CONTACT_FROM, REQUEST_CODE_PICK_STATION_FROM)); + REQUEST_CODE_CONTACTS_PERMISSION_FROM, REQUEST_CODE_LOCATION_PERMISSION_FROM, + REQUEST_CODE_PICK_CONTACT_FROM, REQUEST_CODE_PICK_STATION_FROM)); viewViaLocation = findViewById(R.id.directions_via); viewViaLocation.setAdapter(autoCompleteAdapter); viewViaLocation.setListener(locationChangeListener); viewViaLocation.setContextMenuItemClickListener(new LocationContextMenuItemClickListener(viewViaLocation, - REQUEST_CODE_LOCATION_PERMISSION_VIA, REQUEST_CODE_PICK_CONTACT_VIA, REQUEST_CODE_PICK_STATION_VIA)); + REQUEST_CODE_CONTACTS_PERMISSION_VIA, REQUEST_CODE_LOCATION_PERMISSION_VIA, + REQUEST_CODE_PICK_CONTACT_VIA, REQUEST_CODE_PICK_STATION_VIA)); viewToLocation = findViewById(R.id.directions_to); viewToLocation.setAdapter(autoCompleteAdapter); @@ -331,7 +343,8 @@ public class DirectionsActivity extends OeffiMainActivity implements ActivityCom } }); viewToLocation.setContextMenuItemClickListener(new LocationContextMenuItemClickListener(viewToLocation, - REQUEST_CODE_LOCATION_PERMISSION_TO, REQUEST_CODE_PICK_CONTACT_TO, REQUEST_CODE_PICK_STATION_TO)); + REQUEST_CODE_CONTACTS_PERMISSION_TO, REQUEST_CODE_LOCATION_PERMISSION_TO, + REQUEST_CODE_PICK_CONTACT_TO, REQUEST_CODE_PICK_STATION_TO)); viewProducts = findViewById(R.id.directions_products); viewProductToggles.add(findViewById(R.id.directions_products_i)); @@ -1155,7 +1168,13 @@ public class DirectionsActivity extends OeffiMainActivity implements ActivityCom @Override public void onRequestPermissionsResult(final int requestCode, final String[] permissions, final int[] grantResults) { - if (requestCode == REQUEST_CODE_LOCATION_PERMISSION_FROM) + if (requestCode == REQUEST_CODE_CONTACTS_PERMISSION_FROM) + startActivityForResult(INTENT_PICK_CONTACTS, REQUEST_CODE_PICK_CONTACT_FROM); + else if (requestCode == REQUEST_CODE_CONTACTS_PERMISSION_VIA) + startActivityForResult(INTENT_PICK_CONTACTS, REQUEST_CODE_PICK_CONTACT_VIA); + else if (requestCode == REQUEST_CODE_CONTACTS_PERMISSION_TO) + startActivityForResult(INTENT_PICK_CONTACTS, REQUEST_CODE_PICK_CONTACT_TO); + else if (requestCode == REQUEST_CODE_LOCATION_PERMISSION_FROM) viewFromLocation.acquireLocation(); else if (requestCode == REQUEST_CODE_LOCATION_PERMISSION_VIA) viewViaLocation.acquireLocation();