From d0bbebd25ef554dae24dd242eecc7e584d56dc6e Mon Sep 17 00:00:00 2001 From: Torsten Grote Date: Mon, 17 Dec 2018 18:40:47 -0200 Subject: [PATCH] [android] don't crash when re-opening conversation after briar exited --- .../ConversationActivityNotSignedInTest.java | 38 +++++++++++++++++++ .../ConversationActivityScreenshotTest.java | 0 .../briar/android/activity/BriarActivity.java | 6 ++- .../conversation/ConversationActivity.java | 14 +++++-- .../main/res/layout/activity_conversation.xml | 2 +- 5 files changed, 55 insertions(+), 5 deletions(-) create mode 100644 briar-android/src/androidTestOfficial/java/org/briarproject/briar/android/conversation/ConversationActivityNotSignedInTest.java rename briar-android/src/androidTestScreenshot/java/org/briarproject/briar/android/{contact => conversation}/ConversationActivityScreenshotTest.java (100%) diff --git a/briar-android/src/androidTestOfficial/java/org/briarproject/briar/android/conversation/ConversationActivityNotSignedInTest.java b/briar-android/src/androidTestOfficial/java/org/briarproject/briar/android/conversation/ConversationActivityNotSignedInTest.java new file mode 100644 index 000000000..685a26efa --- /dev/null +++ b/briar-android/src/androidTestOfficial/java/org/briarproject/briar/android/conversation/ConversationActivityNotSignedInTest.java @@ -0,0 +1,38 @@ +package org.briarproject.briar.android.conversation; + +import android.content.Context; +import android.content.Intent; +import android.support.test.rule.ActivityTestRule; +import android.support.test.runner.AndroidJUnit4; + +import org.briarproject.briar.R; +import org.junit.Rule; +import org.junit.Test; +import org.junit.runner.RunWith; + +import static android.support.test.InstrumentationRegistry.getInstrumentation; +import static android.support.test.espresso.Espresso.onView; +import static android.support.test.espresso.matcher.ViewMatchers.isDisplayed; +import static android.support.test.espresso.matcher.ViewMatchers.withText; +import static org.briarproject.briar.android.ViewActions.waitUntilMatches; +import static org.briarproject.briar.android.conversation.ConversationActivity.CONTACT_ID; + +@RunWith(AndroidJUnit4.class) +public class ConversationActivityNotSignedInTest { + + @Rule + public ActivityTestRule testRule = + new ActivityTestRule<>(ConversationActivity.class, false, false); + + @Test + public void openWithoutSignedIn() { + Context targetContext = getInstrumentation().getTargetContext(); + Intent intent = new Intent(targetContext, ConversationActivity.class); + intent.putExtra(CONTACT_ID, 1); + testRule.launchActivity(intent); + + onView(withText(R.string.sign_in_button)) + .perform(waitUntilMatches(isDisplayed())); + } + +} diff --git a/briar-android/src/androidTestScreenshot/java/org/briarproject/briar/android/contact/ConversationActivityScreenshotTest.java b/briar-android/src/androidTestScreenshot/java/org/briarproject/briar/android/conversation/ConversationActivityScreenshotTest.java similarity index 100% rename from briar-android/src/androidTestScreenshot/java/org/briarproject/briar/android/contact/ConversationActivityScreenshotTest.java rename to briar-android/src/androidTestScreenshot/java/org/briarproject/briar/android/conversation/ConversationActivityScreenshotTest.java diff --git a/briar-android/src/main/java/org/briarproject/briar/android/activity/BriarActivity.java b/briar-android/src/main/java/org/briarproject/briar/android/activity/BriarActivity.java index e39868b7a..e8e2670d3 100644 --- a/briar-android/src/main/java/org/briarproject/briar/android/activity/BriarActivity.java +++ b/briar-android/src/main/java/org/briarproject/briar/android/activity/BriarActivity.java @@ -89,7 +89,7 @@ public abstract class BriarActivity extends BaseActivity { } else if (lockManager.isLocked() && !isFinishing()) { // Also check that the activity isn't finishing already. // This is possible if we finished in onActivityResult(). - // Lauching another UnlockActivity would cause a loop. + // Launching another UnlockActivity would cause a loop. Intent i = new Intent(this, UnlockActivity.class); startActivityForResult(i, REQUEST_UNLOCK); } else if (SDK_INT >= 23) { @@ -111,6 +111,10 @@ public abstract class BriarActivity extends BaseActivity { lockManager.onActivityStop(); } + protected boolean signedIn() { + return briarController.accountSignedIn(); + } + /** * Sets the transition animations. * @param enterTransition used to move views into initial positions diff --git a/briar-android/src/main/java/org/briarproject/briar/android/conversation/ConversationActivity.java b/briar-android/src/main/java/org/briarproject/briar/android/conversation/ConversationActivity.java index 5e4ef63a5..c98e774cf 100644 --- a/briar-android/src/main/java/org/briarproject/briar/android/conversation/ConversationActivity.java +++ b/briar-android/src/main/java/org/briarproject/briar/android/conversation/ConversationActivity.java @@ -107,7 +107,6 @@ import static android.support.v4.app.ActivityOptionsCompat.makeSceneTransitionAn import static android.support.v4.view.ViewCompat.setTransitionName; import static android.support.v7.util.SortedList.INVALID_POSITION; import static android.view.Gravity.RIGHT; -import static android.widget.Toast.LENGTH_LONG; import static android.widget.Toast.LENGTH_SHORT; import static java.util.Collections.emptyList; import static java.util.Collections.sort; @@ -121,9 +120,9 @@ import static org.briarproject.bramble.util.StringUtils.isNullOrEmpty; import static org.briarproject.briar.android.TestingConstants.FEATURE_FLAG_IMAGE_ATTACHMENTS; import static org.briarproject.briar.android.activity.RequestCodes.REQUEST_ATTACH_IMAGE; import static org.briarproject.briar.android.activity.RequestCodes.REQUEST_INTRODUCTION; +import static org.briarproject.briar.android.conversation.ImageActivity.ATTACHMENTS; import static org.briarproject.briar.android.conversation.ImageActivity.ATTACHMENT_POSITION; import static org.briarproject.briar.android.conversation.ImageActivity.DATE; -import static org.briarproject.briar.android.conversation.ImageActivity.ATTACHMENTS; import static org.briarproject.briar.android.conversation.ImageActivity.NAME; import static org.briarproject.briar.android.settings.SettingsFragment.SETTINGS_NAMESPACE; import static org.briarproject.briar.android.util.UiUtils.getAvatarTransitionName; @@ -217,7 +216,6 @@ public class ConversationActivity extends BriarActivity viewModel = ViewModelProviders.of(this, viewModelFactory) .get(ConversationViewModel.class); - viewModel.setContactId(contactId); attachmentController = viewModel.getAttachmentController(); setContentView(R.layout.activity_conversation); @@ -300,6 +298,16 @@ public class ConversationActivity extends BriarActivity list.startPeriodicUpdate(); } + @Override + public void onResume() { + super.onResume(); + // Trigger loading of contact data, noop if data was loaded already. + // + // We can only start loading data *after* we are sure + // the user has signed in. After sign-in, onCreate() isn't run again. + if (signedIn()) viewModel.setContactId(contactId); + } + @Override public void onStop() { super.onStop(); diff --git a/briar-android/src/main/res/layout/activity_conversation.xml b/briar-android/src/main/res/layout/activity_conversation.xml index f27144b06..1f78f03d1 100644 --- a/briar-android/src/main/res/layout/activity_conversation.xml +++ b/briar-android/src/main/res/layout/activity_conversation.xml @@ -34,7 +34,7 @@ android:layout_marginLeft="@dimen/margin_medium" android:layout_marginStart="@dimen/margin_medium" android:ellipsize="end" - android:gravity="center" + android:gravity="center_vertical" android:maxLines="1" android:textColor="@color/action_bar_text" tools:text="Contact Name of someone who chose a long name"/>