fix downloading media on Android 5 (#1206)
This commit is contained in:
		
					parent
					
						
							
								e7afa0362b
							
						
					
				
			
			
				commit
				
					
						5aa3f958a8
					
				
			
		
					 3 changed files with 28 additions and 35 deletions
				
			
		|  | @ -25,7 +25,6 @@ import android.graphics.BitmapFactory; | |||
| import android.graphics.Color; | ||||
| import android.graphics.PorterDuff; | ||||
| import android.graphics.drawable.Drawable; | ||||
| import android.os.Build; | ||||
| import android.os.Bundle; | ||||
| import android.preference.PreferenceManager; | ||||
| import android.util.Log; | ||||
|  | @ -48,6 +47,7 @@ import java.util.List; | |||
| 
 | ||||
| import javax.inject.Inject; | ||||
| 
 | ||||
| import androidx.annotation.NonNull; | ||||
| import androidx.annotation.Nullable; | ||||
| import androidx.annotation.StringRes; | ||||
| import androidx.appcompat.app.AlertDialog; | ||||
|  | @ -65,7 +65,6 @@ public abstract class BaseActivity extends AppCompatActivity implements Injectab | |||
|     @Inject | ||||
|     public AccountManager accountManager; | ||||
| 
 | ||||
|     protected static final int BUILD_VERSION_ANY = -1; | ||||
|     private static final int REQUESTER_NONE = Integer.MAX_VALUE; | ||||
|     private HashMap<Integer, PermissionRequester> requesters; | ||||
| 
 | ||||
|  | @ -227,42 +226,41 @@ public abstract class BaseActivity extends AppCompatActivity implements Injectab | |||
|         adapter.addAll(accounts); | ||||
| 
 | ||||
|         new AlertDialog.Builder(this) | ||||
|             .setTitle(dialogTitle) | ||||
|             .setAdapter(adapter, (dialogInterface, index) -> listener.onAccountSelected(accounts.get(index))) | ||||
|             .show(); | ||||
|                 .setTitle(dialogTitle) | ||||
|                 .setAdapter(adapter, (dialogInterface, index) -> listener.onAccountSelected(accounts.get(index))) | ||||
|                 .show(); | ||||
|     } | ||||
| 
 | ||||
