NetworkPickerActivity, StationsActivity, DirectionsActivity, DirectionsShortcutActivity, PlansPickerActivity, NearestFavoriteStationsWidgetPermissionActivity: use activity result API for requesting permissions

This commit is contained in:
Andreas Schildbach 2022-09-07 19:58:55 +02:00
parent 1e265a61da
commit 72c772f334
6 changed files with 80 additions and 97 deletions

View file

@ -58,9 +58,10 @@ import android.widget.Filter;
import android.widget.Filterable; import android.widget.Filterable;
import android.widget.PopupMenu; import android.widget.PopupMenu;
import android.widget.TextView; import android.widget.TextView;
import androidx.activity.result.ActivityResultLauncher;
import androidx.activity.result.contract.ActivityResultContracts;
import androidx.annotation.Nullable; import androidx.annotation.Nullable;
import androidx.coordinatorlayout.widget.CoordinatorLayout; import androidx.coordinatorlayout.widget.CoordinatorLayout;
import androidx.core.app.ActivityCompat;
import androidx.core.content.ContextCompat; import androidx.core.content.ContextCompat;
import androidx.core.view.ViewCompat; import androidx.core.view.ViewCompat;
import androidx.recyclerview.widget.LinearLayoutManager; import androidx.recyclerview.widget.LinearLayoutManager;
@ -132,8 +133,8 @@ import java.util.LinkedList;
import java.util.List; import java.util.List;
import java.util.Set; import java.util.Set;
public class DirectionsActivity extends OeffiMainActivity implements ActivityCompat.OnRequestPermissionsResultCallback, public class DirectionsActivity extends OeffiMainActivity implements QueryHistoryClickListener,
QueryHistoryClickListener, QueryHistoryContextMenuItemListener { QueryHistoryContextMenuItemListener {
private ConnectivityManager connectivityManager; private ConnectivityManager connectivityManager;
private LocationManager locationManager; 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 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_FROM = 7;
private static final int REQUEST_CODE_PICK_CONTACT_VIA = 8; 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_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 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 static final Intent INTENT_PICK_CONTACTS = new Intent(Intent.ACTION_PICK, CommonDataKinds.StructuredPostal.CONTENT_URI);
private final ActivityResultLauncher<String> requestLocationPermissionFromLauncher =
registerForActivityResult(new ActivityResultContracts.RequestPermission(), granted -> {
if (granted)
viewFromLocation.acquireLocation();
});
private final ActivityResultLauncher<String> requestLocationPermissionViaLauncher =
registerForActivityResult(new ActivityResultContracts.RequestPermission(), granted -> {
if (granted)
viewViaLocation.acquireLocation();
});
private final ActivityResultLauncher<String> requestLocationPermissionToLauncher =
registerForActivityResult(new ActivityResultContracts.RequestPermission(), granted -> {
if (granted)
viewToLocation.acquireLocation();
});
public static void start(final Context context, @Nullable final Location fromLocation, public static void start(final Context context, @Nullable final Location fromLocation,
@Nullable final Location toLocation, @Nullable final TimeSpec timeSpec, final int intentFlags) { @Nullable final Location toLocation, @Nullable final TimeSpec timeSpec, final int intentFlags) {
final Intent intent = new Intent(context, DirectionsActivity.class).addFlags(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 class LocationContextMenuItemClickListener implements PopupMenu.OnMenuItemClickListener {
private final LocationView locationView; private final LocationView locationView;
private final int locationPermissionRequestCode; private final ActivityResultLauncher<String> requestLocationPermissionLauncher;
private final int pickContactRequestCode; private final int pickContactRequestCode;
private final int pickStationRequestCode; private final int pickStationRequestCode;
public LocationContextMenuItemClickListener(final LocationView locationView, public LocationContextMenuItemClickListener(final LocationView locationView,
final int locationPermissionRequestCode, final ActivityResultLauncher<String> requestLocationPermissionLauncher,
final int pickContactRequestCode, final int pickStationRequestCode) { final int pickContactRequestCode, final int pickStationRequestCode) {
this.locationView = locationView; this.locationView = locationView;
this.locationPermissionRequestCode = locationPermissionRequestCode; this.requestLocationPermissionLauncher = requestLocationPermissionLauncher;
this.pickContactRequestCode = pickContactRequestCode; this.pickContactRequestCode = pickContactRequestCode;
this.pickStationRequestCode = pickStationRequestCode; this.pickStationRequestCode = pickStationRequestCode;
} }
@ -217,8 +231,7 @@ public class DirectionsActivity extends OeffiMainActivity implements ActivityCom
Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED) Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED)
locationView.acquireLocation(); locationView.acquireLocation();
else else
ActivityCompat.requestPermissions(DirectionsActivity.this, requestLocationPermissionLauncher.launch(Manifest.permission.ACCESS_FINE_LOCATION);
new String[] { Manifest.permission.ACCESS_FINE_LOCATION }, locationPermissionRequestCode);
return true; return true;
} else if (item.getItemId() == R.id.directions_location_contact) { } else if (item.getItemId() == R.id.directions_location_contact) {
startActivityForResult(INTENT_PICK_CONTACTS, pickContactRequestCode); startActivityForResult(INTENT_PICK_CONTACTS, pickContactRequestCode);
@ -308,15 +321,13 @@ public class DirectionsActivity extends OeffiMainActivity implements ActivityCom
viewFromLocation.setAdapter(autoCompleteAdapter); viewFromLocation.setAdapter(autoCompleteAdapter);
viewFromLocation.setListener(locationChangeListener); viewFromLocation.setListener(locationChangeListener);
viewFromLocation.setContextMenuItemClickListener(new LocationContextMenuItemClickListener(viewFromLocation, viewFromLocation.setContextMenuItemClickListener(new LocationContextMenuItemClickListener(viewFromLocation,
REQUEST_CODE_LOCATION_PERMISSION_FROM, requestLocationPermissionFromLauncher, REQUEST_CODE_PICK_CONTACT_FROM, REQUEST_CODE_PICK_STATION_FROM));
REQUEST_CODE_PICK_CONTACT_FROM, REQUEST_CODE_PICK_STATION_FROM));
viewViaLocation = findViewById(R.id.directions_via); viewViaLocation = findViewById(R.id.directions_via);
viewViaLocation.setAdapter(autoCompleteAdapter); viewViaLocation.setAdapter(autoCompleteAdapter);
viewViaLocation.setListener(locationChangeListener); viewViaLocation.setListener(locationChangeListener);
viewViaLocation.setContextMenuItemClickListener(new LocationContextMenuItemClickListener(viewViaLocation, viewViaLocation.setContextMenuItemClickListener(new LocationContextMenuItemClickListener(viewViaLocation,
REQUEST_CODE_LOCATION_PERMISSION_VIA, requestLocationPermissionViaLauncher, REQUEST_CODE_PICK_CONTACT_VIA, REQUEST_CODE_PICK_STATION_VIA));
REQUEST_CODE_PICK_CONTACT_VIA, REQUEST_CODE_PICK_STATION_VIA));
viewToLocation = findViewById(R.id.directions_to); viewToLocation = findViewById(R.id.directions_to);
viewToLocation.setAdapter(autoCompleteAdapter); viewToLocation.setAdapter(autoCompleteAdapter);
@ -333,8 +344,7 @@ public class DirectionsActivity extends OeffiMainActivity implements ActivityCom
} }
}); });
viewToLocation.setContextMenuItemClickListener(new LocationContextMenuItemClickListener(viewToLocation, viewToLocation.setContextMenuItemClickListener(new LocationContextMenuItemClickListener(viewToLocation,
REQUEST_CODE_LOCATION_PERMISSION_TO, requestLocationPermissionToLauncher, REQUEST_CODE_PICK_CONTACT_TO, REQUEST_CODE_PICK_STATION_TO));
REQUEST_CODE_PICK_CONTACT_TO, REQUEST_CODE_PICK_STATION_TO));
viewProducts = findViewById(R.id.directions_products); viewProducts = findViewById(R.id.directions_products);
viewProductToggles.add(findViewById(R.id.directions_products_i)); 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) { private void resultPickContact(final Intent result, final LocationView targetLocationView) {
final Cursor c = managedQuery(result.getData(), null, null, null, null); final Cursor c = managedQuery(result.getData(), null, null, null, null);
if (c.moveToFirst()) { if (c.moveToFirst()) {

View file

@ -30,7 +30,8 @@ import android.os.Bundle;
import android.os.Handler; import android.os.Handler;
import android.os.HandlerThread; import android.os.HandlerThread;
import android.os.Process; 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 androidx.core.content.ContextCompat;
import com.google.common.base.Throwables; import com.google.common.base.Throwables;
import de.schildbach.oeffi.Constants; import de.schildbach.oeffi.Constants;
@ -58,8 +59,7 @@ import org.slf4j.LoggerFactory;
import javax.net.ssl.SSLException; import javax.net.ssl.SSLException;
import java.util.Set; import java.util.Set;
public class DirectionsShortcutActivity extends OeffiActivity public class DirectionsShortcutActivity extends OeffiActivity implements LocationHelper.Callback {
implements ActivityCompat.OnRequestPermissionsResultCallback, LocationHelper.Callback {
public static final String INTENT_EXTRA_NETWORK = "network"; public static final String INTENT_EXTRA_NETWORK = "network";
public static final String INTENT_EXTRA_TYPE = "type"; public static final String INTENT_EXTRA_TYPE = "type";
public static final String INTENT_EXTRA_ID = "stationid"; public static final String INTENT_EXTRA_ID = "stationid";
@ -76,10 +76,16 @@ public class DirectionsShortcutActivity extends OeffiActivity
private final Handler handler = new Handler(); private final Handler handler = new Handler();
private QueryTripsRunnable queryTripsRunnable; private QueryTripsRunnable queryTripsRunnable;
private static final int REQUEST_CODE_REQUEST_LOCATION_PERMISSION = 1;
private static final Logger log = LoggerFactory.getLogger(DirectionsShortcutActivity.class); private static final Logger log = LoggerFactory.getLogger(DirectionsShortcutActivity.class);
private final ActivityResultLauncher<String> requestPermissionLauncher =
registerForActivityResult(new ActivityResultContracts.RequestPermission(), granted -> {
if (granted)
maybeStartLocation();
else
errorDialog(R.string.acquire_location_no_permission);
});
@Override @Override
protected void onCreate(final Bundle savedInstanceState) { protected void onCreate(final Bundle savedInstanceState) {
super.onCreate(savedInstanceState); super.onCreate(savedInstanceState);
@ -94,8 +100,7 @@ public class DirectionsShortcutActivity extends OeffiActivity
Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED) Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED)
maybeStartLocation(); maybeStartLocation();
else else
ActivityCompat.requestPermissions(this, new String[] { Manifest.permission.ACCESS_FINE_LOCATION }, requestPermissionLauncher.launch(Manifest.permission.ACCESS_FINE_LOCATION);
REQUEST_CODE_REQUEST_LOCATION_PERMISSION);
} }
@Override @Override
@ -105,17 +110,6 @@ public class DirectionsShortcutActivity extends OeffiActivity
super.onDestroy(); 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() { public void maybeStartLocation() {
if (ContextCompat.checkSelfPermission(this, if (ContextCompat.checkSelfPermission(this,
Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED) Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED)

View file

@ -40,7 +40,8 @@ import android.view.View;
import android.widget.LinearLayout; import android.widget.LinearLayout;
import android.widget.TextView; import android.widget.TextView;
import androidx.activity.ComponentActivity; 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.core.content.ContextCompat;
import androidx.recyclerview.widget.LinearLayoutManager; import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView; import androidx.recyclerview.widget.RecyclerView;
@ -75,8 +76,8 @@ import java.util.List;
import java.util.Locale; import java.util.Locale;
import java.util.Map; import java.util.Map;
public class NetworkPickerActivity extends ComponentActivity implements ActivityCompat.OnRequestPermissionsResultCallback, public class NetworkPickerActivity extends ComponentActivity implements LocationHelper.Callback, NetworkClickListener,
LocationHelper.Callback, NetworkClickListener, NetworkContextMenuItemListener { NetworkContextMenuItemListener {
public static void start(final Context context) { public static void start(final Context context) {
final Intent intent = new Intent(context, NetworkPickerActivity.class); final Intent intent = new Intent(context, NetworkPickerActivity.class);
context.startActivity(intent); 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 String INDEX_FILENAME = "networks.txt";
private static final int MAX_LAST_NETWORKS = 3; 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 static final Logger log = LoggerFactory.getLogger(NetworkPickerActivity.class);
private final ActivityResultLauncher<String> requestPermissionLauncher =
registerForActivityResult(new ActivityResultContracts.RequestPermission(), granted -> {
maybeStartLocation();
});
@Override @Override
protected void onCreate(final Bundle savedInstanceState) { protected void onCreate(final Bundle savedInstanceState) {
super.onCreate(savedInstanceState); super.onCreate(savedInstanceState);
@ -195,8 +199,7 @@ public class NetworkPickerActivity extends ComponentActivity implements Activity
if (ContextCompat.checkSelfPermission(this, if (ContextCompat.checkSelfPermission(this,
Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED)
ActivityCompat.requestPermissions(this, new String[] { Manifest.permission.ACCESS_COARSE_LOCATION }, requestPermissionLauncher.launch(Manifest.permission.ACCESS_COARSE_LOCATION);
REQUEST_CODE_REQUEST_LOCATION_PERMISSION);
} }
@Override @Override
@ -233,13 +236,6 @@ public class NetworkPickerActivity extends ComponentActivity implements Activity
super.onDestroy(); 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() { public void maybeStartLocation() {
if (ContextCompat.checkSelfPermission(this, if (ContextCompat.checkSelfPermission(this,
Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED)

View file

@ -33,8 +33,9 @@ import android.net.Uri;
import android.os.Bundle; import android.os.Bundle;
import android.view.View; import android.view.View;
import android.widget.TextView; import android.widget.TextView;
import androidx.activity.result.ActivityResultLauncher;
import androidx.activity.result.contract.ActivityResultContracts;
import androidx.annotation.Nullable; import androidx.annotation.Nullable;
import androidx.core.app.ActivityCompat;
import androidx.core.content.ContextCompat; import androidx.core.content.ContextCompat;
import androidx.core.content.pm.ShortcutInfoCompat; import androidx.core.content.pm.ShortcutInfoCompat;
import androidx.core.content.pm.ShortcutManagerCompat; import androidx.core.content.pm.ShortcutManagerCompat;
@ -66,8 +67,8 @@ import org.slf4j.LoggerFactory;
import java.io.File; import java.io.File;
import java.net.HttpURLConnection; import java.net.HttpURLConnection;
public class PlansPickerActivity extends OeffiMainActivity implements ActivityCompat.OnRequestPermissionsResultCallback, public class PlansPickerActivity extends OeffiMainActivity implements LocationHelper.Callback, PlanClickListener,
LocationHelper.Callback, PlanClickListener, PlanContextMenuItemListener { PlanContextMenuItemListener {
private ConnectivityManager connectivityManager; private ConnectivityManager connectivityManager;
private LocationHelper locationHelper; private LocationHelper locationHelper;
@ -84,11 +85,15 @@ public class PlansPickerActivity extends OeffiMainActivity implements ActivityCo
private Cursor cursor; 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 int THUMB_CACHE_SIZE = 2 * 1024 * 1024;
private static final Logger log = LoggerFactory.getLogger(PlansPickerActivity.class); private static final Logger log = LoggerFactory.getLogger(PlansPickerActivity.class);
private final ActivityResultLauncher<String> requestPermissionLauncher =
registerForActivityResult(new ActivityResultContracts.RequestPermission(), granted -> {
maybeStartLocation();
});
@Override @Override
protected String taskName() { protected String taskName() {
return "plans"; return "plans";
@ -154,8 +159,7 @@ public class PlansPickerActivity extends OeffiMainActivity implements ActivityCo
if (ContextCompat.checkSelfPermission(this, if (ContextCompat.checkSelfPermission(this,
Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED)
ActivityCompat.requestPermissions(this, new String[] { Manifest.permission.ACCESS_COARSE_LOCATION }, requestPermissionLauncher.launch(Manifest.permission.ACCESS_COARSE_LOCATION);
REQUEST_CODE_REQUEST_LOCATION_PERMISSION);
} }
@Override @Override
@ -186,13 +190,6 @@ public class PlansPickerActivity extends OeffiMainActivity implements ActivityCo
super.onDestroy(); 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() { public void maybeStartLocation() {
if (ContextCompat.checkSelfPermission(this, if (ContextCompat.checkSelfPermission(this,
Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED)

View file

@ -22,18 +22,27 @@ import android.content.pm.PackageManager;
import android.os.Build; import android.os.Build;
import android.os.Bundle; import android.os.Bundle;
import androidx.activity.ComponentActivity; 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.core.content.ContextCompat;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import java.util.Arrays;
import java.util.LinkedList; import java.util.LinkedList;
import java.util.List; import java.util.List;
import java.util.Map;
public class NearestFavoriteStationsWidgetPermissionActivity extends ComponentActivity { public class NearestFavoriteStationsWidgetPermissionActivity extends ComponentActivity {
private static final Logger log = LoggerFactory.getLogger(NearestFavoriteStationsWidgetPermissionActivity.class); private static final Logger log = LoggerFactory.getLogger(NearestFavoriteStationsWidgetPermissionActivity.class);
private final ActivityResultLauncher<String[]> requestPermissionsLauncher =
registerForActivityResult(new ActivityResultContracts.RequestMultiplePermissions(), results -> {
for (Map.Entry<String, Boolean> entry : results.entrySet())
log.info("{} {}", entry.getKey(), entry.getValue() ? "granted" : "denied");
NearestFavoriteStationWidgetService.scheduleImmediate(this); // refresh app-widget
finish();
});
@Override @Override
protected void onCreate(final Bundle savedInstanceState) { protected void onCreate(final Bundle savedInstanceState) {
super.onCreate(savedInstanceState); super.onCreate(savedInstanceState);
@ -44,16 +53,6 @@ public class NearestFavoriteStationsWidgetPermissionActivity extends ComponentAc
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.R || permissions.isEmpty()) if (Build.VERSION.SDK_INT < Build.VERSION_CODES.R || permissions.isEmpty())
permissions.add(Manifest.permission.ACCESS_BACKGROUND_LOCATION); permissions.add(Manifest.permission.ACCESS_BACKGROUND_LOCATION);
log.info("Requesting permissions: {}", permissions); log.info("Requesting permissions: {}", permissions);
ActivityCompat.requestPermissions(this, permissions.toArray(new String[0]), 0); requestPermissionsLauncher.launch(permissions.toArray(new String[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();
} }
} }

View file

@ -53,8 +53,9 @@ import android.view.ViewGroup;
import android.widget.Button; import android.widget.Button;
import android.widget.TextView; import android.widget.TextView;
import android.widget.ViewAnimator; import android.widget.ViewAnimator;
import androidx.activity.result.ActivityResultLauncher;
import androidx.activity.result.contract.ActivityResultContracts;
import androidx.annotation.Nullable; import androidx.annotation.Nullable;
import androidx.core.app.ActivityCompat;
import androidx.core.content.ContextCompat; import androidx.core.content.ContextCompat;
import androidx.recyclerview.widget.ItemTouchHelper; import androidx.recyclerview.widget.ItemTouchHelper;
import androidx.recyclerview.widget.LinearLayoutManager; import androidx.recyclerview.widget.LinearLayoutManager;
@ -116,7 +117,7 @@ import java.util.Map;
import java.util.Set; import java.util.Set;
public class StationsActivity extends OeffiMainActivity implements StationsAware, LocationAware, public class StationsActivity extends OeffiMainActivity implements StationsAware, LocationAware,
ActivityCompat.OnRequestPermissionsResultCallback, StationContextMenuItemListener { StationContextMenuItemListener {
private ConnectivityManager connectivityManager; private ConnectivityManager connectivityManager;
private LocationManager locationManager; private LocationManager locationManager;
private SensorManager sensorManager; private SensorManager sensorManager;
@ -160,6 +161,11 @@ public class StationsActivity extends OeffiMainActivity implements StationsAware
private static final Logger log = LoggerFactory.getLogger(StationsActivity.class); private static final Logger log = LoggerFactory.getLogger(StationsActivity.class);
private final ActivityResultLauncher<String> requestPermissionLauncher =
registerForActivityResult(new ActivityResultContracts.RequestPermission(), granted -> {
startLocationProvider();
});
@Override @Override
protected String taskName() { protected String taskName() {
return "stations"; return "stations";
@ -244,8 +250,7 @@ public class StationsActivity extends OeffiMainActivity implements StationsAware
final Button locationPermissionRequestButton = findViewById( final Button locationPermissionRequestButton = findViewById(
R.id.stations_location_permission_request_button); R.id.stations_location_permission_request_button);
locationPermissionRequestButton.setOnClickListener(v -> ActivityCompat.requestPermissions(StationsActivity.this, locationPermissionRequestButton.setOnClickListener(v -> requestPermissionLauncher.launch(Manifest.permission.ACCESS_FINE_LOCATION));
new String[] { Manifest.permission.ACCESS_FINE_LOCATION }, 0));
final Button locationSettingsButton = findViewById(R.id.stations_list_location_settings); final Button locationSettingsButton = findViewById(R.id.stations_list_location_settings);
locationSettingsButton.setOnClickListener(v -> startActivity(new Intent(Settings.ACTION_LOCATION_SOURCE_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; 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, public boolean onStationContextMenuItemClick(final int adapterPosition, final NetworkId network,
final Location station, final @Nullable List<Departure> departures, final int menuItemId) { final Location station, final @Nullable List<Departure> departures, final int menuItemId) {
if (menuItemId == R.id.station_context_add_favorite) { if (menuItemId == R.id.station_context_add_favorite) {