Add Mastodon Redirect support and "Open Link" share target

This commit is contained in:
Zachary Wander 2024-01-17 23:21:43 -05:00
parent 45d36a6a87
commit dcb87a4bf7
6 changed files with 89 additions and 7 deletions

View File

@ -40,56 +40,62 @@
<activity <activity
android:name=".MainActivity" android:name=".MainActivity"
android:configChanges="orientation|screenSize|keyboardHidden|screenLayout|smallestScreenSize" android:configChanges="orientation|screenSize|keyboardHidden|screenLayout|smallestScreenSize"
android:launchMode="singleTask"
android:exported="true" android:exported="true"
android:theme="@style/SplashTheme"> android:theme="@style/SplashTheme">
<intent-filter> <intent-filter>
<action android:name="android.intent.action.MAIN" /> <action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" /> <category android:name="android.intent.category.LAUNCHER" />
</intent-filter> </intent-filter>
<intent-filter>
<intent-filter android:label="@string/action_compose">
<action android:name="android.intent.action.SEND" /> <action android:name="android.intent.action.SEND" />
<category android:name="android.intent.category.DEFAULT" /> <category android:name="android.intent.category.DEFAULT" />
<data android:mimeType="text/plain" /> <data android:mimeType="text/plain" />
</intent-filter> </intent-filter>
<intent-filter> <intent-filter android:label="@string/action_compose">
<action android:name="android.intent.action.SEND" /> <action android:name="android.intent.action.SEND" />
<category android:name="android.intent.category.DEFAULT" /> <category android:name="android.intent.category.DEFAULT" />
<data android:mimeType="image/*" /> <data android:mimeType="image/*" />
</intent-filter> </intent-filter>
<intent-filter> <intent-filter android:label="@string/action_compose">
<action android:name="android.intent.action.SEND" /> <action android:name="android.intent.action.SEND" />
<category android:name="android.intent.category.DEFAULT" /> <category android:name="android.intent.category.DEFAULT" />
<data android:mimeType="video/*" /> <data android:mimeType="video/*" />
</intent-filter> </intent-filter>
<intent-filter> <intent-filter android:label="@string/action_compose">
<action android:name="android.intent.action.SEND_MULTIPLE" /> <action android:name="android.intent.action.SEND_MULTIPLE" />
<category android:name="android.intent.category.DEFAULT" /> <category android:name="android.intent.category.DEFAULT" />
<data android:mimeType="image/*" /> <data android:mimeType="image/*" />
</intent-filter> </intent-filter>
<intent-filter> <intent-filter android:label="@string/action_compose">
<action android:name="android.intent.action.SEND_MULTIPLE" /> <action android:name="android.intent.action.SEND_MULTIPLE" />
<category android:name="android.intent.category.DEFAULT" /> <category android:name="android.intent.category.DEFAULT" />
<data android:mimeType="video/*" /> <data android:mimeType="video/*" />
</intent-filter> </intent-filter>
<intent-filter> <intent-filter android:label="@string/action_compose">
<action android:name="android.intent.action.SEND" /> <action android:name="android.intent.action.SEND" />
<category android:name="android.intent.category.DEFAULT" /> <category android:name="android.intent.category.DEFAULT" />
<data android:mimeType="audio/*" /> <data android:mimeType="audio/*" />
</intent-filter> </intent-filter>
<intent-filter>
<action android:name="dev.zwander.mastodonredirect.intent.action.OPEN_FEDI_LINK" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
<meta-data <meta-data
android:name="android.app.shortcuts" android:name="android.app.shortcuts"
@ -98,6 +104,21 @@
android:name="android.service.chooser.chooser_target_service" android:name="android.service.chooser.chooser_target_service"
android:value="androidx.sharetarget.ChooserTargetServiceCompat" /> android:value="androidx.sharetarget.ChooserTargetServiceCompat" />
</activity>
<activity
android:name=".components.view.ViewLinkActivity"
android:excludeFromRecents="true"
android:exported="true"
android:theme="@style/NullTheme">
<intent-filter android:label="@string/open_link">
<action android:name="android.intent.action.SEND" />
<category android:name="android.intent.category.DEFAULT" />
<data android:mimeType="text/plain" />
</intent-filter>
</activity> </activity>
<activity <activity
android:name=".components.compose.ComposeActivity" android:name=".components.compose.ComposeActivity"

View File

