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.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<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,
@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<String> requestLocationPermissionLauncher;
private final int pickContactRequestCode;
private final int pickStationRequestCode;
public LocationContextMenuItemClickListener(final LocationView locationView,
final int locationPermissionRequestCode,
final ActivityResultLauncher<String> 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()) {

View file

@ -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<String> 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)

View file

@ -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<String> 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)

View file

@ -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<String> 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)

View file

@ -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<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
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]));
}
}

View file

@ -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<String> 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<Departure> departures, final int menuItemId) {
if (menuItemId == R.id.station_context_add_favorite) {