From 72c772f33463f835bcdffe2d3d449dc6cceee890 Mon Sep 17 00:00:00 2001 From: Andreas Schildbach Date: Wed, 7 Sep 2022 19:58:55 +0200 Subject: [PATCH] NetworkPickerActivity, StationsActivity, DirectionsActivity, DirectionsShortcutActivity, PlansPickerActivity, NearestFavoriteStationsWidgetPermissionActivity: use activity result API for requesting permissions --- .../oeffi/directions/DirectionsActivity.java | 55 +++++++++---------- .../DirectionsShortcutActivity.java | 30 ++++------ .../oeffi/network/NetworkPickerActivity.java | 24 ++++---- .../oeffi/plans/PlansPickerActivity.java | 23 ++++---- ...oriteStationsWidgetPermissionActivity.java | 25 ++++----- .../oeffi/stations/StationsActivity.java | 20 +++---- 6 files changed, 80 insertions(+), 97 deletions(-) diff --git a/oeffi/src/de/schildbach/oeffi/directions/DirectionsActivity.java b/oeffi/src/de/schildbach/oeffi/directions/DirectionsActivity.java index 8c3ab05..05bb360 100644 --- a/oeffi/src/de/schildbach/oeffi/directions/DirectionsActivity.java +++ b/oeffi/src/de/schildbach/oeffi/directions/DirectionsActivity.java @@ -58,9 +58,10 @@ import android.widget.Filter; import android.widget.Filterable; import android.widget.PopupMenu; import android.widget.TextView; +import androidx.activity.result.ActivityResultLauncher; +import androidx.activity.result.contract.ActivityResultContracts; import androidx.annotation.Nullable; import androidx.coordinatorlayout.widget.CoordinatorLayout; -import androidx.core.app.ActivityCompat; import androidx.core.content.ContextCompat; import androidx.core.view.ViewCompat; import androidx.recyclerview.widget.LinearLayoutManager; @@ -132,8 +133,8 @@ import java.util.LinkedList; import java.util.List; import java.util.Set; -public class DirectionsActivity extends OeffiMainActivity implements ActivityCompat.OnRequestPermissionsResultCallback, - QueryHistoryClickListener, QueryHistoryContextMenuItemListener { +public class DirectionsActivity extends OeffiMainActivity implements QueryHistoryClickListener, + QueryHistoryContextMenuItemListener { private ConnectivityManager connectivityManager; private LocationManager locationManager; @@ -167,9 +168,6 @@ public class DirectionsActivity extends OeffiMainActivity implements ActivityCom private static final int DIALOG_CLEAR_HISTORY = 1; - 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; @@ -184,6 +182,22 @@ public class DirectionsActivity extends OeffiMainActivity implements ActivityCom 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); + private final ActivityResultLauncher requestLocationPermissionFromLauncher = + registerForActivityResult(new ActivityResultContracts.RequestPermission(), granted -> { + if (granted) + viewFromLocation.acquireLocation(); + }); + private final ActivityResultLauncher requestLocationPermissionViaLauncher = + registerForActivityResult(new ActivityResultContracts.RequestPermission(), granted -> { + if (granted) + viewViaLocation.acquireLocation(); + }); + private final ActivityResultLauncher requestLocationPermissionToLauncher = + registerForActivityResult(new ActivityResultContracts.RequestPermission(), granted -> { + if (granted) + viewToLocation.acquireLocation(); + }); + public static void start(final Context context, @Nullable final Location fromLocation, @Nullable final Location toLocation, @Nullable final TimeSpec timeSpec, final int intentFlags) { final Intent intent = new Intent(context, DirectionsActivity.class).addFlags(intentFlags); @@ -198,15 +212,15 @@ public class DirectionsActivity extends OeffiMainActivity implements ActivityCom private class LocationContextMenuItemClickListener implements PopupMenu.OnMenuItemClickListener { private final LocationView locationView; - private final int locationPermissionRequestCode; + private final ActivityResultLauncher requestLocationPermissionLauncher; private final int pickContactRequestCode; private final int pickStationRequestCode; public LocationContextMenuItemClickListener(final LocationView locationView, - final int locationPermissionRequestCode, + final ActivityResultLauncher requestLocationPermissionLauncher, final int pickContactRequestCode, final int pickStationRequestCode) { this.locationView = locationView; - this.locationPermissionRequestCode = locationPermissionRequestCode; + this.requestLocationPermissionLauncher = requestLocationPermissionLauncher; this.pickContactRequestCode = pickContactRequestCode; this.pickStationRequestCode = pickStationRequestCode; } @@ -217,8 +231,7 @@ public class DirectionsActivity extends OeffiMainActivity implements ActivityCom Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED) locationView.acquireLocation(); else - ActivityCompat.requestPermissions(DirectionsActivity.this, - new String[] { Manifest.permission.ACCESS_FINE_LOCATION }, locationPermissionRequestCode); + requestLocationPermissionLauncher.launch(Manifest.permission.ACCESS_FINE_LOCATION); return true; } else if (item.getItemId() == R.id.directions_location_contact) { startActivityForResult(INTENT_PICK_CONTACTS, pickContactRequestCode); @@ -308,15 +321,13 @@ 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)); + requestLocationPermissionFromLauncher, 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)); + requestLocationPermissionViaLauncher, REQUEST_CODE_PICK_CONTACT_VIA, REQUEST_CODE_PICK_STATION_VIA)); viewToLocation = findViewById(R.id.directions_to); viewToLocation.setAdapter(autoCompleteAdapter); @@ -333,8 +344,7 @@ 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)); + requestLocationPermissionToLauncher, REQUEST_CODE_PICK_CONTACT_TO, REQUEST_CODE_PICK_STATION_TO)); viewProducts = findViewById(R.id.directions_products); viewProductToggles.add(findViewById(R.id.directions_products_i)); @@ -1147,17 +1157,6 @@ 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) - viewFromLocation.acquireLocation(); - else if (requestCode == REQUEST_CODE_LOCATION_PERMISSION_VIA) - viewViaLocation.acquireLocation(); - else if (requestCode == REQUEST_CODE_LOCATION_PERMISSION_TO) - viewToLocation.acquireLocation(); - } - private void resultPickContact(final Intent result, final LocationView targetLocationView) { final Cursor c = managedQuery(result.getData(), null, null, null, null); if (c.moveToFirst()) { diff --git a/oeffi/src/de/schildbach/oeffi/directions/DirectionsShortcutActivity.java b/oeffi/src/de/schildbach/oeffi/directions/DirectionsShortcutActivity.java index ec659bd..7455469 100644 --- a/oeffi/src/de/schildbach/oeffi/directions/DirectionsShortcutActivity.java +++ b/oeffi/src/de/schildbach/oeffi/directions/DirectionsShortcutActivity.java @@ -30,7 +30,8 @@ import android.os.Bundle; import android.os.Handler; import android.os.HandlerThread; import android.os.Process; -import androidx.core.app.ActivityCompat; +import androidx.activity.result.ActivityResultLauncher; +import androidx.activity.result.contract.ActivityResultContracts; import androidx.core.content.ContextCompat; import com.google.common.base.Throwables; import de.schildbach.oeffi.Constants; @@ -58,8 +59,7 @@ import org.slf4j.LoggerFactory; import javax.net.ssl.SSLException; import java.util.Set; -public class DirectionsShortcutActivity extends OeffiActivity - implements ActivityCompat.OnRequestPermissionsResultCallback, LocationHelper.Callback { +public class DirectionsShortcutActivity extends OeffiActivity implements LocationHelper.Callback { public static final String INTENT_EXTRA_NETWORK = "network"; public static final String INTENT_EXTRA_TYPE = "type"; public static final String INTENT_EXTRA_ID = "stationid"; @@ -76,10 +76,16 @@ public class DirectionsShortcutActivity extends OeffiActivity private final Handler handler = new Handler(); private QueryTripsRunnable queryTripsRunnable; - private static final int REQUEST_CODE_REQUEST_LOCATION_PERMISSION = 1; - private static final Logger log = LoggerFactory.getLogger(DirectionsShortcutActivity.class); + private final ActivityResultLauncher requestPermissionLauncher = + registerForActivityResult(new ActivityResultContracts.RequestPermission(), granted -> { + if (granted) + maybeStartLocation(); + else + errorDialog(R.string.acquire_location_no_permission); + }); + @Override protected void onCreate(final Bundle savedInstanceState) { super.onCreate(savedInstanceState); @@ -94,8 +100,7 @@ public class DirectionsShortcutActivity extends OeffiActivity Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED) maybeStartLocation(); else - ActivityCompat.requestPermissions(this, new String[] { Manifest.permission.ACCESS_FINE_LOCATION }, - REQUEST_CODE_REQUEST_LOCATION_PERMISSION); + requestPermissionLauncher.launch(Manifest.permission.ACCESS_FINE_LOCATION); } @Override @@ -105,17 +110,6 @@ public class DirectionsShortcutActivity extends OeffiActivity super.onDestroy(); } - @Override - public void onRequestPermissionsResult(final int requestCode, final String[] permissions, - final int[] grantResults) { - if (requestCode == REQUEST_CODE_REQUEST_LOCATION_PERMISSION) { - if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) - maybeStartLocation(); - else - errorDialog(R.string.acquire_location_no_permission); - } - } - public void maybeStartLocation() { if (ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED) diff --git a/oeffi/src/de/schildbach/oeffi/network/NetworkPickerActivity.java b/oeffi/src/de/schildbach/oeffi/network/NetworkPickerActivity.java index f6204fe..f18c129 100644 --- a/oeffi/src/de/schildbach/oeffi/network/NetworkPickerActivity.java +++ b/oeffi/src/de/schildbach/oeffi/network/NetworkPickerActivity.java @@ -40,7 +40,8 @@ import android.view.View; import android.widget.LinearLayout; import android.widget.TextView; import androidx.activity.ComponentActivity; -import androidx.core.app.ActivityCompat; +import androidx.activity.result.ActivityResultLauncher; +import androidx.activity.result.contract.ActivityResultContracts; import androidx.core.content.ContextCompat; import androidx.recyclerview.widget.LinearLayoutManager; import androidx.recyclerview.widget.RecyclerView; @@ -75,8 +76,8 @@ import java.util.List; import java.util.Locale; import java.util.Map; -public class NetworkPickerActivity extends ComponentActivity implements ActivityCompat.OnRequestPermissionsResultCallback, - LocationHelper.Callback, NetworkClickListener, NetworkContextMenuItemListener { +public class NetworkPickerActivity extends ComponentActivity implements LocationHelper.Callback, NetworkClickListener, + NetworkContextMenuItemListener { public static void start(final Context context) { final Intent intent = new Intent(context, NetworkPickerActivity.class); context.startActivity(intent); @@ -102,10 +103,13 @@ public class NetworkPickerActivity extends ComponentActivity implements Activity private static final String INDEX_FILENAME = "networks.txt"; private static final int MAX_LAST_NETWORKS = 3; - private static final int REQUEST_CODE_REQUEST_LOCATION_PERMISSION = 1; - private static final Logger log = LoggerFactory.getLogger(NetworkPickerActivity.class); + private final ActivityResultLauncher requestPermissionLauncher = + registerForActivityResult(new ActivityResultContracts.RequestPermission(), granted -> { + maybeStartLocation(); + }); + @Override protected void onCreate(final Bundle savedInstanceState) { super.onCreate(savedInstanceState); @@ -195,8 +199,7 @@ public class NetworkPickerActivity extends ComponentActivity implements Activity if (ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) - ActivityCompat.requestPermissions(this, new String[] { Manifest.permission.ACCESS_COARSE_LOCATION }, - REQUEST_CODE_REQUEST_LOCATION_PERMISSION); + requestPermissionLauncher.launch(Manifest.permission.ACCESS_COARSE_LOCATION); } @Override @@ -233,13 +236,6 @@ public class NetworkPickerActivity extends ComponentActivity implements Activity super.onDestroy(); } - @Override - public void onRequestPermissionsResult(final int requestCode, final String[] permissions, - final int[] grantResults) { - if (requestCode == REQUEST_CODE_REQUEST_LOCATION_PERMISSION) - maybeStartLocation(); - } - public void maybeStartLocation() { if (ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) diff --git a/oeffi/src/de/schildbach/oeffi/plans/PlansPickerActivity.java b/oeffi/src/de/schildbach/oeffi/plans/PlansPickerActivity.java index 1c574a9..1ce67d9 100644 --- a/oeffi/src/de/schildbach/oeffi/plans/PlansPickerActivity.java +++ b/oeffi/src/de/schildbach/oeffi/plans/PlansPickerActivity.java @@ -33,8 +33,9 @@ import android.net.Uri; import android.os.Bundle; import android.view.View; import android.widget.TextView; +import androidx.activity.result.ActivityResultLauncher; +import androidx.activity.result.contract.ActivityResultContracts; import androidx.annotation.Nullable; -import androidx.core.app.ActivityCompat; import androidx.core.content.ContextCompat; import androidx.core.content.pm.ShortcutInfoCompat; import androidx.core.content.pm.ShortcutManagerCompat; @@ -66,8 +67,8 @@ import org.slf4j.LoggerFactory; import java.io.File; import java.net.HttpURLConnection; -public class PlansPickerActivity extends OeffiMainActivity implements ActivityCompat.OnRequestPermissionsResultCallback, - LocationHelper.Callback, PlanClickListener, PlanContextMenuItemListener { +public class PlansPickerActivity extends OeffiMainActivity implements LocationHelper.Callback, PlanClickListener, + PlanContextMenuItemListener { private ConnectivityManager connectivityManager; private LocationHelper locationHelper; @@ -84,11 +85,15 @@ public class PlansPickerActivity extends OeffiMainActivity implements ActivityCo private Cursor cursor; - private static final int REQUEST_CODE_REQUEST_LOCATION_PERMISSION = 1; private static final int THUMB_CACHE_SIZE = 2 * 1024 * 1024; private static final Logger log = LoggerFactory.getLogger(PlansPickerActivity.class); + private final ActivityResultLauncher requestPermissionLauncher = + registerForActivityResult(new ActivityResultContracts.RequestPermission(), granted -> { + maybeStartLocation(); + }); + @Override protected String taskName() { return "plans"; @@ -154,8 +159,7 @@ public class PlansPickerActivity extends OeffiMainActivity implements ActivityCo if (ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) - ActivityCompat.requestPermissions(this, new String[] { Manifest.permission.ACCESS_COARSE_LOCATION }, - REQUEST_CODE_REQUEST_LOCATION_PERMISSION); + requestPermissionLauncher.launch(Manifest.permission.ACCESS_COARSE_LOCATION); } @Override @@ -186,13 +190,6 @@ public class PlansPickerActivity extends OeffiMainActivity implements ActivityCo super.onDestroy(); } - @Override - public void onRequestPermissionsResult(final int requestCode, final String[] permissions, - final int[] grantResults) { - if (requestCode == REQUEST_CODE_REQUEST_LOCATION_PERMISSION) - maybeStartLocation(); - } - public void maybeStartLocation() { if (ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) diff --git a/oeffi/src/de/schildbach/oeffi/stations/NearestFavoriteStationsWidgetPermissionActivity.java b/oeffi/src/de/schildbach/oeffi/stations/NearestFavoriteStationsWidgetPermissionActivity.java index daec387..bd52c48 100644 --- a/oeffi/src/de/schildbach/oeffi/stations/NearestFavoriteStationsWidgetPermissionActivity.java +++ b/oeffi/src/de/schildbach/oeffi/stations/NearestFavoriteStationsWidgetPermissionActivity.java @@ -22,18 +22,27 @@ import android.content.pm.PackageManager; import android.os.Build; import android.os.Bundle; import androidx.activity.ComponentActivity; -import androidx.core.app.ActivityCompat; +import androidx.activity.result.ActivityResultLauncher; +import androidx.activity.result.contract.ActivityResultContracts; import androidx.core.content.ContextCompat; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import java.util.Arrays; import java.util.LinkedList; import java.util.List; +import java.util.Map; public class NearestFavoriteStationsWidgetPermissionActivity extends ComponentActivity { private static final Logger log = LoggerFactory.getLogger(NearestFavoriteStationsWidgetPermissionActivity.class); + private final ActivityResultLauncher requestPermissionsLauncher = + registerForActivityResult(new ActivityResultContracts.RequestMultiplePermissions(), results -> { + for (Map.Entry entry : results.entrySet()) + log.info("{} {}", entry.getKey(), entry.getValue() ? "granted" : "denied"); + NearestFavoriteStationWidgetService.scheduleImmediate(this); // refresh app-widget + finish(); + }); + @Override protected void onCreate(final Bundle savedInstanceState) { super.onCreate(savedInstanceState); @@ -44,16 +53,6 @@ public class NearestFavoriteStationsWidgetPermissionActivity extends ComponentAc if (Build.VERSION.SDK_INT < Build.VERSION_CODES.R || permissions.isEmpty()) permissions.add(Manifest.permission.ACCESS_BACKGROUND_LOCATION); log.info("Requesting permissions: {}", permissions); - ActivityCompat.requestPermissions(this, permissions.toArray(new String[0]), 0); - } - - @Override - public void onRequestPermissionsResult(final int requestCode, final String[] permissions, - final int[] grantResults) { - for (int i = 0; i < permissions.length; i++) - log.info("{}{} granted", - permissions[i], grantResults[i] == PackageManager.PERMISSION_GRANTED ? "" : " " + "not"); - NearestFavoriteStationWidgetService.scheduleImmediate(this); // refresh app-widget - finish(); + requestPermissionsLauncher.launch(permissions.toArray(new String[0])); } } diff --git a/oeffi/src/de/schildbach/oeffi/stations/StationsActivity.java b/oeffi/src/de/schildbach/oeffi/stations/StationsActivity.java index 9ffdf9e..fc0d0d8 100644 --- a/oeffi/src/de/schildbach/oeffi/stations/StationsActivity.java +++ b/oeffi/src/de/schildbach/oeffi/stations/StationsActivity.java @@ -53,8 +53,9 @@ import android.view.ViewGroup; import android.widget.Button; import android.widget.TextView; import android.widget.ViewAnimator; +import androidx.activity.result.ActivityResultLauncher; +import androidx.activity.result.contract.ActivityResultContracts; import androidx.annotation.Nullable; -import androidx.core.app.ActivityCompat; import androidx.core.content.ContextCompat; import androidx.recyclerview.widget.ItemTouchHelper; import androidx.recyclerview.widget.LinearLayoutManager; @@ -116,7 +117,7 @@ import java.util.Map; import java.util.Set; public class StationsActivity extends OeffiMainActivity implements StationsAware, LocationAware, - ActivityCompat.OnRequestPermissionsResultCallback, StationContextMenuItemListener { + StationContextMenuItemListener { private ConnectivityManager connectivityManager; private LocationManager locationManager; private SensorManager sensorManager; @@ -160,6 +161,11 @@ public class StationsActivity extends OeffiMainActivity implements StationsAware private static final Logger log = LoggerFactory.getLogger(StationsActivity.class); + private final ActivityResultLauncher requestPermissionLauncher = + registerForActivityResult(new ActivityResultContracts.RequestPermission(), granted -> { + startLocationProvider(); + }); + @Override protected String taskName() { return "stations"; @@ -244,8 +250,7 @@ public class StationsActivity extends OeffiMainActivity implements StationsAware final Button locationPermissionRequestButton = findViewById( R.id.stations_location_permission_request_button); - locationPermissionRequestButton.setOnClickListener(v -> ActivityCompat.requestPermissions(StationsActivity.this, - new String[] { Manifest.permission.ACCESS_FINE_LOCATION }, 0)); + locationPermissionRequestButton.setOnClickListener(v -> requestPermissionLauncher.launch(Manifest.permission.ACCESS_FINE_LOCATION)); final Button locationSettingsButton = findViewById(R.id.stations_list_location_settings); locationSettingsButton.setOnClickListener(v -> startActivity(new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS))); @@ -1342,13 +1347,6 @@ public class StationsActivity extends OeffiMainActivity implements StationsAware return null; } - @Override - public void onRequestPermissionsResult(final int requestCode, final String[] permissions, - final int[] grantResults) { - if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) - startLocationProvider(); - } - public boolean onStationContextMenuItemClick(final int adapterPosition, final NetworkId network, final Location station, final @Nullable List departures, final int menuItemId) { if (menuItemId == R.id.station_context_add_favorite) {