@ -531,9 +531,17 @@ class MainActivity : BottomSheetActivity(), ActionButtonActivity, MenuProvider {
if (redirectUrl != null) { if (redirectUrl != null) {
viewUrl(redirectUrl, PostLookupFallbackBehavior.DISPLAY_ERROR) viewUrl(redirectUrl, PostLookupFallbackBehavior.DISPLAY_ERROR)
} }
handleMastodonRedirectIntent(intent)
} }
} }
override fun onNewIntent(intent: Intent) {
super.onNewIntent(intent)
handleMastodonRedirectIntent(intent)
}
private fun forwardToComposeActivity(intent: Intent) { private fun forwardToComposeActivity(intent: Intent) {
val composeOptions = val composeOptions =
intent.getParcelableExtraCompat<ComposeActivity.ComposeOptions>(COMPOSE_OPTIONS) intent.getParcelableExtraCompat<ComposeActivity.ComposeOptions>(COMPOSE_OPTIONS)
@ -1201,6 +1209,14 @@ class MainActivity : BottomSheetActivity(), ActionButtonActivity, MenuProvider {
override fun getActionButton() = binding.composeButton override fun getActionButton() = binding.composeButton
private fun handleMastodonRedirectIntent(intent: Intent?) {
if (intent?.action == "dev.zwander.mastodonredirect.intent.action.OPEN_FEDI_LINK") {
intent.dataString?.let { url ->
viewUrl(url, PostLookupFallbackBehavior.OPEN_IN_BROWSER)
}
}
}
companion object { companion object {
const val OPEN_WITH_EXPLODE_ANIMATION = "explode" const val OPEN_WITH_EXPLODE_ANIMATION = "explode"

View File

@ -0,0 +1,26 @@
package com.keylesspalace.tusky.components.view
import android.content.Intent
import android.net.Uri
import android.os.Bundle
import com.keylesspalace.tusky.BaseActivity
import com.keylesspalace.tusky.MainActivity
import dagger.hilt.android.AndroidEntryPoint
@AndroidEntryPoint
class ViewLinkActivity : BaseActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
if (intent?.action == Intent.ACTION_SEND) {
val link = intent.getStringExtra(Intent.EXTRA_TEXT)
val launchIntent = Intent(this, MainActivity::class.java)
launchIntent.action = "dev.zwander.mastodonredirect.intent.action.OPEN_FEDI_LINK"
launchIntent.data = link?.let { Uri.parse(it) }
startActivity(launchIntent)
finish()
}
}
}

View File

@ -311,6 +311,10 @@ fun Context.openLink(url: String) {
*/ */
private fun openLinkInBrowser(uri: Uri?, context: Context) { private fun openLinkInBrowser(uri: Uri?, context: Context) {
val intent = Intent(Intent.ACTION_VIEW, uri) val intent = Intent(Intent.ACTION_VIEW, uri)
// Makes sure the Intent opens in the browser instead of something like Mastodon Redirect.
intent.selector = Intent(Intent.ACTION_VIEW, Uri.parse("https://"))
try { try {
context.startActivity(intent) context.startActivity(intent)
} catch (e: ActivityNotFoundException) { } catch (e: ActivityNotFoundException) {

View File

@ -853,5 +853,7 @@
<string name="list_reply_policy_followed">Any followed user</string> <string name="list_reply_policy_followed">Any followed user</string>
<string name="list_reply_policy_label">Show replies to</string> <string name="list_reply_policy_label">Show replies to</string>
<string name="open_link">Open Link</string>
<string name="unknown_notification_type">Unknown notification type</string> <string name="unknown_notification_type">Unknown notification type</string>
</resources> </resources>

View File

@ -177,4 +177,17 @@
<item name="android:layout_marginLeft">20dp</item> <item name="android:layout_marginLeft">20dp</item>
<item name="android:layout_marginRight">20dp</item> <item name="android:layout_marginRight">20dp</item>
</style> </style>
<style name="NullTheme" parent="Theme.Material3.DynamicColors.DayNight">
<item name="android:windowIsTranslucent">true</item>
<item name="android:windowBackground">@android:color/transparent</item>
<item name="android:windowContentOverlay">@null</item>
<item name="android:windowNoTitle">true</item>
<item name="android:windowIsFloating">true</item>
<item name="android:backgroundDimEnabled">false</item>
<item name="android:windowEnterAnimation">@null</item>
<item name="android:windowExitAnimation">@null</item>
<item name="android:windowNoDisplay">true</item>
<item name="android:windowActionBar">false</item>
</style>
</resources> </resources>