request storage permission when needed on Android 6.0
This commit is contained in:
parent
739a2d609d
commit
c3e8fb3446
|
@ -182,7 +182,7 @@ public class HttpDownloadConnection implements Transferable {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
file.setExpectedSize(size);
|
file.setExpectedSize(size);
|
||||||
if (size <= mHttpConnectionManager.getAutoAcceptFileSize()) {
|
if (mHttpConnectionManager.hasStoragePermission() && size <= mHttpConnectionManager.getAutoAcceptFileSize()) {
|
||||||
HttpDownloadConnection.this.acceptedAutomatically = true;
|
HttpDownloadConnection.this.acceptedAutomatically = true;
|
||||||
new Thread(new FileDownloader(interactive)).start();
|
new Thread(new FileDownloader(interactive)).start();
|
||||||
} else {
|
} else {
|
||||||
|
|
|
@ -1,6 +1,9 @@
|
||||||
package eu.siacs.conversations.services;
|
package eu.siacs.conversations.services;
|
||||||
|
|
||||||
|
import android.Manifest;
|
||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
|
import android.content.pm.PackageManager;
|
||||||
|
import android.os.Build;
|
||||||
import android.os.PowerManager;
|
import android.os.PowerManager;
|
||||||
import android.util.Log;
|
import android.util.Log;
|
||||||
import android.util.Pair;
|
import android.util.Pair;
|
||||||
|
@ -51,6 +54,14 @@ public class AbstractConnectionManager {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public boolean hasStoragePermission() {
|
||||||
|
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
|
||||||
|
return mXmppConnectionService.checkSelfPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED;
|
||||||
|
} else {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public static Pair<InputStream,Integer> createInputStream(DownloadableFile file, boolean gcm) throws FileNotFoundException {
|
public static Pair<InputStream,Integer> createInputStream(DownloadableFile file, boolean gcm) throws FileNotFoundException {
|
||||||
FileInputStream is;
|
FileInputStream is;
|
||||||
int size;
|
int size;
|
||||||
|
|
|
@ -1,5 +1,6 @@
|
||||||
package eu.siacs.conversations.ui;
|
package eu.siacs.conversations.ui;
|
||||||
|
|
||||||
|
import android.Manifest;
|
||||||
import android.annotation.SuppressLint;
|
import android.annotation.SuppressLint;
|
||||||
import android.app.ActionBar;
|
import android.app.ActionBar;
|
||||||
import android.app.AlertDialog;
|
import android.app.AlertDialog;
|
||||||
|
@ -10,6 +11,7 @@ import android.content.DialogInterface;
|
||||||
import android.content.DialogInterface.OnClickListener;
|
import android.content.DialogInterface.OnClickListener;
|
||||||
import android.content.Intent;
|
import android.content.Intent;
|
||||||
import android.content.IntentSender.SendIntentException;
|
import android.content.IntentSender.SendIntentException;
|
||||||
|
import android.content.pm.PackageManager;
|
||||||
import android.net.Uri;
|
import android.net.Uri;
|
||||||
import android.os.Build;
|
import android.os.Build;
|
||||||
import android.os.Bundle;
|
import android.os.Bundle;
|
||||||
|
@ -49,6 +51,7 @@ import eu.siacs.conversations.entities.Blockable;
|
||||||
import eu.siacs.conversations.entities.Contact;
|
import eu.siacs.conversations.entities.Contact;
|
||||||
import eu.siacs.conversations.entities.Conversation;
|
import eu.siacs.conversations.entities.Conversation;
|
||||||
import eu.siacs.conversations.entities.Message;
|
import eu.siacs.conversations.entities.Message;
|
||||||
|
import eu.siacs.conversations.entities.Transferable;
|
||||||
import eu.siacs.conversations.services.XmppConnectionService;
|
import eu.siacs.conversations.services.XmppConnectionService;
|
||||||
import eu.siacs.conversations.services.XmppConnectionService.OnAccountUpdate;
|
import eu.siacs.conversations.services.XmppConnectionService.OnAccountUpdate;
|
||||||
import eu.siacs.conversations.services.XmppConnectionService.OnConversationUpdate;
|
import eu.siacs.conversations.services.XmppConnectionService.OnConversationUpdate;
|
||||||
|
@ -77,6 +80,7 @@ public class ConversationActivity extends XmppActivity
|
||||||
public static final int REQUEST_ENCRYPT_MESSAGE = 0x0207;
|
public static final int REQUEST_ENCRYPT_MESSAGE = 0x0207;
|
||||||
public static final int REQUEST_TRUST_KEYS_TEXT = 0x0208;
|
public static final int REQUEST_TRUST_KEYS_TEXT = 0x0208;
|
||||||
public static final int REQUEST_TRUST_KEYS_MENU = 0x0209;
|
public static final int REQUEST_TRUST_KEYS_MENU = 0x0209;
|
||||||
|
public static final int REQUEST_START_DOWNLOAD = 0x0210;
|
||||||
public static final int ATTACHMENT_CHOICE_CHOOSE_IMAGE = 0x0301;
|
public static final int ATTACHMENT_CHOICE_CHOOSE_IMAGE = 0x0301;
|
||||||
public static final int ATTACHMENT_CHOICE_TAKE_PHOTO = 0x0302;
|
public static final int ATTACHMENT_CHOICE_TAKE_PHOTO = 0x0302;
|
||||||
public static final int ATTACHMENT_CHOICE_CHOOSE_FILE = 0x0303;
|
public static final int ATTACHMENT_CHOICE_CHOOSE_FILE = 0x0303;
|
||||||
|
@ -93,6 +97,7 @@ public class ConversationActivity extends XmppActivity
|
||||||
final private List<Uri> mPendingFileUris = new ArrayList<>();
|
final private List<Uri> mPendingFileUris = new ArrayList<>();
|
||||||
private Uri mPendingGeoUri = null;
|
private Uri mPendingGeoUri = null;
|
||||||
private boolean forbidProcessingPendings = false;
|
private boolean forbidProcessingPendings = false;
|
||||||
|
private Message mPendingDownloadableMessage = null;
|
||||||
|
|
||||||
private boolean conversationWasSelectedByKeyboard = false;
|
private boolean conversationWasSelectedByKeyboard = false;
|
||||||
|
|
||||||
|
@ -497,6 +502,11 @@ public class ConversationActivity extends XmppActivity
|
||||||
}
|
}
|
||||||
|
|
||||||
public void attachFile(final int attachmentChoice) {
|
public void attachFile(final int attachmentChoice) {
|
||||||
|
if (attachmentChoice != ATTACHMENT_CHOICE_LOCATION) {
|
||||||
|
if (!hasStoragePermission(attachmentChoice)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
switch (attachmentChoice) {
|
switch (attachmentChoice) {
|
||||||
case ATTACHMENT_CHOICE_LOCATION:
|
case ATTACHMENT_CHOICE_LOCATION:
|
||||||
getPreferences().edit().putString("recently_used_quick_action","location").apply();
|
getPreferences().edit().putString("recently_used_quick_action","location").apply();
|
||||||
|
@ -575,6 +585,50 @@ public class ConversationActivity extends XmppActivity
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public boolean hasStoragePermission(int attachmentChoice) {
|
||||||
|
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
|
||||||
|
if (checkSelfPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {
|
||||||
|
requestPermissions(new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, attachmentChoice);
|
||||||
|
return false;
|
||||||
|
} else {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults) {
|
||||||
|
if (grantResults.length > 0)
|
||||||
|
if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {
|
||||||
|
if (requestCode == REQUEST_START_DOWNLOAD) {
|
||||||
|
if (this.mPendingDownloadableMessage != null) {
|
||||||
|
startDownloadable(this.mPendingDownloadableMessage);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
attachFile(requestCode);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
Toast.makeText(this,R.string.no_storage_permission,Toast.LENGTH_SHORT).show();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void startDownloadable(Message message) {
|
||||||
|
if (!hasStoragePermission(ConversationActivity.REQUEST_START_DOWNLOAD)) {
|
||||||
|
this.mPendingDownloadableMessage = message;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
Transferable transferable = message.getTransferable();
|
||||||
|
if (transferable != null) {
|
||||||
|
if (!transferable.start()) {
|
||||||
|
Toast.makeText(this, R.string.not_connected_try_again,Toast.LENGTH_SHORT).show();
|
||||||
|
}
|
||||||
|
} else if (message.treatAsDownloadable() != Message.Decision.NEVER) {
|
||||||
|
xmppConnectionService.getHttpConnectionManager().createNewDownloadConnection(message, true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean onOptionsItemSelected(final MenuItem item) {
|
public boolean onOptionsItemSelected(final MenuItem item) {
|
||||||
if (item.getItemId() == android.R.id.home) {
|
if (item.getItemId() == android.R.id.home) {
|
||||||
|
@ -1176,7 +1230,7 @@ public class ConversationActivity extends XmppActivity
|
||||||
if (downloadUuid != null) {
|
if (downloadUuid != null) {
|
||||||
final Message message = mSelectedConversation.findMessageWithFileAndUuid(downloadUuid);
|
final Message message = mSelectedConversation.findMessageWithFileAndUuid(downloadUuid);
|
||||||
if (message != null) {
|
if (message != null) {
|
||||||
mConversationFragment.messageListAdapter.startDownloadable(message);
|
startDownloadable(message);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -352,7 +352,7 @@ public class MessageAdapter extends ArrayAdapter<Message> {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onClick(View v) {
|
public void onClick(View v) {
|
||||||
startDownloadable(message);
|
activity.startDownloadable(message);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
viewHolder.download_button.setOnLongClickListener(openContextMenu);
|
viewHolder.download_button.setOnLongClickListener(openContextMenu);
|
||||||
|
@ -602,18 +602,6 @@ public class MessageAdapter extends ArrayAdapter<Message> {
|
||||||
return view;
|
return view;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void startDownloadable(Message message) {
|
|
||||||
Transferable transferable = message.getTransferable();
|
|
||||||
if (transferable != null) {
|
|
||||||
if (!transferable.start()) {
|
|
||||||
Toast.makeText(activity, R.string.not_connected_try_again,
|
|
||||||
Toast.LENGTH_SHORT).show();
|
|
||||||
}
|
|
||||||
} else if (message.treatAsDownloadable() != Message.Decision.NEVER) {
|
|
||||||
activity.xmppConnectionService.getHttpConnectionManager().createNewDownloadConnection(message, true);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public void openDownloadable(Message message) {
|
public void openDownloadable(Message message) {
|
||||||
DownloadableFile file = activity.xmppConnectionService.getFileBackend().getFile(message);
|
DownloadableFile file = activity.xmppConnectionService.getFileBackend().getFile(message);
|
||||||
if (!file.exists()) {
|
if (!file.exists()) {
|
||||||
|
|
|
@ -361,7 +361,8 @@ public class JingleConnection implements Transferable {
|
||||||
message.setBody(Long.toString(size));
|
message.setBody(Long.toString(size));
|
||||||
conversation.add(message);
|
conversation.add(message);
|
||||||
mXmppConnectionService.updateConversationUi();
|
mXmppConnectionService.updateConversationUi();
|
||||||
if (size < this.mJingleConnectionManager.getAutoAcceptFileSize()) {
|
if (mJingleConnectionManager.hasStoragePermission()
|
||||||
|
&& size < this.mJingleConnectionManager.getAutoAcceptFileSize()) {
|
||||||
Log.d(Config.LOGTAG, "auto accepting file from "+ packet.getFrom());
|
Log.d(Config.LOGTAG, "auto accepting file from "+ packet.getFrom());
|
||||||
this.acceptedAutomatically = true;
|
this.acceptedAutomatically = true;
|
||||||
this.sendAccept();
|
this.sendAccept();
|
||||||
|
|
|
@ -557,4 +557,5 @@
|
||||||
</plurals>
|
</plurals>
|
||||||
<string name="shared_file_with_x">Shared file with %s</string>
|
<string name="shared_file_with_x">Shared file with %s</string>
|
||||||
<string name="shared_image_with_x">Shared image with %s</string>
|
<string name="shared_image_with_x">Shared image with %s</string>
|
||||||
|
<string name="no_storage_permission">Conversations need access to external storage</string>
|
||||||
</resources>
|
</resources>
|
||||||
|
|
Loading…
Reference in a new issue