refactored how view intents are handled

Daniel Gultsch created

processing view intents before saved instance caused troubles when the activity was destroyed
fixes #1969

Change summary

src/main/java/eu/siacs/conversations/entities/Conversation.java        |  4 
src/main/java/eu/siacs/conversations/services/NotificationService.java | 35 
src/main/java/eu/siacs/conversations/ui/ConversationActivity.java      | 33 
src/main/java/eu/siacs/conversations/ui/XmppActivity.java              |  3 
4 files changed, 36 insertions(+), 39 deletions(-)

Detailed changes

src/main/java/eu/siacs/conversations/entities/Conversation.java 🔗

@@ -158,9 +158,9 @@ public class Conversation extends AbstractEntity implements Blockable, Comparabl
 	public Message findMessageWithFileAndUuid(final String uuid) {
 		synchronized (this.messages) {
 			for (final Message message : this.messages) {
-				if ((message.getType() == Message.TYPE_IMAGE || message.getType() == Message.TYPE_FILE)
+				if (message.getUuid().equals(uuid)
 						&& message.getEncryption() != Message.ENCRYPTION_PGP
-						&& message.getUuid().equals(uuid)) {
+						&& (message.getType() == Message.TYPE_IMAGE || message.getType() == Message.TYPE_FILE || message.treatAsDownloadable() != Message.Decision.NEVER)) {
 					return message;
 				}
 			}

src/main/java/eu/siacs/conversations/services/NotificationService.java 🔗

@@ -374,8 +374,10 @@ public class NotificationService {
 
 	private Message getFirstDownloadableMessage(final Iterable<Message> messages) {
 		for (final Message message : messages) {
-			if ((message.getType() == Message.TYPE_FILE || message.getType() == Message.TYPE_IMAGE) &&
-					message.getTransferable() != null) {
+			if (message.getTransferable() != null
+					&& (message.getType() == Message.TYPE_FILE
+							|| message.getType() == Message.TYPE_IMAGE
+							|| message.treatAsDownloadable() != Message.Decision.NEVER)) {
 				return message;
 			}
 		}
@@ -413,28 +415,23 @@ public class NotificationService {
 	}
 
 	private PendingIntent createContentIntent(final String conversationUuid, final String downloadMessageUuid) {
-		final TaskStackBuilder stackBuilder = TaskStackBuilder
-				.create(mXmppConnectionService);
-		stackBuilder.addParentStack(ConversationActivity.class);
-
-		final Intent viewConversationIntent = new Intent(mXmppConnectionService,
-				ConversationActivity.class);
-		if (downloadMessageUuid != null) {
-			viewConversationIntent.setAction(ConversationActivity.ACTION_DOWNLOAD);
-		} else {
-			viewConversationIntent.setAction(Intent.ACTION_VIEW);
-		}
+		final Intent viewConversationIntent = new Intent(mXmppConnectionService,ConversationActivity.class);
+		viewConversationIntent.setAction(ConversationActivity.ACTION_VIEW_CONVERSATION);
 		if (conversationUuid != null) {
 			viewConversationIntent.putExtra(ConversationActivity.CONVERSATION, conversationUuid);
-			viewConversationIntent.setType(ConversationActivity.VIEW_CONVERSATION);
 		}
 		if (downloadMessageUuid != null) {
-			viewConversationIntent.putExtra(ConversationActivity.MESSAGE, downloadMessageUuid);
+			viewConversationIntent.putExtra(ConversationActivity.EXTRA_DOWNLOAD_UUID, downloadMessageUuid);
+			return PendingIntent.getActivity(mXmppConnectionService,
+					57,
+					viewConversationIntent,
+					PendingIntent.FLAG_UPDATE_CURRENT);
+		} else {
+			return PendingIntent.getActivity(mXmppConnectionService,
+					58,
+					viewConversationIntent,
+					PendingIntent.FLAG_UPDATE_CURRENT);
 		}
-
-		stackBuilder.addNextIntent(viewConversationIntent);
-
-		return stackBuilder.getPendingIntent(0, PendingIntent.FLAG_UPDATE_CURRENT);
 	}
 
 	private PendingIntent createDownloadIntent(final Message message) {

src/main/java/eu/siacs/conversations/ui/ConversationActivity.java 🔗

@@ -69,11 +69,9 @@ import eu.siacs.conversations.xmpp.jid.Jid;
 public class ConversationActivity extends XmppActivity
 	implements OnAccountUpdate, OnConversationUpdate, OnRosterUpdate, OnUpdateBlocklist, XmppConnectionService.OnShowErrorToast {
 
-	public static final String ACTION_DOWNLOAD = "eu.siacs.conversations.action.DOWNLOAD";
-
-	public static final String VIEW_CONVERSATION = "viewConversation";
+	public static final String ACTION_VIEW_CONVERSATION = "eu.siacs.conversations.action.VIEW";
 	public static final String CONVERSATION = "conversationUuid";
-	public static final String MESSAGE = "messageUuid";
+	public static final String EXTRA_DOWNLOAD_UUID = "eu.siacs.conversations.download_uuid";
 	public static final String TEXT = "text";
 	public static final String NICK = "nick";
 	public static final String PRIVATE_MESSAGE = "pm";
@@ -1040,13 +1038,14 @@ public class ConversationActivity extends XmppActivity
 
 	@Override
 	protected void onNewIntent(final Intent intent) {
-		if (xmppConnectionServiceBound) {
-			if (intent != null && VIEW_CONVERSATION.equals(intent.getType())) {
+		if (intent != null && ACTION_VIEW_CONVERSATION.equals(intent.getAction())) {
+			mOpenConverstaion = null;
+			if (xmppConnectionServiceBound) {
 				handleViewConversationIntent(intent);
-				setIntent(new Intent());
+				intent.setAction(Intent.ACTION_MAIN);
+			} else {
+				setIntent(intent);
 			}
-		} else {
-			setIntent(intent);
 		}
 	}
 
@@ -1128,6 +1127,8 @@ public class ConversationActivity extends XmppActivity
 			mPendingConferenceInvite = null;
 		}
 
+		final Intent intent = getIntent();
+
 		if (xmppConnectionService.getAccounts().size() == 0) {
 			if (mRedirected.compareAndSet(false, true)) {
 				if (Config.X509_VERIFICATION) {
@@ -1143,17 +1144,14 @@ public class ConversationActivity extends XmppActivity
 			if (mRedirected.compareAndSet(false, true)) {
 				Account pendingAccount = xmppConnectionService.getPendingAccount();
 				if (pendingAccount == null) {
-					Intent intent = new Intent(this, StartConversationActivity.class);
+					Intent startConversationActivity = new Intent(this, StartConversationActivity.class);
 					intent.putExtra("init", true);
-					startActivity(intent);
+					startActivity(startConversationActivity);
 				} else {
 					switchToAccount(pendingAccount, true);
 				}
 				finish();
 			}
-		} else if (getIntent() != null && VIEW_CONVERSATION.equals(getIntent().getType())) {
-			clearPending();
-			handleViewConversationIntent(getIntent());
 		} else if (selectConversationByUuid(mOpenConverstaion)) {
 			if (mPanelOpen) {
 				showConversationsOverview();
@@ -1165,6 +1163,10 @@ public class ConversationActivity extends XmppActivity
 			}
 			this.mConversationFragment.reInit(getSelectedConversation());
 			mOpenConverstaion = null;
+		} else if (intent != null && ACTION_VIEW_CONVERSATION.equals(intent.getAction())) {
+			clearPending();
+			handleViewConversationIntent(intent);
+			intent.setAction(Intent.ACTION_MAIN);
 		} else if (getSelectedConversation() == null) {
 			showConversationsOverview();
 			clearPending();
@@ -1200,12 +1202,11 @@ public class ConversationActivity extends XmppActivity
 		if (!ExceptionHelper.checkForCrash(this, this.xmppConnectionService)) {
 			openBatteryOptimizationDialogIfNeeded();
 		}
-		setIntent(new Intent());
 	}
 
 	private void handleViewConversationIntent(final Intent intent) {
 		final String uuid = intent.getStringExtra(CONVERSATION);
-		final String downloadUuid = intent.getStringExtra(MESSAGE);
+		final String downloadUuid = intent.getStringExtra(EXTRA_DOWNLOAD_UUID);
 		final String text = intent.getStringExtra(TEXT);
 		final String nick = intent.getStringExtra(NICK);
 		final boolean pm = intent.getBooleanExtra(PRIVATE_MESSAGE, false);

src/main/java/eu/siacs/conversations/ui/XmppActivity.java 🔗

@@ -471,7 +471,7 @@ public abstract class XmppActivity extends Activity {
 	private void switchToConversation(Conversation conversation, String text, String nick, boolean pm, boolean newTask) {
 		Intent viewConversationIntent = new Intent(this,
 				ConversationActivity.class);
-		viewConversationIntent.setAction(Intent.ACTION_VIEW);
+		viewConversationIntent.setAction(ConversationActivity.ACTION_VIEW_CONVERSATION);
 		viewConversationIntent.putExtra(ConversationActivity.CONVERSATION,
 				conversation.getUuid());
 		if (text != null) {
@@ -481,7 +481,6 @@ public abstract class XmppActivity extends Activity {
 			viewConversationIntent.putExtra(ConversationActivity.NICK, nick);
 			viewConversationIntent.putExtra(ConversationActivity.PRIVATE_MESSAGE,pm);
 		}
-		viewConversationIntent.setType(ConversationActivity.VIEW_CONVERSATION);
 		if (newTask) {
 			viewConversationIntent.setFlags(viewConversationIntent.getFlags()
 					| Intent.FLAG_ACTIVITY_NEW_TASK