From 447236ee3817f379d6512df0780b820d1ccaa3ee Mon Sep 17 00:00:00 2001 From: Greyson Parrelli Date: Mon, 30 Sep 2019 15:19:06 -0400 Subject: [PATCH] Add logging to track down ConversationActivity crash. --- .../securesms/ConversationListActivity.java | 1 + .../ConversationListArchiveActivity.java | 1 + .../securesms/GroupCreateActivity.java | 1 + .../securesms/NewConversationActivity.java | 1 + .../RecipientPreferenceActivity.java | 3 +- .../thoughtcrime/securesms/ShareActivity.java | 1 + .../securesms/ShortcutLauncherActivity.java | 3 +- .../securesms/SmsSendtoActivity.java | 2 +- .../SharedContactDetailsActivity.java | 3 +- .../conversation/ConversationActivity.java | 70 ++++++++++++++++++- .../conversation/ConversationFragment.java | 2 +- .../ConversationPopupActivity.java | 1 + .../notifications/MessageNotifier.java | 1 + .../notifications/NotificationItem.java | 1 + .../notifications/NotificationState.java | 1 + .../securesms/search/SearchFragment.java | 1 + .../securesms/util/CommunicationActions.java | 6 +- 17 files changed, 91 insertions(+), 8 deletions(-) diff --git a/src/org/thoughtcrime/securesms/ConversationListActivity.java b/src/org/thoughtcrime/securesms/ConversationListActivity.java index 9e31e25a12..c91edbb275 100644 --- a/src/org/thoughtcrime/securesms/ConversationListActivity.java +++ b/src/org/thoughtcrime/securesms/ConversationListActivity.java @@ -223,6 +223,7 @@ public class ConversationListActivity extends PassphraseRequiredActionBarActivit Intent intent = new Intent(this, ConversationActivity.class); intent.putExtra(ConversationActivity.RECIPIENT_EXTRA, recipient.getId()); + intent.putExtra(ConversationActivity.BREADCRUMB_EXTRA, ConversationActivity.Breadcrumb.CONVERSATION_LIST); intent.putExtra(ConversationActivity.THREAD_ID_EXTRA, threadId); intent.putExtra(ConversationActivity.DISTRIBUTION_TYPE_EXTRA, distributionType); intent.putExtra(ConversationActivity.TIMING_EXTRA, System.currentTimeMillis()); diff --git a/src/org/thoughtcrime/securesms/ConversationListArchiveActivity.java b/src/org/thoughtcrime/securesms/ConversationListArchiveActivity.java index dcfeffb411..fa72b4762d 100644 --- a/src/org/thoughtcrime/securesms/ConversationListArchiveActivity.java +++ b/src/org/thoughtcrime/securesms/ConversationListArchiveActivity.java @@ -55,6 +55,7 @@ public class ConversationListArchiveActivity extends PassphraseRequiredActionBar public void onCreateConversation(long threadId, Recipient recipient, int distributionType, long lastSeenTime) { Intent intent = new Intent(this, ConversationActivity.class); intent.putExtra(ConversationActivity.RECIPIENT_EXTRA, recipient.getId()); + intent.putExtra(ConversationActivity.BREADCRUMB_EXTRA, ConversationActivity.Breadcrumb.ARCHIVE); intent.putExtra(ConversationActivity.THREAD_ID_EXTRA, threadId); intent.putExtra(ConversationActivity.IS_ARCHIVED_EXTRA, true); intent.putExtra(ConversationActivity.DISTRIBUTION_TYPE_EXTRA, distributionType); diff --git a/src/org/thoughtcrime/securesms/GroupCreateActivity.java b/src/org/thoughtcrime/securesms/GroupCreateActivity.java index 24b26815a5..72eacfa80a 100644 --- a/src/org/thoughtcrime/securesms/GroupCreateActivity.java +++ b/src/org/thoughtcrime/securesms/GroupCreateActivity.java @@ -262,6 +262,7 @@ public class GroupCreateActivity extends PassphraseRequiredActionBarActivity intent.putExtra(ConversationActivity.THREAD_ID_EXTRA, threadId); intent.putExtra(ConversationActivity.DISTRIBUTION_TYPE_EXTRA, ThreadDatabase.DistributionTypes.DEFAULT); intent.putExtra(ConversationActivity.RECIPIENT_EXTRA, recipient.getId()); + intent.putExtra(ConversationActivity.BREADCRUMB_EXTRA, ConversationActivity.Breadcrumb.GROUP_CREATE); startActivity(intent); finish(); } diff --git a/src/org/thoughtcrime/securesms/NewConversationActivity.java b/src/org/thoughtcrime/securesms/NewConversationActivity.java index a39dba25d3..3b76b3401b 100644 --- a/src/org/thoughtcrime/securesms/NewConversationActivity.java +++ b/src/org/thoughtcrime/securesms/NewConversationActivity.java @@ -54,6 +54,7 @@ public class NewConversationActivity extends ContactSelectionActivity Intent intent = new Intent(this, ConversationActivity.class); intent.putExtra(ConversationActivity.RECIPIENT_EXTRA, recipient.getId()); + intent.putExtra(ConversationActivity.BREADCRUMB_EXTRA, ConversationActivity.Breadcrumb.NEW_CONVERSATION); intent.putExtra(ConversationActivity.TEXT_EXTRA, getIntent().getStringExtra(ConversationActivity.TEXT_EXTRA)); intent.setDataAndType(getIntent().getData(), getIntent().getType()); diff --git a/src/org/thoughtcrime/securesms/RecipientPreferenceActivity.java b/src/org/thoughtcrime/securesms/RecipientPreferenceActivity.java index d3050c6fe0..6e14f5c17b 100644 --- a/src/org/thoughtcrime/securesms/RecipientPreferenceActivity.java +++ b/src/org/thoughtcrime/securesms/RecipientPreferenceActivity.java @@ -33,6 +33,7 @@ import org.thoughtcrime.securesms.contacts.avatars.ContactPhoto; import org.thoughtcrime.securesms.contacts.avatars.FallbackContactPhoto; import org.thoughtcrime.securesms.contacts.avatars.ProfileContactPhoto; import org.thoughtcrime.securesms.contacts.avatars.ResourceContactPhoto; +import org.thoughtcrime.securesms.conversation.ConversationActivity; import org.thoughtcrime.securesms.database.GroupDatabase; import org.thoughtcrime.securesms.jobs.RotateProfileKeyJob; import org.thoughtcrime.securesms.logging.Log; @@ -767,7 +768,7 @@ public class RecipientPreferenceActivity extends PassphraseRequiredActionBarActi @Override public void onMessageClicked() { - CommunicationActions.startConversation(getContext(), recipient.get(), null); + CommunicationActions.startConversation(getContext(), recipient.get(), null, ConversationActivity.Breadcrumb.RECIPIENT_PREFERENCE); } @Override diff --git a/src/org/thoughtcrime/securesms/ShareActivity.java b/src/org/thoughtcrime/securesms/ShareActivity.java index 9121c07b80..7bb36086e9 100644 --- a/src/org/thoughtcrime/securesms/ShareActivity.java +++ b/src/org/thoughtcrime/securesms/ShareActivity.java @@ -241,6 +241,7 @@ public class ShareActivity extends PassphraseRequiredActionBarActivity private void createConversation(long threadId, @NonNull RecipientId recipientId, int distributionType) { final Intent intent = getBaseShareIntent(ConversationActivity.class); intent.putExtra(ConversationActivity.RECIPIENT_EXTRA, recipientId); + intent.putExtra(ConversationActivity.BREADCRUMB_EXTRA, ConversationActivity.Breadcrumb.SHARE); intent.putExtra(ConversationActivity.THREAD_ID_EXTRA, threadId); intent.putExtra(ConversationActivity.DISTRIBUTION_TYPE_EXTRA, distributionType); diff --git a/src/org/thoughtcrime/securesms/ShortcutLauncherActivity.java b/src/org/thoughtcrime/securesms/ShortcutLauncherActivity.java index 19b5f10c41..d069a8ed3d 100644 --- a/src/org/thoughtcrime/securesms/ShortcutLauncherActivity.java +++ b/src/org/thoughtcrime/securesms/ShortcutLauncherActivity.java @@ -9,6 +9,7 @@ import androidx.core.app.TaskStackBuilder; import androidx.appcompat.app.AppCompatActivity; import android.widget.Toast; +import org.thoughtcrime.securesms.conversation.ConversationActivity; import org.thoughtcrime.securesms.recipients.Recipient; import org.thoughtcrime.securesms.recipients.RecipientId; import org.thoughtcrime.securesms.util.CommunicationActions; @@ -42,7 +43,7 @@ public class ShortcutLauncherActivity extends AppCompatActivity { TaskStackBuilder backStack = TaskStackBuilder.create(this) .addNextIntent(new Intent(this, ConversationListActivity.class)); - CommunicationActions.startConversation(this, recipient, null, backStack); + CommunicationActions.startConversation(this, recipient, null, ConversationActivity.Breadcrumb.SHORTCUT, backStack); finish(); } } diff --git a/src/org/thoughtcrime/securesms/SmsSendtoActivity.java b/src/org/thoughtcrime/securesms/SmsSendtoActivity.java index 75326ba5c8..1afb444ee6 100644 --- a/src/org/thoughtcrime/securesms/SmsSendtoActivity.java +++ b/src/org/thoughtcrime/securesms/SmsSendtoActivity.java @@ -54,7 +54,7 @@ public class SmsSendtoActivity extends Activity { nextIntent = new Intent(this, ConversationActivity.class); nextIntent.putExtra(ConversationActivity.TEXT_EXTRA, destination.getBody()); nextIntent.putExtra(ConversationActivity.THREAD_ID_EXTRA, threadId); - nextIntent.putExtra(ConversationActivity.RECIPIENT_EXTRA, recipient.getId()); + nextIntent.putExtra(ConversationActivity.RECIPIENT_EXTRA, ConversationActivity.Breadcrumb.SMS_SEND_TO); } return nextIntent; } diff --git a/src/org/thoughtcrime/securesms/contactshare/SharedContactDetailsActivity.java b/src/org/thoughtcrime/securesms/contactshare/SharedContactDetailsActivity.java index 352e69a6da..67239ef7c8 100644 --- a/src/org/thoughtcrime/securesms/contactshare/SharedContactDetailsActivity.java +++ b/src/org/thoughtcrime/securesms/contactshare/SharedContactDetailsActivity.java @@ -23,6 +23,7 @@ import com.bumptech.glide.load.engine.DiskCacheStrategy; import org.thoughtcrime.securesms.ApplicationContext; import org.thoughtcrime.securesms.PassphraseRequiredActionBarActivity; import org.thoughtcrime.securesms.R; +import org.thoughtcrime.securesms.conversation.ConversationActivity; import org.thoughtcrime.securesms.database.RecipientDatabase; import org.thoughtcrime.securesms.jobs.DirectoryRefreshJob; import org.thoughtcrime.securesms.mms.GlideApp; @@ -214,7 +215,7 @@ public class SharedContactDetailsActivity extends PassphraseRequiredActionBarAct messageButtonView.setOnClickListener(v -> { ContactUtil.selectRecipientThroughDialog(this, pushUsers, dynamicLanguage.getCurrentLocale(), recipient -> { - CommunicationActions.startConversation(this, recipient, null); + CommunicationActions.startConversation(this, recipient, null, ConversationActivity.Breadcrumb.SHARED_CONTACT_DETAILS); }); }); diff --git a/src/org/thoughtcrime/securesms/conversation/ConversationActivity.java b/src/org/thoughtcrime/securesms/conversation/ConversationActivity.java index 760dd46b58..957dba10a9 100644 --- a/src/org/thoughtcrime/securesms/conversation/ConversationActivity.java +++ b/src/org/thoughtcrime/securesms/conversation/ConversationActivity.java @@ -187,6 +187,7 @@ import org.thoughtcrime.securesms.recipients.LiveRecipient; import org.thoughtcrime.securesms.recipients.Recipient; import org.thoughtcrime.securesms.recipients.RecipientExporter; import org.thoughtcrime.securesms.recipients.RecipientFormattingException; +import org.thoughtcrime.securesms.recipients.RecipientId; import org.thoughtcrime.securesms.search.model.MessageResult; import org.thoughtcrime.securesms.service.KeyCachingService; import org.thoughtcrime.securesms.sms.MessageSender; @@ -257,7 +258,26 @@ public class ConversationActivity extends PassphraseRequiredActionBarActivity { private static final String TAG = ConversationActivity.class.getSimpleName(); + public static final class Breadcrumb { + public static final String SHORTCUT = "shortcut"; + public static final String SHARED_CONTACT = "shared_contact"; + public static final String SHARED_CONTACT_DETAILS = "shared_contact_details"; + public static final String RECIPIENT_PREFERENCE = "recipient_preference"; + public static final String CONVERSATION_LIST = "conversation_list"; + public static final String SHARE = "share"; + public static final String NOTIFICATION = "notification"; + public static final String SEARCH = "search"; + public static final String ARCHIVE = "archive"; + public static final String POPUP = "popup"; + public static final String GROUP_CREATE = "group_create"; + public static final String NOTIFIER = "notifier"; + public static final String NEW_CONVERSATION = "new_conversation"; + public static final String NOTIFICATION_STATE = "notification_state"; + public static final String SMS_SEND_TO = "sms_send_to"; + } + public static final String RECIPIENT_EXTRA = "recipient_id"; + public static final String BREADCRUMB_EXTRA = "breadcrumb"; public static final String THREAD_ID_EXTRA = "thread_id"; public static final String IS_ARCHIVED_EXTRA = "is_archived"; public static final String TEXT_EXTRA = "draft_text"; @@ -1577,7 +1597,7 @@ public class ConversationActivity extends PassphraseRequiredActionBarActivity } private void initializeResources() { - recipient = Recipient.live(getIntent().getParcelableExtra(RECIPIENT_EXTRA)); + recipient = Recipient.live(getRecipientFromIntentOrThrow(getIntent())); threadId = getIntent().getLongExtra(THREAD_ID_EXTRA, -1); archived = getIntent().getBooleanExtra(IS_ARCHIVED_EXTRA, false); distributionType = getIntent().getIntExtra(DISTRIBUTION_TYPE_EXTRA, ThreadDatabase.DistributionTypes.DEFAULT); @@ -1656,6 +1676,36 @@ public class ConversationActivity extends PassphraseRequiredActionBarActivity }); } + private RecipientId getRecipientFromIntentOrThrow(@NonNull Intent intent) { + RecipientId id = intent.getParcelableExtra(RECIPIENT_EXTRA); + String source = intent.getStringExtra(BREADCRUMB_EXTRA); + + Log.d(TAG, "Breadcrumb: " + source); + + if (id == null) { + switch (source) { + case Breadcrumb.SHORTCUT: throw new ShortcutBreadcrumbError(); + case Breadcrumb.SHARED_CONTACT: throw new SharedContactBreadcrumbError(); + case Breadcrumb.SHARED_CONTACT_DETAILS: throw new SharedContactDetailsBreadcrumbError(); + case Breadcrumb.RECIPIENT_PREFERENCE: throw new RecipientPreferenceBreadcrumbError(); + case Breadcrumb.CONVERSATION_LIST: throw new ConversationListBreadcrumbError(); + case Breadcrumb.SHARE: throw new ShareBreadcrumbError(); + case Breadcrumb.NOTIFICATION: throw new NotificationBreadcrumbError(); + case Breadcrumb.SEARCH: throw new SearchBreadcrumbError(); + case Breadcrumb.ARCHIVE: throw new ArchiveBreadcrumbError(); + case Breadcrumb.POPUP: throw new PopupBreadcrumbError(); + case Breadcrumb.GROUP_CREATE: throw new GroupCreateBreadcrumbError(); + case Breadcrumb.NOTIFIER: throw new NotifierBreadcrumbError(); + case Breadcrumb.NEW_CONVERSATION: throw new NewConversationBreadcrumbError(); + case Breadcrumb.NOTIFICATION_STATE: throw new NotificationStateBreadcrumbError(); + case Breadcrumb.SMS_SEND_TO: throw new SmsSendToBreadcrumbError(); + default: throw new NullBreadcrumbError(); + } + } + + return id; + } + private void showStickerIntroductionTooltip() { TextSecurePreferences.setMediaKeyboardMode(this, MediaKeyboardMode.STICKER); inputPanel.setMediaKeyboardToggleMode(true); @@ -2811,4 +2861,22 @@ public class ConversationActivity extends PassphraseRequiredActionBarActivity } } } + + + private static final class ShortcutBreadcrumbError extends Error { } + private static final class SharedContactBreadcrumbError extends Error { } + private static final class SharedContactDetailsBreadcrumbError extends Error { } + private static final class RecipientPreferenceBreadcrumbError extends Error { } + private static final class ConversationListBreadcrumbError extends Error { } + private static final class ShareBreadcrumbError extends Error { } + private static final class NotificationBreadcrumbError extends Error { } + private static final class SearchBreadcrumbError extends Error { } + private static final class ArchiveBreadcrumbError extends Error { } + private static final class PopupBreadcrumbError extends Error { } + private static final class GroupCreateBreadcrumbError extends Error { } + private static final class NotifierBreadcrumbError extends Error { } + private static final class NewConversationBreadcrumbError extends Error { } + private static final class NotificationStateBreadcrumbError extends Error { } + private static final class SmsSendToBreadcrumbError extends Error { } + private static final class NullBreadcrumbError extends Error { } } diff --git a/src/org/thoughtcrime/securesms/conversation/ConversationFragment.java b/src/org/thoughtcrime/securesms/conversation/ConversationFragment.java index d9a8ca71c6..fd697ac8ee 100644 --- a/src/org/thoughtcrime/securesms/conversation/ConversationFragment.java +++ b/src/org/thoughtcrime/securesms/conversation/ConversationFragment.java @@ -1072,7 +1072,7 @@ public class ConversationFragment extends Fragment if (getContext() == null) return; ContactUtil.selectRecipientThroughDialog(getContext(), choices, locale, recipient -> { - CommunicationActions.startConversation(getContext(), recipient, null); + CommunicationActions.startConversation(getContext(), recipient, null, ConversationActivity.Breadcrumb.SHARED_CONTACT); }); } diff --git a/src/org/thoughtcrime/securesms/conversation/ConversationPopupActivity.java b/src/org/thoughtcrime/securesms/conversation/ConversationPopupActivity.java index 1c4455de47..c840ca0fdc 100644 --- a/src/org/thoughtcrime/securesms/conversation/ConversationPopupActivity.java +++ b/src/org/thoughtcrime/securesms/conversation/ConversationPopupActivity.java @@ -85,6 +85,7 @@ public class ConversationPopupActivity extends ConversationActivity { ActivityOptionsCompat transition = ActivityOptionsCompat.makeScaleUpAnimation(getWindow().getDecorView(), 0, 0, getWindow().getAttributes().width, getWindow().getAttributes().height); Intent intent = new Intent(ConversationPopupActivity.this, ConversationActivity.class); intent.putExtra(ConversationActivity.RECIPIENT_EXTRA, getRecipient().getId()); + intent.putExtra(ConversationActivity.BREADCRUMB_EXTRA, ConversationActivity.Breadcrumb.POPUP); intent.putExtra(ConversationActivity.THREAD_ID_EXTRA, result); startActivity(intent, transition.toBundle()); diff --git a/src/org/thoughtcrime/securesms/notifications/MessageNotifier.java b/src/org/thoughtcrime/securesms/notifications/MessageNotifier.java index 713e160c00..098cca7e27 100644 --- a/src/org/thoughtcrime/securesms/notifications/MessageNotifier.java +++ b/src/org/thoughtcrime/securesms/notifications/MessageNotifier.java @@ -111,6 +111,7 @@ public class MessageNotifier { } else { Intent intent = new Intent(context, ConversationActivity.class); intent.putExtra(ConversationActivity.RECIPIENT_EXTRA, recipient.getId()); + intent.putExtra(ConversationActivity.BREADCRUMB_EXTRA, ConversationActivity.Breadcrumb.NOTIFIER); intent.putExtra(ConversationActivity.THREAD_ID_EXTRA, threadId); intent.setData((Uri.parse("custom://" + System.currentTimeMillis()))); diff --git a/src/org/thoughtcrime/securesms/notifications/NotificationItem.java b/src/org/thoughtcrime/securesms/notifications/NotificationItem.java index 987c7f593e..a1b806b886 100644 --- a/src/org/thoughtcrime/securesms/notifications/NotificationItem.java +++ b/src/org/thoughtcrime/securesms/notifications/NotificationItem.java @@ -71,6 +71,7 @@ public class NotificationItem { Recipient notifyRecipients = threadRecipient != null ? threadRecipient : conversationRecipient; intent.putExtra(ConversationActivity.RECIPIENT_EXTRA, notifyRecipients.getId()); + intent.putExtra(ConversationActivity.BREADCRUMB_EXTRA, ConversationActivity.Breadcrumb.NOTIFICATION); intent.putExtra("thread_id", threadId); intent.setData((Uri.parse("custom://"+System.currentTimeMillis()))); diff --git a/src/org/thoughtcrime/securesms/notifications/NotificationState.java b/src/org/thoughtcrime/securesms/notifications/NotificationState.java index 48b3e3d584..6e445bdf81 100644 --- a/src/org/thoughtcrime/securesms/notifications/NotificationState.java +++ b/src/org/thoughtcrime/securesms/notifications/NotificationState.java @@ -169,6 +169,7 @@ public class NotificationState { Intent intent = new Intent(context, ConversationPopupActivity.class); intent.putExtra(ConversationActivity.RECIPIENT_EXTRA, recipient.getId()); + intent.putExtra(ConversationActivity.BREADCRUMB_EXTRA, ConversationActivity.Breadcrumb.NOTIFICATION_STATE); intent.putExtra(ConversationActivity.THREAD_ID_EXTRA, (long)threads.toArray()[0]); intent.setData((Uri.parse("custom://"+System.currentTimeMillis()))); diff --git a/src/org/thoughtcrime/securesms/search/SearchFragment.java b/src/org/thoughtcrime/securesms/search/SearchFragment.java index 5fd57053c5..b71dfb6eca 100644 --- a/src/org/thoughtcrime/securesms/search/SearchFragment.java +++ b/src/org/thoughtcrime/securesms/search/SearchFragment.java @@ -137,6 +137,7 @@ public class SearchFragment extends Fragment implements SearchListAdapter.EventL public void onContactClicked(@NonNull Recipient contact) { Intent intent = new Intent(getContext(), ConversationActivity.class); intent.putExtra(ConversationActivity.RECIPIENT_EXTRA, contact.getId()); + intent.putExtra(ConversationActivity.BREADCRUMB_EXTRA, ConversationActivity.Breadcrumb.SEARCH); long existingThread = DatabaseFactory.getThreadDatabase(getContext()).getThreadIdIfExistsFor(contact); diff --git a/src/org/thoughtcrime/securesms/util/CommunicationActions.java b/src/org/thoughtcrime/securesms/util/CommunicationActions.java index c34814f10f..816a8a0196 100644 --- a/src/org/thoughtcrime/securesms/util/CommunicationActions.java +++ b/src/org/thoughtcrime/securesms/util/CommunicationActions.java @@ -53,13 +53,14 @@ public class CommunicationActions { .execute(); } - public static void startConversation(@NonNull Context context, @NonNull Recipient recipient, @Nullable String text) { - startConversation(context, recipient, text, null); + public static void startConversation(@NonNull Context context, @NonNull Recipient recipient, @Nullable String text, @NonNull String breadcrumb) { + startConversation(context, recipient, text, breadcrumb, null); } public static void startConversation(@NonNull Context context, @NonNull Recipient recipient, @Nullable String text, + @NonNull String breadcrumb, @Nullable TaskStackBuilder backStack) { new AsyncTask() { @@ -72,6 +73,7 @@ public class CommunicationActions { protected void onPostExecute(Long threadId) { Intent intent = new Intent(context, ConversationActivity.class); intent.putExtra(ConversationActivity.RECIPIENT_EXTRA, recipient.getId()); + intent.putExtra(ConversationActivity.BREADCRUMB_EXTRA, breadcrumb); intent.putExtra(ConversationActivity.THREAD_ID_EXTRA, threadId); intent.putExtra(ConversationActivity.TIMING_EXTRA, System.currentTimeMillis());