diff --git a/AndroidManifest.xml b/AndroidManifest.xml index 4fae69184..fe5b4449a 100644 --- a/AndroidManifest.xml +++ b/AndroidManifest.xml @@ -162,8 +162,17 @@ + diff --git a/androidTest/com/b44t/messenger/uibenchmarks/EnterChatsBenchmark.java b/androidTest/com/b44t/messenger/uibenchmarks/EnterChatsBenchmark.java index f47ca71b9..756b711cb 100644 --- a/androidTest/com/b44t/messenger/uibenchmarks/EnterChatsBenchmark.java +++ b/androidTest/com/b44t/messenger/uibenchmarks/EnterChatsBenchmark.java @@ -10,6 +10,7 @@ import androidx.test.filters.LargeTest; import com.b44t.messenger.TestUtils; import org.junit.After; +import org.junit.Ignore; import org.junit.Rule; import org.junit.Test; import org.junit.runner.RunWith; @@ -25,7 +26,7 @@ import static androidx.test.espresso.matcher.ViewMatchers.withHint; import static androidx.test.espresso.matcher.ViewMatchers.withId; import static androidx.test.espresso.matcher.ViewMatchers.withText; - +@Ignore("This is not a test, but a benchmark. Remove the @Ignore to run it.") @RunWith(AndroidJUnit4.class) @LargeTest public class EnterChatsBenchmark { diff --git a/androidTest/com/b44t/messenger/uitests/offline/ForwardingTest.java b/androidTest/com/b44t/messenger/uitests/offline/ForwardingTest.java index 14108a951..9b7755dbd 100644 --- a/androidTest/com/b44t/messenger/uitests/offline/ForwardingTest.java +++ b/androidTest/com/b44t/messenger/uitests/offline/ForwardingTest.java @@ -88,9 +88,6 @@ public class ForwardingTest { onView(withText(android.R.string.ok)).perform(click()); onView(withId(R.id.title)).check(matches(withText("group"))); - pressBack(); - onView(withId(R.id.title)).check(matches(withText(R.string.saved_messages))); - pressBack(); onView(withId(R.id.toolbar_title)).check(matches(withText(R.string.connectivity_not_connected))); } diff --git a/androidTest/com/b44t/messenger/uitests/offline/SharingTest.java b/androidTest/com/b44t/messenger/uitests/offline/SharingTest.java index 7e8b38e4b..360bac152 100644 --- a/androidTest/com/b44t/messenger/uitests/offline/SharingTest.java +++ b/androidTest/com/b44t/messenger/uitests/offline/SharingTest.java @@ -22,6 +22,7 @@ import org.thoughtcrime.securesms.ConversationListActivity; import org.thoughtcrime.securesms.R; import org.thoughtcrime.securesms.ShareActivity; import org.thoughtcrime.securesms.connect.DcHelper; +import org.thoughtcrime.securesms.util.Util; import java.io.File; @@ -29,7 +30,9 @@ import static androidx.test.espresso.Espresso.onView; import static androidx.test.espresso.Espresso.pressBack; import static androidx.test.espresso.action.ViewActions.click; import static androidx.test.espresso.assertion.ViewAssertions.matches; +import static androidx.test.espresso.matcher.ViewMatchers.hasDescendant; import static androidx.test.espresso.matcher.ViewMatchers.isClickable; +import static androidx.test.espresso.matcher.ViewMatchers.withChild; import static androidx.test.espresso.matcher.ViewMatchers.withHint; import static androidx.test.espresso.matcher.ViewMatchers.withId; import static androidx.test.espresso.matcher.ViewMatchers.withText; @@ -46,6 +49,7 @@ public class SharingTest { @SuppressWarnings("unused") private final static String TAG = SharingTest.class.getSimpleName(); private static int createdGroupId; + private static int createdSingleChatId; @Rule public ActivityScenarioRule activityRule = TestUtils.getOfflineActivityRule(false); @@ -55,6 +59,14 @@ public class SharingTest { activityRule.getScenario().onActivity(a -> createdGroupId = DcHelper.getContext(a).createGroupChat(false, "group")); } + @Before + public void createSingleChat() { + activityRule.getScenario().onActivity(a -> { + int contactId = DcHelper.getContext(a).createContact("", "abc@example.org"); + createdSingleChatId = DcHelper.getContext(a).createChatByContactId(contactId); + }); + } + @Test public void testNormalSharing() { Intent i = new Intent(Intent.ACTION_SEND); @@ -71,7 +83,7 @@ public class SharingTest { /** * Test direct sharing from a screenshot. * Also, this is the regression test for https://github.com/deltachat/deltachat-android/issues/2040 - * where network changes during sharing lead to + * where network changes during sharing lead to a bug */ @Test public void testShareFromScreenshot() { @@ -112,7 +124,90 @@ public class SharingTest { onView(withId(R.id.fab)).check(matches(isClickable())); } - // TODO test other things from https://github.com/deltachat/interface/blob/master/user-testing/mailto-links.md + /** + * Tests https://github.com/deltachat/interface/blob/master/user-testing/mailto-links.md#mailto-links: + * + *
    + *
  • Just an email address - should open a chat with abc@example.org (and maybe ask whether a chat should be created if it does not exist already)
  • + *
  • email address with subject - should open a chat with abc@example.org and fill testing mailto uris; as we created the chat in the previous step, it should not ask Chat with … but directly open the chat
  • + *
  • email address with body - should open a chat with abc@example.org, draft this is a test
  • + *
  • email address with subject and body - should open a chat with abc@example.org, draft testing mailto uris <newline> this is a test
  • + *
  • HTML encoding - should open a chat with info@example.org
  • + *
  • more HTML encoding - should open a chat with simplebot@example.org, draft !web https://duckduckgo.com/lite?q=duck%20it
  • + *
  • no email, just subject&body - this should let you choose a chat and create a draft bla <newline> blub there
  • + *
+ */ + @Test + public void testShareFromLink() { + openLink("mailto:abc@example.org"); + onView(withId(R.id.subtitle)).check(matches(withText("abc@example.org"))); + + openLink("mailto:abc@example.org?subject=testing%20mailto%20uris"); + onView(withId(R.id.subtitle)).check(matches(withText("abc@example.org"))); + onView(withHint(R.string.chat_input_placeholder)).check(matches(withText("testing mailto uris"))); + + openLink("mailto:abc@example.org?body=this%20is%20a%20test"); + onView(withId(R.id.subtitle)).check(matches(withText("abc@example.org"))); + onView(withHint(R.string.chat_input_placeholder)).check(matches(withText("this is a test"))); + + openLink("mailto:abc@example.org?subject=testing%20mailto%20uris&body=this%20is%20a%20test"); + onView(withId(R.id.subtitle)).check(matches(withText("abc@example.org"))); + onView(withHint(R.string.chat_input_placeholder)).check(matches(withText("testing mailto uris\nthis is a test"))); + + openLink("mailto:%20abc@example.org"); + onView(withId(R.id.subtitle)).check(matches(withText("abc@example.org"))); + + openLink("mailto:abc@example.org?body=!web%20https%3A%2F%2Fduckduckgo.com%2Flite%3Fq%3Dduck%2520it"); + onView(withId(R.id.subtitle)).check(matches(withText("abc@example.org"))); + onView(withHint(R.string.chat_input_placeholder)).check(matches(withText("!web https://duckduckgo.com/lite?q=duck%20it"))); + + openLink("mailto:?subject=bla&body=blub"); + onView(withId(R.id.list)).perform(RecyclerViewActions.actionOnItem(hasDescendant(withText("abc@example.org")), click())); + onView(withId(R.id.subtitle)).check(matches(withText("abc@example.org"))); + onView(withHint(R.string.chat_input_placeholder)).check(matches(withText("bla\nblub"))); + } + + private void openLink(String link) { + Intent i = new Intent(Intent.ACTION_VIEW, Uri.parse(link)); + i.setPackage(getInstrumentation().getTargetContext().getPackageName()); + activityRule.getScenario().onActivity(a -> a.startActivity(i)); + } + + /** + *
    + *
  • Open Saved Messages chat (could be any other chat too)
  • + *
  • Go to another app and share some text to DC
  • + *
  • In DC select Saved Messages. Edit the shared text if you like. Don't hit the Send button.
  • + *
  • Leave DC
  • + *
  • Open DC again from the "Recent apps"
  • + *
  • Check that your draft is still there
  • + *
+ */ + @Test + public void testOpenAgainFromRecents() { + // Open a chat + onView(withId(R.id.list)).perform(RecyclerViewActions.actionOnItem(hasDescendant(withText("abc@example.org")), click())); + + // Share some text to DC + Intent i = new Intent(Intent.ACTION_SEND); + i.putExtra(Intent.EXTRA_TEXT, "Veeery important draft"); + i.setComponent(new ComponentName(getInstrumentation().getTargetContext().getApplicationContext(), ShareActivity.class)); + activityRule.getScenario().onActivity(a -> a.startActivity(i)); + + // In DC, select the same chat you opened before + onView(withId(R.id.list)).perform(RecyclerViewActions.actionOnItem(hasDescendant(withText("abc@example.org")), click())); + + // Leave DC and go back to the previous activity + pressBack(); + + // Here, we can't exactly replicate the "steps to reproduce". Previously, the other activity + // stayed open in the background, but since it doesn't anymore, we need to open it again: + onView(withId(R.id.list)).perform(RecyclerViewActions.actionOnItem(hasDescendant(withText("abc@example.org")), click())); + + // Check that the draft is still there + // Util.sleep(2000); // Uncomment for debugging + onView(withHint(R.string.chat_input_placeholder)).check(matches(withText("Veeery important draft"))); + } @After public void cleanup() { diff --git a/src/org/thoughtcrime/securesms/ConversationActivity.java b/src/org/thoughtcrime/securesms/ConversationActivity.java index 5ad9d5209..9dd4c7b8a 100644 --- a/src/org/thoughtcrime/securesms/ConversationActivity.java +++ b/src/org/thoughtcrime/securesms/ConversationActivity.java @@ -47,7 +47,6 @@ import android.view.View.OnFocusChangeListener; import android.view.View.OnKeyListener; import android.view.WindowManager; import android.view.inputmethod.EditorInfo; -import android.webkit.MimeTypeMap; import android.widget.ImageButton; import android.widget.ImageView; import android.widget.LinearLayout; @@ -132,11 +131,9 @@ import java.util.Date; import java.util.List; import java.util.concurrent.ExecutionException; -import static org.thoughtcrime.securesms.NewConversationActivity.MAILTO; import static org.thoughtcrime.securesms.TransportOption.Type; import static org.thoughtcrime.securesms.util.RelayUtil.getSharedText; import static org.thoughtcrime.securesms.util.RelayUtil.isForwarding; -import static org.thoughtcrime.securesms.util.RelayUtil.isRelayingMessageContent; import static org.thoughtcrime.securesms.util.RelayUtil.isSharing; /** @@ -175,17 +172,6 @@ public class ConversationActivity extends PassphraseRequiredActionBarActivity private static final int PICK_LOCATION = 9; // TODO: i think, this can be deleted private static final int SMS_DEFAULT = 11; // TODO: i think, this can be deleted - /** - * If the user opens a chat, goes to another app, and shares some content to the same chat, we will have two ConversationActivity's - * with the same chat (because sharing uses startActivityForResult() and all activities started this way will be created a second time, - * without affecting the existing activity). So, when the sharing ConversationActivity closes, it sets this variable to `true` so that - * the still-running-currently-in-background ConversationActivity re-initializes the draft. - * There is always only one still-running-currently-in-background ConversationActivity, which is the one started normally (i.e. with - * `startActivity()`). Therefore, after reinitializing the draft in one activity, we can safely set this variable to `false`. - * See https://github.com/deltachat/deltachat-android/pull/1770 - */ - private static boolean doReinitializeDraft; - private GlideRequests glideRequests; protected ComposeText composeText; private AnimatingToggle buttonToggle; @@ -214,8 +200,6 @@ public class ConversationActivity extends PassphraseRequiredActionBarActivity private final boolean isSecureText = true; private boolean isDefaultSms = true; private boolean isSecurityInitialized = false; - private boolean isShareDraftInitialized = false; - private boolean successfulForwardingAttempt = false; @@ -279,11 +263,7 @@ public class ConversationActivity extends PassphraseRequiredActionBarActivity eventCenter.addObserver(DcContext.DC_EVENT_MSG_DELIVERED, this); } - if (isForwarding(this)) { - handleForwarding(); - } else if (isSharing(this)) { - handleSharing(); - } + handleRelaying(); } @Override @@ -309,11 +289,23 @@ public class ConversationActivity extends PassphraseRequiredActionBarActivity } }); + handleRelaying(); + if (fragment != null) { fragment.onNewIntent(); } } + private void handleRelaying() { + if (isForwarding(this)) { + handleForwarding(); + } else if (isSharing(this)) { + handleSharing(); + } + + ConversationListRelayingActivity.finishActivity(); + } + @Override protected void onStart() { super.onStart(); @@ -333,11 +325,6 @@ public class ConversationActivity extends PassphraseRequiredActionBarActivity DcHelper.getNotificationCenter(this).updateVisibleChat(dcContext.getAccountId(), chatId); - if (doReinitializeDraft) { - initializeDraft(); - doReinitializeDraft = false; - } - attachmentManager.onResume(); } @@ -346,10 +333,6 @@ public class ConversationActivity extends PassphraseRequiredActionBarActivity super.onPause(); processComposeControls(ACTION_SAVE_DRAFT); - if (getCallingActivity() != null) { - // `getCallingActivity() != null` finds out whether the activity was started using `startActivityForResult()`. - doReinitializeDraft = true; - } DcHelper.getNotificationCenter(this).clearVisibleChat(); if (isFinishing()) overridePendingTransition(R.anim.fade_scale_in, R.anim.slide_to_right); @@ -439,7 +422,6 @@ public class ConversationActivity extends PassphraseRequiredActionBarActivity break; case ScribbleActivity.SCRIBBLE_REQUEST_CODE: setMedia(data.getData(), MediaType.IMAGE); - doReinitializeDraft = false; break; case SMS_DEFAULT: initializeSecurity(isSecureText, isDefaultSms); @@ -614,17 +596,6 @@ public class ConversationActivity extends PassphraseRequiredActionBarActivity } private void handleReturnToConversationList(@Nullable Bundle extras) { - if (isRelayingMessageContent(this) || successfulForwardingAttempt) { - if (isSharing(this)) { - // we're allowing only 1 try to share, going back to the conversation list will - // close the conversation list in activtyForResult() as well, so that the user - // comes back to the external app's share menu - setResult(RESULT_OK); - } - finish(); - return; - } - boolean archived = getIntent().getBooleanExtra(FROM_ARCHIVED_CHATS_EXTRA, false); Intent intent = new Intent(this, (archived ? ConversationListArchiveActivity.class : ConversationListActivity.class)); intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); @@ -749,12 +720,7 @@ public class ConversationActivity extends PassphraseRequiredActionBarActivity } else { dcContext.setDraft(chatId, SendRelayedMessageUtil.createMessage(this, uriList.get(0), getSharedText(this))); } - initializeDraft().addListener(new AssertedSuccessListener() { - @Override - public void onSuccess(Boolean result) { - isShareDraftInitialized = true; - } - }); + initializeDraft(); } } @@ -1209,11 +1175,6 @@ public class ConversationActivity extends PassphraseRequiredActionBarActivity fragment.scrollToBottom(); attachmentManager.cleanup(); - - if (isShareDraftInitialized) { - isShareDraftInitialized = false; - setResult(RESULT_OK); - } } diff --git a/src/org/thoughtcrime/securesms/ConversationFragment.java b/src/org/thoughtcrime/securesms/ConversationFragment.java index 9d04444e8..cf425f15d 100644 --- a/src/org/thoughtcrime/securesms/ConversationFragment.java +++ b/src/org/thoughtcrime/securesms/ConversationFragment.java @@ -281,6 +281,9 @@ public class ConversationFragment extends MessageSelectorFragment ConversationAdapter adapter = new ConversationAdapter(getActivity(), this.recipient.getChat(), GlideApp.with(this), locale, selectionClickListener, this.recipient); list.setAdapter(adapter); + if (dateDecoration != null) { + list.removeItemDecoration(dateDecoration); + } dateDecoration = new StickyHeaderDecoration(adapter, false, false); list.addItemDecoration(dateDecoration); @@ -295,11 +298,11 @@ public class ConversationFragment extends MessageSelectorFragment reloadList(); updateLocationButton(); + if (lastSeenDecoration != null) { + list.removeItemDecoration(lastSeenDecoration); + } if (freshMsgs > 0) { getListAdapter().setLastSeenPosition(freshMsgs - 1); - if (lastSeenDecoration != null) { - list.removeItemDecoration(lastSeenDecoration); - } lastSeenDecoration = new ConversationAdapter.LastSeenHeader(getListAdapter()); list.addItemDecoration(lastSeenDecoration); } diff --git a/src/org/thoughtcrime/securesms/ConversationListActivity.java b/src/org/thoughtcrime/securesms/ConversationListActivity.java index 673ccd7de..b0ff91553 100644 --- a/src/org/thoughtcrime/securesms/ConversationListActivity.java +++ b/src/org/thoughtcrime/securesms/ConversationListActivity.java @@ -19,7 +19,6 @@ package org.thoughtcrime.securesms; import static org.thoughtcrime.securesms.ConversationActivity.CHAT_ID_EXTRA; import static org.thoughtcrime.securesms.ConversationActivity.STARTING_POSITION_EXTRA; import static org.thoughtcrime.securesms.map.MapDataManager.ALL_CHATS_GLOBAL_MAP; -import static org.thoughtcrime.securesms.util.RelayUtil.REQUEST_RELAY; import static org.thoughtcrime.securesms.util.RelayUtil.acquireRelayMessageContent; import static org.thoughtcrime.securesms.util.RelayUtil.getDirectSharingChatId; import static org.thoughtcrime.securesms.util.RelayUtil.isDirectSharing; @@ -66,6 +65,7 @@ import org.thoughtcrime.securesms.util.DynamicLanguage; import org.thoughtcrime.securesms.util.DynamicNoActionBarTheme; import org.thoughtcrime.securesms.util.DynamicTheme; import org.thoughtcrime.securesms.util.Prefs; +import org.thoughtcrime.securesms.util.RelayUtil; import org.thoughtcrime.securesms.util.SendRelayedMessageUtil; public class ConversationListActivity extends PassphraseRequiredActionBarActivity @@ -212,10 +212,6 @@ public class ConversationListActivity extends PassphraseRequiredActionBarActivit if (isDirectSharing(this)) { openConversation(getDirectSharingChatId(this), -1); } - - if (isDirectSharing(this)) { - openConversation(getDirectSharingChatId(this), -1); - } } public void refreshTitle() { @@ -395,10 +391,8 @@ public class ConversationListActivity extends PassphraseRequiredActionBarActivit intent.putExtra(STARTING_POSITION_EXTRA, startingPosition); if (isRelayingMessageContent(this)) { acquireRelayMessageContent(this, intent); - startActivityForResult(intent, REQUEST_RELAY); - } else { - startActivity(intent); } + startActivity(intent); overridePendingTransition(R.anim.slide_from_right, R.anim.fade_scale_out); } @@ -409,10 +403,8 @@ public class ConversationListActivity extends PassphraseRequiredActionBarActivit Intent intent = new Intent(this, ConversationListArchiveActivity.class); if (isRelayingMessageContent(this)) { acquireRelayMessageContent(this, intent); - startActivityForResult(intent, REQUEST_RELAY); - } else { - startActivity(intent); } + startActivity(intent); overridePendingTransition(R.anim.slide_from_right, R.anim.fade_scale_out); } @@ -429,10 +421,8 @@ public class ConversationListActivity extends PassphraseRequiredActionBarActivit Intent intent = new Intent(this, NewConversationActivity.class); if (isRelayingMessageContent(this)) { acquireRelayMessageContent(this, intent); - startActivityForResult(intent, REQUEST_RELAY); - } else { - startActivity(intent); } + startActivity(intent); } @Override @@ -444,13 +434,6 @@ public class ConversationListActivity extends PassphraseRequiredActionBarActivit QrCodeHandler qrCodeHandler = new QrCodeHandler(this); qrCodeHandler.onScanPerformed(scanResult); break; - case REQUEST_RELAY: - if (resultCode == RESULT_OK) { - handleResetRelaying(); - setResult(RESULT_OK); - finish(); - } - break; default: break; } diff --git a/src/org/thoughtcrime/securesms/ConversationListArchiveActivity.java b/src/org/thoughtcrime/securesms/ConversationListArchiveActivity.java index 939a34458..6505ce94c 100644 --- a/src/org/thoughtcrime/securesms/ConversationListArchiveActivity.java +++ b/src/org/thoughtcrime/securesms/ConversationListArchiveActivity.java @@ -14,7 +14,6 @@ import org.thoughtcrime.securesms.util.DynamicTheme; import static org.thoughtcrime.securesms.ConversationActivity.CHAT_ID_EXTRA; import static org.thoughtcrime.securesms.ConversationActivity.FROM_ARCHIVED_CHATS_EXTRA; -import static org.thoughtcrime.securesms.util.RelayUtil.REQUEST_RELAY; import static org.thoughtcrime.securesms.util.RelayUtil.acquireRelayMessageContent; import static org.thoughtcrime.securesms.util.RelayUtil.isRelayingMessageContent; import static org.thoughtcrime.securesms.util.RelayUtil.isSharing; @@ -84,7 +83,7 @@ public class ConversationListArchiveActivity extends PassphraseRequiredActionBar switch (item.getItemId()) { case android.R.id.home: - super.onBackPressed(); + onBackPressed(); return true; case R.id.mark_as_read: @@ -95,6 +94,20 @@ public class ConversationListArchiveActivity extends PassphraseRequiredActionBar return false; } + @Override + public void onBackPressed() { + if (isRelayingMessageContent(this)) { + // Go back to the ConversationListRelayingActivity + super.onBackPressed(); + } else { + // Load the ConversationListActivity in case it's not existent for some reason + Intent intent = new Intent(this, ConversationListActivity.class); + intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); + startActivity(intent); + finish(); + } + } + @Override public void onCreateConversation(int chatId) { Intent intent = new Intent(this, ConversationActivity.class); @@ -102,10 +115,13 @@ public class ConversationListArchiveActivity extends PassphraseRequiredActionBar intent.putExtra(FROM_ARCHIVED_CHATS_EXTRA, true); if (isRelayingMessageContent(this)) { acquireRelayMessageContent(this, intent); - startActivityForResult(intent, REQUEST_RELAY); - } else { - startActivity(intent); + + // Just finish instead of updating the title and so on. This is not user-visible + // because the ConversationActivity will restart the ConversationListArchiveActivity + // after the user left. + finish(); } + startActivity(intent); overridePendingTransition(R.anim.slide_from_right, R.anim.fade_scale_out); } @@ -114,13 +130,4 @@ public class ConversationListArchiveActivity extends PassphraseRequiredActionBar public void onSwitchToArchive() { throw new AssertionError(); } - - @Override - protected void onActivityResult(int requestCode, int resultCode, Intent data) { - super.onActivityResult(requestCode, resultCode, data); - if (requestCode == REQUEST_RELAY && resultCode == RESULT_OK) { - setResult(RESULT_OK); - finish(); - } - } } diff --git a/src/org/thoughtcrime/securesms/ConversationListFragment.java b/src/org/thoughtcrime/securesms/ConversationListFragment.java index 8148e85fa..07d98acec 100644 --- a/src/org/thoughtcrime/securesms/ConversationListFragment.java +++ b/src/org/thoughtcrime/securesms/ConversationListFragment.java @@ -74,7 +74,6 @@ import java.util.Set; import java.util.Timer; import java.util.TimerTask; -import static org.thoughtcrime.securesms.util.RelayUtil.REQUEST_RELAY; import static org.thoughtcrime.securesms.util.RelayUtil.acquireRelayMessageContent; import static org.thoughtcrime.securesms.util.RelayUtil.getSharedText; import static org.thoughtcrime.securesms.util.RelayUtil.getSharedUris; @@ -232,7 +231,7 @@ public class ConversationListFragment extends Fragment }); } else { acquireRelayMessageContent(getActivity(), intent); - fab.setOnClickListener(v -> getActivity().startActivityForResult(intent, REQUEST_RELAY)); + fab.setOnClickListener(v -> getActivity().startActivity(intent)); } } else { fab.setOnClickListener(v -> startActivity(intent)); @@ -597,13 +596,13 @@ public class ConversationListFragment extends Fragment public void handleEvent(@NonNull DcEvent event) { if (event.getId() == DcContext.DC_EVENT_CONNECTIVITY_CHANGED) { Activity activity = getActivity(); - if (activity != null) { + if (activity instanceof ConversationListActivity) { ((ConversationListActivity) activity).refreshTitle(); } } else if (event.getId() == DcContext.DC_EVENT_SELFAVATAR_CHANGED) { Activity activity = getActivity(); - if (activity != null) { + if (activity instanceof ConversationListActivity) { ((ConversationListActivity) activity).refreshAvatar(); } diff --git a/src/org/thoughtcrime/securesms/ConversationListRelayingActivity.java b/src/org/thoughtcrime/securesms/ConversationListRelayingActivity.java index a4e74b50f..369bcf1d9 100644 --- a/src/org/thoughtcrime/securesms/ConversationListRelayingActivity.java +++ b/src/org/thoughtcrime/securesms/ConversationListRelayingActivity.java @@ -1,13 +1,14 @@ package org.thoughtcrime.securesms; -import static org.thoughtcrime.securesms.util.RelayUtil.REQUEST_RELAY; - import android.app.Activity; import android.content.ComponentName; import android.content.Intent; +import android.os.Bundle; import androidx.fragment.app.Fragment; +import java.lang.ref.WeakReference; + /** * "Relaying" means "Forwarding or Sharing". * @@ -25,13 +26,34 @@ import androidx.fragment.app.Fragment; */ public class ConversationListRelayingActivity extends ConversationListActivity { + static WeakReference INSTANCE = null; + + @Override + protected void onCreate(Bundle icicle, boolean ready) { + super.onCreate(icicle, ready); + INSTANCE = new WeakReference<>(this); + } + + @Override + protected void onDestroy() { + super.onDestroy(); + INSTANCE = null; + } + + // =================== Static Methods =================== public static void start(Fragment fragment, Intent intent) { intent.setComponent(new ComponentName(fragment.getContext(), ConversationListRelayingActivity.class)); - fragment.startActivityForResult(intent, REQUEST_RELAY); + fragment.startActivity(intent); } public static void start(Activity activity, Intent intent) { intent.setComponent(new ComponentName(activity, ConversationListRelayingActivity.class)); - activity.startActivityForResult(intent, REQUEST_RELAY); + activity.startActivity(intent); + } + + public static void finishActivity() { + if (INSTANCE != null && INSTANCE.get() != null) { + INSTANCE.get().finish(); + } } } diff --git a/src/org/thoughtcrime/securesms/NewConversationActivity.java b/src/org/thoughtcrime/securesms/NewConversationActivity.java index cdfa168fc..15f657239 100644 --- a/src/org/thoughtcrime/securesms/NewConversationActivity.java +++ b/src/org/thoughtcrime/securesms/NewConversationActivity.java @@ -40,7 +40,6 @@ import java.util.Map; import static org.thoughtcrime.securesms.ConversationActivity.CHAT_ID_EXTRA; import static org.thoughtcrime.securesms.ConversationActivity.TEXT_EXTRA; -import static org.thoughtcrime.securesms.util.RelayUtil.REQUEST_RELAY; import static org.thoughtcrime.securesms.util.RelayUtil.acquireRelayMessageContent; import static org.thoughtcrime.securesms.util.RelayUtil.isRelayingMessageContent; @@ -182,11 +181,9 @@ public class NewConversationActivity extends ContactSelectionActivity { intent.putExtra(CHAT_ID_EXTRA, chatId); if (isRelayingMessageContent(this)) { acquireRelayMessageContent(this, intent); - startActivityForResult(intent, REQUEST_RELAY); - } else { - startActivity(intent); - finish(); } + startActivity(intent); + finish(); } @Override @@ -211,13 +208,4 @@ public class NewConversationActivity extends ContactSelectionActivity { return true; } - @Override - protected void onActivityResult(int requestCode, int resultCode, Intent data) { - super.onActivityResult(requestCode, resultCode, data); - if (requestCode == REQUEST_RELAY && resultCode == RESULT_OK) { - setResult(RESULT_OK); - finish(); - } - } - } diff --git a/src/org/thoughtcrime/securesms/ShareActivity.java b/src/org/thoughtcrime/securesms/ShareActivity.java index a890d4c9f..3df404a73 100644 --- a/src/org/thoughtcrime/securesms/ShareActivity.java +++ b/src/org/thoughtcrime/securesms/ShareActivity.java @@ -269,8 +269,6 @@ public class ShareActivity extends PassphraseRequiredActionBarActivity implement RelayUtil.setSharedUris(composeIntent, resolvedExtras); ConversationListRelayingActivity.start(this, composeIntent); } - // We use startActivityForResult() here so that the conversations list is correctly updated. (hide "Device messages", ...)a - // With startActivity() the list was not always updated before and after sharing and incorrectly showed or did not show the device talk. finish(); } diff --git a/src/org/thoughtcrime/securesms/util/RelayUtil.java b/src/org/thoughtcrime/securesms/util/RelayUtil.java index 6d4aba768..04903c7c0 100644 --- a/src/org/thoughtcrime/securesms/util/RelayUtil.java +++ b/src/org/thoughtcrime/securesms/util/RelayUtil.java @@ -14,7 +14,6 @@ public class RelayUtil { private static final String FORWARDED_MESSAGE_IDS = "forwarded_message_ids"; private static final String SHARED_URIS = "shared_uris"; private static final String IS_SHARING = "is_sharing"; - public static final int REQUEST_RELAY = 100; private static final String DIRECT_SHARING_CHAT_ID = "direct_sharing_chat_id"; public static boolean isRelayingMessageContent(Activity activity) { diff --git a/src/org/thoughtcrime/securesms/util/SendRelayedMessageUtil.java b/src/org/thoughtcrime/securesms/util/SendRelayedMessageUtil.java index fb82f9b9a..a6d733c9b 100644 --- a/src/org/thoughtcrime/securesms/util/SendRelayedMessageUtil.java +++ b/src/org/thoughtcrime/securesms/util/SendRelayedMessageUtil.java @@ -8,6 +8,7 @@ import android.util.Log; import com.b44t.messenger.DcContext; import com.b44t.messenger.DcMsg; +import org.thoughtcrime.securesms.ConversationListRelayingActivity; import org.thoughtcrime.securesms.connect.DcHelper; import org.thoughtcrime.securesms.mms.PartAuthority; import org.thoughtcrime.securesms.providers.PersistentBlobProvider; @@ -33,7 +34,7 @@ public class SendRelayedMessageUtil { } public static void immediatelyRelay(Activity activity, final Long[] chatIds) { - activity.setResult(RESULT_OK); + ConversationListRelayingActivity.finishActivity(); if (isForwarding(activity)) { int[] forwardedMessageIDs = getForwardedMessageIDs(activity); resetRelayingMessageContent(activity);