|     @Override | ||||
|     public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) { | ||||
|     public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { | ||||
|         if (requesters.containsKey(requestCode)) { | ||||
|             PermissionRequester requester = requesters.remove(requestCode); | ||||
|             requester.onRequestPermissionsResult(permissions, grantResults); | ||||
|         } | ||||
|     } | ||||
| 
 | ||||
|     public void requestPermissions(String[] permissions, int minimumBuildVersion, PermissionRequester requester) { | ||||
|         if (minimumBuildVersion == BUILD_VERSION_ANY || Build.VERSION.SDK_INT >= minimumBuildVersion) { | ||||
|             ArrayList<String> permissionsToRequest = new ArrayList<>(); | ||||
|             for(String permission: permissions) { | ||||
|                 if (ContextCompat.checkSelfPermission(this, permission) != PackageManager.PERMISSION_GRANTED) { | ||||
|                     permissionsToRequest.add(permission); | ||||
|                 } | ||||
|     public void requestPermissions(String[] permissions, PermissionRequester requester) { | ||||
|         ArrayList<String> permissionsToRequest = new ArrayList<>(); | ||||
|         for(String permission: permissions) { | ||||
|             if (ContextCompat.checkSelfPermission(this, permission) != PackageManager.PERMISSION_GRANTED) { | ||||
|                 permissionsToRequest.add(permission); | ||||
|             } | ||||
|             if (permissionsToRequest.isEmpty()) { | ||||
|                 int[] permissionsAlreadyGranted = new int[permissions.length]; | ||||
|                 for (int i = 0; i < permissionsAlreadyGranted.length; ++i) | ||||
|                     permissionsAlreadyGranted[i] = PackageManager.PERMISSION_GRANTED; | ||||
|                 requester.onRequestPermissionsResult(permissions, permissionsAlreadyGranted); | ||||
|                 return; | ||||
|             } | ||||
| 
 | ||||
|             int newKey = requester == null ? REQUESTER_NONE : requesters.size(); | ||||
|             if (newKey != REQUESTER_NONE) { | ||||
|                 requesters.put(newKey, requester); | ||||
|             } | ||||
|             String[] permissionsCopy = new String[permissionsToRequest.size()]; | ||||
|             permissionsToRequest.toArray(permissionsCopy); | ||||
|             ActivityCompat.requestPermissions(this, permissionsCopy, newKey); | ||||
|         } | ||||
|         if (permissionsToRequest.isEmpty()) { | ||||
|             int[] permissionsAlreadyGranted = new int[permissions.length]; | ||||
|             for (int i = 0; i < permissionsAlreadyGranted.length; ++i) | ||||
|                 permissionsAlreadyGranted[i] = PackageManager.PERMISSION_GRANTED; | ||||
|             requester.onRequestPermissionsResult(permissions, permissionsAlreadyGranted); | ||||
|             return; | ||||
|         } | ||||
| 
 | ||||
|         int newKey = requester == null ? REQUESTER_NONE : requesters.size(); | ||||
|         if (newKey != REQUESTER_NONE) { | ||||
|             requesters.put(newKey, requester); | ||||
|         } | ||||
|         String[] permissionsCopy = new String[permissionsToRequest.size()]; | ||||
|         permissionsToRequest.toArray(permissionsCopy); | ||||
|         ActivityCompat.requestPermissions(this, permissionsCopy, newKey); | ||||
| 
 | ||||
|     } | ||||
| } | ||||
|  |  | |||
|  | @ -27,7 +27,6 @@ import android.content.pm.PackageManager | |||
| import android.graphics.Bitmap | ||||
| import android.graphics.Color | ||||
| import android.net.Uri | ||||
| import android.os.Build | ||||
| import android.os.Bundle | ||||
| import android.os.Environment | ||||
| import androidx.core.content.FileProvider | ||||
|  | @ -217,7 +216,7 @@ class ViewMediaActivity : BaseActivity(), ViewImageFragment.PhotoActionsListener | |||
|     } | ||||
| 
 | ||||
|     private fun requestDownloadMedia() { | ||||
|         requestPermissions(arrayOf(Manifest.permission.WRITE_EXTERNAL_STORAGE), Build.VERSION_CODES.M) { _, grantResults -> | ||||
|         requestPermissions(arrayOf(Manifest.permission.WRITE_EXTERNAL_STORAGE)) { _, grantResults -> | ||||
|             if (grantResults.isNotEmpty() && grantResults[0] == PackageManager.PERMISSION_GRANTED) { | ||||
|                 downloadMedia() | ||||
|             } else { | ||||
|  |  | |||
|  | @ -23,7 +23,6 @@ import android.content.Context; | |||
| import android.content.Intent; | ||||
| import android.content.pm.PackageManager; | ||||
| import android.net.Uri; | ||||
| import android.os.Build; | ||||
| import android.os.Environment; | ||||
| import android.text.SpannableStringBuilder; | ||||
| import android.text.Spanned; | ||||
|  | @ -77,7 +76,6 @@ public abstract class SFragment extends BaseFragment implements Injectable { | |||
|     protected abstract void onReblog(final boolean reblog, final int position); | ||||
| 
 | ||||
|     private BottomSheetActivity bottomSheetActivity; | ||||
|     private Status pendingDownloadStatus; | ||||
| 
 | ||||
|     @Inject | ||||
|     public MastodonApi mastodonApi; | ||||
|  | @ -403,7 +401,6 @@ public abstract class SFragment extends BaseFragment implements Injectable { | |||
|     } | ||||
| 
 | ||||
|     private void downloadAllMedia(Status status) { | ||||
|         pendingDownloadStatus = null; | ||||
|         Toast.makeText(getContext(), R.string.downloading_media, Toast.LENGTH_SHORT).show(); | ||||
|         for(Attachment attachment: status.getAttachments()) { | ||||
|             String url = attachment.getUrl(); | ||||
|  | @ -418,9 +415,8 @@ public abstract class SFragment extends BaseFragment implements Injectable { | |||
|     } | ||||
| 
 | ||||
|     private void requestDownloadAllMedia(Status status) { | ||||
|         pendingDownloadStatus = status; | ||||
|         String[] permissions = new String[]{ Manifest.permission.WRITE_EXTERNAL_STORAGE }; | ||||
|         ((BaseActivity)getActivity()).requestPermissions(permissions, Build.VERSION_CODES.M, (permissions1, grantResults) -> { | ||||
|         ((BaseActivity)getActivity()).requestPermissions(permissions, (permissions1, grantResults) -> { | ||||
|             if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) { | ||||
|                 downloadAllMedia(status); | ||||
|             } else { | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue