When opening a post via "Open As", if post lookup from the target instance fails, display an error instead of opening the post in the browser. (#1531)

Addresses #1526
This commit is contained in:
Levi Bard 2019-10-11 17:51:47 +02:00 committed by Konrad Pozniak
parent a308b4c139
commit 44bb1999af
5 changed files with 35 additions and 5 deletions

View File

@ -19,6 +19,7 @@ import android.content.Intent
import android.os.Bundle import android.os.Bundle
import android.view.View import android.view.View
import android.widget.LinearLayout import android.widget.LinearLayout
import android.widget.Toast
import androidx.annotation.VisibleForTesting import androidx.annotation.VisibleForTesting
import androidx.lifecycle.Lifecycle import androidx.lifecycle.Lifecycle
import com.google.android.material.bottomsheet.BottomSheetBehavior import com.google.android.material.bottomsheet.BottomSheetBehavior
@ -62,7 +63,7 @@ abstract class BottomSheetActivity : BaseActivity() {
} }
open fun viewUrl(url: String) { open fun viewUrl(url: String, lookupFallbackBehavior: PostLookupFallbackBehavior = PostLookupFallbackBehavior.OPEN_IN_BROWSER) {
if (!looksLikeMastodonUrl(url)) { if (!looksLikeMastodonUrl(url)) {
openLink(url) openLink(url)
return return
@ -88,11 +89,11 @@ abstract class BottomSheetActivity : BaseActivity() {
return@subscribe return@subscribe
} }
openLink(url) performUrlFallbackAction(url, lookupFallbackBehavior)
}, { }, {
if (!getCancelSearchRequested(url)) { if (!getCancelSearchRequested(url)) {
onEndSearch(url) onEndSearch(url)
openLink(url) performUrlFallbackAction(url, lookupFallbackBehavior)
} }
}) })
@ -113,6 +114,13 @@ abstract class BottomSheetActivity : BaseActivity() {
startActivityWithSlideInAnimation(intent) startActivityWithSlideInAnimation(intent)
} }
protected open fun performUrlFallbackAction(url: String, fallbackBehavior: PostLookupFallbackBehavior) {
when (fallbackBehavior) {
PostLookupFallbackBehavior.OPEN_IN_BROWSER -> openLink(url)
PostLookupFallbackBehavior.DISPLAY_ERROR -> Toast.makeText(this, getString(R.string.post_lookup_error_format, url), Toast.LENGTH_SHORT).show()
}
}
@VisibleForTesting @VisibleForTesting
fun onBeginSearch(url: String) { fun onBeginSearch(url: String) {
searchUrl = url searchUrl = url
@ -187,3 +195,8 @@ fun looksLikeMastodonUrl(urlString: String): Boolean {
path.matches("^/notice/\\d+$".toRegex()) || path.matches("^/notice/\\d+$".toRegex()) ||
path.matches("^/objects/[-a-f0-9]+$".toRegex()) path.matches("^/objects/[-a-f0-9]+$".toRegex())
} }
enum class PostLookupFallbackBehavior {
OPEN_IN_BROWSER,
DISPLAY_ERROR,
}

View File

@ -311,7 +311,7 @@ public final class MainActivity extends BottomSheetActivity implements ActionBut
if (intent != null) { if (intent != null) {
String statusUrl = intent.getStringExtra(STATUS_URL); String statusUrl = intent.getStringExtra(STATUS_URL);
if (statusUrl != null) { if (statusUrl != null) {
viewUrl(statusUrl); viewUrl(statusUrl, PostLookupFallbackBehavior.DISPLAY_ERROR);
} }
} }
} }

View File

@ -45,6 +45,7 @@ import com.keylesspalace.tusky.BottomSheetActivity;
import com.keylesspalace.tusky.ComposeActivity; import com.keylesspalace.tusky.ComposeActivity;
import com.keylesspalace.tusky.MainActivity; import com.keylesspalace.tusky.MainActivity;
import com.keylesspalace.tusky.R; import com.keylesspalace.tusky.R;
import com.keylesspalace.tusky.PostLookupFallbackBehavior;
import com.keylesspalace.tusky.ViewMediaActivity; import com.keylesspalace.tusky.ViewMediaActivity;
import com.keylesspalace.tusky.ViewTagActivity; import com.keylesspalace.tusky.ViewTagActivity;
import com.keylesspalace.tusky.components.report.ReportActivity; import com.keylesspalace.tusky.components.report.ReportActivity;
@ -134,7 +135,7 @@ public abstract class SFragment extends BaseFragment implements Injectable {
} }
public void onViewUrl(String url) { public void onViewUrl(String url) {
bottomSheetActivity.viewUrl(url); bottomSheetActivity.viewUrl(url, PostLookupFallbackBehavior.OPEN_IN_BROWSER);
} }
protected void reply(Status status) { protected void reply(Status status) {

View File

@ -536,5 +536,6 @@
<string name="poll_allow_multiple_choices">Multiple choices</string> <string name="poll_allow_multiple_choices">Multiple choices</string>
<string name="poll_new_choice_hint">Choice %d</string> <string name="poll_new_choice_hint">Choice %d</string>
<string name="edit_poll">Edit</string> <string name="edit_poll">Edit</string>
<string name="post_lookup_error_format">Error looking up post %s</string>
</resources> </resources>

View File

@ -214,6 +214,16 @@ class BottomSheetActivityTest {
Assert.assertEquals(nonMastodonQuery, activity.link) Assert.assertEquals(nonMastodonQuery, activity.link)
} }
@Test
fun search_withNoResults_appliesRequestedFallbackBehavior() {
for (fallbackBehavior in listOf(PostLookupFallbackBehavior.OPEN_IN_BROWSER, PostLookupFallbackBehavior.DISPLAY_ERROR)) {
activity.viewUrl(nonMastodonQuery, fallbackBehavior)
testScheduler.advanceTimeBy(100, TimeUnit.MILLISECONDS)
Assert.assertEquals(nonMastodonQuery, activity.link)
Assert.assertEquals(fallbackBehavior, activity.fallbackBehavior)
}
}
@Test @Test
fun search_withCancellation_doesNotLoadUrl_forAccount() { fun search_withCancellation_doesNotLoadUrl_forAccount() {
activity.viewUrl(accountQuery) activity.viewUrl(accountQuery)
@ -263,6 +273,7 @@ class BottomSheetActivityTest {
var statusId: String? = null var statusId: String? = null
var accountId: String? = null var accountId: String? = null
var link: String? = null var link: String? = null
var fallbackBehavior: PostLookupFallbackBehavior? = null
init { init {
mastodonApi = api mastodonApi = api
@ -282,5 +293,9 @@ class BottomSheetActivityTest {
this.statusId = statusId this.statusId = statusId
} }
override fun performUrlFallbackAction(url: String, fallbackBehavior: PostLookupFallbackBehavior) {
this.link = url
this.fallbackBehavior = fallbackBehavior
}
} }
} }