Tusky icon indicating copy to clipboard operation
Tusky copied to clipboard

Refactor permissions requests to use ActivityResultContract

Open cbeyls opened this issue 2 months ago • 0 comments

The app currently uses a custom callback system for requesting permissions, located in BaseActivity. This code doesn't work when the activity gets re-created before the permission is granted: the callback will be lost with the Activity and no action will be performed after the permission is granted.

To avoid these issues while still simplifying the code, Google recommends to use the ActivityResultContract APIs to request permissions, which allow to register persistent callbacks. This pull request removes the legacy API and replaces the calls with registerForActivityResult(ActivityResultContracts.RequestPermission()).

  • ActivityResultContracts.RequestPermission will check if the permission is already granted and call the callback synchronously when possible. So this check doesn't need to be performed anymore.
  • In SearchStatusesFragment and SFragment, the download action to launch after granting the permission requires an argument (a list of media URLs). This argument is temporarily stored in a Fragment field and saved and restored as part of the instance state, so the action can properly resume after an Activity re-creation.

cbeyls avatar Apr 23 '24 14:04 cbeyls