From 48be5af55ff22c666a57fe2c2de10a147b6f7958 Mon Sep 17 00:00:00 2001 From: Daniel Gultsch Date: Wed, 16 Mar 2016 10:46:33 +0100 Subject: reworked sharewith activity to stay open during sharing closing the activity prematuraly caused uri permissions to be revoked --- .../siacs/conversations/ui/ShareWithActivity.java | 95 +++++++++++++++------- .../eu/siacs/conversations/ui/XmppActivity.java | 1 + 2 files changed, 66 insertions(+), 30 deletions(-) (limited to 'src/main/java/eu/siacs/conversations') diff --git a/src/main/java/eu/siacs/conversations/ui/ShareWithActivity.java b/src/main/java/eu/siacs/conversations/ui/ShareWithActivity.java index 09bbe0df..a710a558 100644 --- a/src/main/java/eu/siacs/conversations/ui/ShareWithActivity.java +++ b/src/main/java/eu/siacs/conversations/ui/ShareWithActivity.java @@ -17,17 +17,24 @@ import java.net.URLConnection; import java.util.ArrayList; import java.util.Iterator; import java.util.List; +import java.util.concurrent.atomic.AtomicInteger; import eu.siacs.conversations.Config; import eu.siacs.conversations.R; import eu.siacs.conversations.entities.Account; import eu.siacs.conversations.entities.Conversation; import eu.siacs.conversations.entities.Message; +import eu.siacs.conversations.services.XmppConnectionService; import eu.siacs.conversations.ui.adapter.ConversationAdapter; import eu.siacs.conversations.xmpp.jid.InvalidJidException; import eu.siacs.conversations.xmpp.jid.Jid; -public class ShareWithActivity extends XmppActivity { +public class ShareWithActivity extends XmppActivity implements XmppConnectionService.OnConversationUpdate { + + @Override + public void onConversationUpdate() { + refreshUi(); + } private class Share { public List uris = new ArrayList<>(); @@ -36,14 +43,17 @@ public class ShareWithActivity extends XmppActivity { public String contact; public String text; public String uuid; + public boolean multiple = false; } private Share share; private static final int REQUEST_START_NEW_CONVERSATION = 0x0501; private ListView mListView; + private ConversationAdapter mAdapter; private List mConversations = new ArrayList<>(); private Toast mToast; + private AtomicInteger attachmentCounter = new AtomicInteger(0); private UiCallback attachFileCallback = new UiCallback() { @@ -59,26 +69,52 @@ public class ShareWithActivity extends XmppActivity { runOnUiThread(new Runnable() { @Override public void run() { - if (mToast != null) { - mToast.cancel(); - } - if (share.uuid != null) { - mToast = Toast.makeText(getApplicationContext(), - getString(share.image ? R.string.shared_image_with_x : R.string.shared_file_with_x,message.getConversation().getName()), - Toast.LENGTH_SHORT); - mToast.show(); + if (attachmentCounter.decrementAndGet() <=0 ) { + int resId; + if (share.image && share.multiple) { + resId = R.string.shared_images_with_x; + } else if (share.image) { + resId = R.string.shared_image_with_x; + } else { + resId = R.string.shared_file_with_x; + } + replaceToast(getString(resId, message.getConversation().getName())); + if (share.uuid != null) { + finish(); + } else { + switchToConversation(message.getConversation()); + } } } }); } @Override - public void error(int errorCode, Message object) { - // TODO Auto-generated method stub - + public void error(final int errorCode, Message object) { + runOnUiThread(new Runnable() { + @Override + public void run() { + replaceToast(getString(errorCode)); + if (attachmentCounter.decrementAndGet() <=0 ) { + finish(); + } + } + }); } }; + protected void hideToast() { + if (mToast != null) { + mToast.cancel(); + } + } + + protected void replaceToast(String msg) { + hideToast(); + mToast = Toast.makeText(this, msg ,Toast.LENGTH_LONG); + mToast.show(); + } + protected void onActivityResult(int requestCode, int resultCode, final Intent data) { super.onActivityResult(requestCode, resultCode, data); if (requestCode == REQUEST_START_NEW_CONVERSATION @@ -107,8 +143,7 @@ public class ShareWithActivity extends XmppActivity { setTitle(getString(R.string.title_activity_sharewith)); mListView = (ListView) findViewById(R.id.choose_conversation_list); - ConversationAdapter mAdapter = new ConversationAdapter(this, - this.mConversations); + mAdapter = new ConversationAdapter(this, this.mConversations); mListView.setAdapter(mAdapter); mListView.setOnItemClickListener(new OnItemClickListener() { @@ -191,8 +226,7 @@ public class ShareWithActivity extends XmppActivity { share(); return; } - xmppConnectionService.populateWithOrderedConversations(mConversations, - this.share != null && this.share.uris.size() == 0); + refreshUiReal(); } private void share() { @@ -224,6 +258,7 @@ public class ShareWithActivity extends XmppActivity { } private void share(final Conversation conversation) { + mListView.setEnabled(false); if (conversation.getNextEncryption() == Message.ENCRYPTION_PGP && !hasPgp()) { if (share.uuid == null) { showInstallPgpDialog(); @@ -237,29 +272,21 @@ public class ShareWithActivity extends XmppActivity { OnPresenceSelected callback = new OnPresenceSelected() { @Override public void onPresenceSelected() { + attachmentCounter.set(share.uris.size()); if (share.image) { - mToast = Toast.makeText(getApplicationContext(), - getText(R.string.preparing_image), - Toast.LENGTH_LONG); - mToast.show(); + share.multiple = share.uris.size() > 1; + replaceToast(getString(share.multiple ? R.string.preparing_images : R.string.preparing_image)); for (Iterator i = share.uris.iterator(); i.hasNext(); i.remove()) { ShareWithActivity.this.xmppConnectionService .attachImageToConversation(conversation, i.next(), attachFileCallback); } } else { - mToast = Toast.makeText(getApplicationContext(), - getText(R.string.preparing_file), - Toast.LENGTH_LONG); - mToast.show(); + replaceToast(getString(R.string.preparing_file)); ShareWithActivity.this.xmppConnectionService .attachFileToConversation(conversation, share.uris.get(0), attachFileCallback); } - if (share.uuid == null) { - switchToConversation(conversation, null, true); - } - finish(); } }; if (conversation.getAccount().httpUploadAvailable()) { @@ -269,13 +296,21 @@ public class ShareWithActivity extends XmppActivity { } } else { switchToConversation(conversation, this.share.text, true); - finish(); } } public void refreshUiReal() { - //nothing to do. This Activity doesn't implement any listeners + xmppConnectionService.populateWithOrderedConversations(mConversations, this.share != null && this.share.uris.size() == 0); + mAdapter.notifyDataSetChanged(); } + @Override + public void onBackPressed() { + if (attachmentCounter.get() >= 1) { + replaceToast(getString(R.string.sharing_files_please_wait)); + } else { + super.onBackPressed(); + } + } } diff --git a/src/main/java/eu/siacs/conversations/ui/XmppActivity.java b/src/main/java/eu/siacs/conversations/ui/XmppActivity.java index baf40b22..c7bf738c 100644 --- a/src/main/java/eu/siacs/conversations/ui/XmppActivity.java +++ b/src/main/java/eu/siacs/conversations/ui/XmppActivity.java @@ -1174,6 +1174,7 @@ public abstract class XmppActivity extends Activity { } else { if (cancelPotentialWork(message, imageView)) { imageView.setBackgroundColor(0xff333333); + imageView.setImageDrawable(null); final BitmapWorkerTask task = new BitmapWorkerTask(imageView); final AsyncDrawable asyncDrawable = new AsyncDrawable( getResources(), null, task); -- cgit v1.2.3