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:
parent
a308b4c139
commit
44bb1999af
|
@ -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,
|
||||||
|
}
|
||||||
|
|
|
@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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) {
|
||||||
|
|
|
@ -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>
|
||||||
|
|
|
@ -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
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
Loading…
Reference in New Issue