2016-12-08 08:33:13 +01:00
|
|
|
package org.mariotaku.twidere.activity
|
|
|
|
|
|
|
|
import android.app.Activity
|
|
|
|
import android.content.Intent
|
|
|
|
import android.net.Uri
|
|
|
|
import android.os.Bundle
|
|
|
|
import android.text.TextUtils
|
2017-04-15 10:18:01 +02:00
|
|
|
import org.mariotaku.chameleon.Chameleon
|
2017-04-07 06:12:34 +02:00
|
|
|
import org.mariotaku.ktextension.toLongOr
|
2016-12-08 08:33:13 +01:00
|
|
|
import org.mariotaku.twidere.R
|
|
|
|
import org.mariotaku.twidere.TwidereConstants.*
|
2017-04-12 13:25:10 +02:00
|
|
|
import org.mariotaku.twidere.activity.content.FavoriteConfirmDialogActivity
|
|
|
|
import org.mariotaku.twidere.activity.content.RetweetQuoteDialogActivity
|
2016-12-08 08:33:13 +01:00
|
|
|
import org.mariotaku.twidere.app.TwidereApplication
|
|
|
|
import org.mariotaku.twidere.model.UserKey
|
2016-12-15 06:11:32 +01:00
|
|
|
import org.mariotaku.twidere.util.Analyzer
|
2016-12-08 08:33:13 +01:00
|
|
|
import org.mariotaku.twidere.util.IntentUtils
|
2017-04-17 11:51:16 +02:00
|
|
|
import org.mariotaku.twidere.util.ThemeUtils
|
2017-04-15 10:18:01 +02:00
|
|
|
import org.mariotaku.twidere.util.dagger.DependencyHolder
|
2017-02-07 10:01:03 +01:00
|
|
|
import java.util.*
|
2016-12-08 08:33:13 +01:00
|
|
|
|
2017-01-18 18:48:29 +01:00
|
|
|
class WebLinkHandlerActivity : Activity() {
|
2016-12-08 08:33:13 +01:00
|
|
|
|
2017-04-15 10:18:01 +02:00
|
|
|
private val userTheme: Chameleon.Theme by lazy {
|
|
|
|
val preferences = DependencyHolder.get(this).preferences
|
|
|
|
return@lazy ThemeUtils.getUserTheme(this, preferences)
|
|
|
|
}
|
|
|
|
|
2016-12-08 08:33:13 +01:00
|
|
|
override fun onCreate(savedInstanceState: Bundle?) {
|
|
|
|
super.onCreate(savedInstanceState)
|
|
|
|
val packageManager = packageManager
|
|
|
|
intent.setExtrasClassLoader(TwidereApplication::class.java.classLoader)
|
|
|
|
val uri = intent.data
|
|
|
|
if (uri == null || uri.host == null) {
|
|
|
|
finish()
|
|
|
|
return
|
|
|
|
}
|
2017-01-18 18:48:29 +01:00
|
|
|
|
2019-10-25 10:50:10 +02:00
|
|
|
val (handledIntent, handledSuccessfully) = when (uri.host?.toLowerCase(Locale.US)) {
|
2017-01-18 18:48:29 +01:00
|
|
|
"twitter.com", "www.twitter.com", "mobile.twitter.com" -> handleTwitterLink(regulateTwitterUri(uri))
|
|
|
|
"fanfou.com" -> handleFanfouLink(uri)
|
2017-01-28 08:15:35 +01:00
|
|
|
"twidere.org", "twidere.mariotaku.org" -> handleTwidereExternalLink(uri)
|
2017-01-18 18:48:29 +01:00
|
|
|
else -> Pair(null, false)
|
2016-12-08 08:33:13 +01:00
|
|
|
}
|
2017-01-18 18:48:29 +01:00
|
|
|
if (handledIntent != null) {
|
|
|
|
handledIntent.putExtras(intent)
|
|
|
|
startActivity(handledIntent)
|
2016-12-08 08:33:13 +01:00
|
|
|
} else {
|
2017-01-18 18:48:29 +01:00
|
|
|
if (!handledSuccessfully) {
|
2020-06-08 23:07:20 +02:00
|
|
|
Analyzer.logException(TwitterLinkException("Unable to handle twitter uri $uri"))
|
2016-12-08 08:33:13 +01:00
|
|
|
}
|
|
|
|
val fallbackIntent = Intent(Intent.ACTION_VIEW, uri)
|
|
|
|
fallbackIntent.addCategory(Intent.CATEGORY_BROWSABLE)
|
|
|
|
fallbackIntent.`package` = IntentUtils.getDefaultBrowserPackage(this, uri, false)
|
|
|
|
val componentName = fallbackIntent.resolveActivity(packageManager)
|
|
|
|
if (componentName == null) {
|
|
|
|
val targetIntent = Intent(Intent.ACTION_VIEW, uri)
|
|
|
|
targetIntent.addCategory(Intent.CATEGORY_BROWSABLE)
|
2016-12-28 08:30:50 +01:00
|
|
|
startActivity(Intent.createChooser(targetIntent, getString(R.string.action_open_in_browser)))
|
2016-12-08 08:33:13 +01:00
|
|
|
} else if (!TextUtils.equals(packageName, componentName.packageName)) {
|
|
|
|
startActivity(fallbackIntent)
|
|
|
|
} else {
|
|
|
|
// TODO show error
|
|
|
|
}
|
|
|
|
}
|
|
|
|
finish()
|
|
|
|
}
|
|
|
|
|
|
|
|
override fun onStart() {
|
|
|
|
super.onStart()
|
|
|
|
setVisible(true)
|
|
|
|
}
|
|
|
|
|
2017-01-18 18:48:29 +01:00
|
|
|
private fun handleTwidereExternalLink(uri: Uri): Pair<Intent?, Boolean> {
|
|
|
|
val pathSegments = uri.pathSegments
|
|
|
|
if (pathSegments.size < 2 || pathSegments[0] != "external") {
|
|
|
|
return Pair(null, false)
|
|
|
|
}
|
|
|
|
val builder = Uri.Builder()
|
|
|
|
builder.scheme(SCHEME_TWIDERE)
|
|
|
|
builder.authority(pathSegments[1])
|
|
|
|
if (pathSegments.size >= 3) {
|
|
|
|
for (segment in pathSegments.slice(2..pathSegments.lastIndex)) {
|
|
|
|
builder.appendPath(segment)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
builder.encodedQuery(uri.encodedQuery)
|
|
|
|
builder.encodedFragment(uri.encodedFragment)
|
|
|
|
return Pair(Intent(Intent.ACTION_VIEW, builder.build()), true)
|
|
|
|
}
|
|
|
|
|
|
|
|
private fun handleFanfouLink(uri: Uri): Pair<Intent?, Boolean> {
|
2016-12-08 08:33:13 +01:00
|
|
|
val pathSegments = uri.pathSegments
|
|
|
|
if (pathSegments.size > 0) {
|
|
|
|
when (pathSegments[0]) {
|
|
|
|
"statuses" -> {
|
|
|
|
val builder = Uri.Builder()
|
|
|
|
builder.scheme(SCHEME_TWIDERE)
|
|
|
|
builder.authority(AUTHORITY_STATUS)
|
|
|
|
builder.appendQueryParameter(QUERY_PARAM_ACCOUNT_HOST, USER_TYPE_FANFOU_COM)
|
|
|
|
builder.appendQueryParameter(QUERY_PARAM_STATUS_ID, pathSegments[1])
|
2017-01-18 18:48:29 +01:00
|
|
|
return Pair(Intent(Intent.ACTION_VIEW, builder.build()), true)
|
2016-12-08 08:33:13 +01:00
|
|
|
}
|
|
|
|
else -> {
|
2017-02-04 07:13:08 +01:00
|
|
|
if (FANFOU_RESERVED_PATHS.contains(pathSegments[0])) return Pair(null, false)
|
|
|
|
if (pathSegments.size == 1) {
|
|
|
|
val builder = Uri.Builder()
|
|
|
|
builder.scheme(SCHEME_TWIDERE)
|
|
|
|
builder.authority(AUTHORITY_USER)
|
|
|
|
builder.appendQueryParameter(QUERY_PARAM_ACCOUNT_HOST, USER_TYPE_FANFOU_COM)
|
|
|
|
val userKey = UserKey(pathSegments[0], USER_TYPE_FANFOU_COM)
|
|
|
|
builder.appendQueryParameter(QUERY_PARAM_USER_KEY, userKey.toString())
|
|
|
|
return Pair(Intent(Intent.ACTION_VIEW, builder.build()), true)
|
2016-12-08 08:33:13 +01:00
|
|
|
}
|
2017-01-18 18:48:29 +01:00
|
|
|
return Pair(null, false)
|
2016-12-08 08:33:13 +01:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2017-01-18 18:48:29 +01:00
|
|
|
return Pair(null, false)
|
2016-12-08 08:33:13 +01:00
|
|
|
}
|
|
|
|
|
2017-01-18 18:48:29 +01:00
|
|
|
private fun handleTwitterLink(uri: Uri): Pair<Intent?, Boolean> {
|
2016-12-08 08:33:13 +01:00
|
|
|
val pathSegments = uri.pathSegments
|
|
|
|
if (pathSegments.size > 0) {
|
|
|
|
when (pathSegments[0]) {
|
|
|
|
"i" -> {
|
|
|
|
return getIUriIntent(uri, pathSegments)
|
|
|
|
}
|
|
|
|
"intent" -> {
|
|
|
|
return getTwitterIntentUriIntent(uri, pathSegments)
|
|
|
|
}
|
|
|
|
"share" -> {
|
|
|
|
val handledIntent = Intent(this, ComposeActivity::class.java)
|
|
|
|
handledIntent.action = Intent.ACTION_SEND
|
2017-04-20 14:04:37 +02:00
|
|
|
handledIntent.putExtra(Intent.EXTRA_TEXT, uri.getQueryParameter("text"))
|
|
|
|
handledIntent.putExtra(Intent.EXTRA_SUBJECT, uri.getQueryParameter("url"))
|
2017-01-18 18:48:29 +01:00
|
|
|
return Pair(handledIntent, true)
|
2016-12-08 08:33:13 +01:00
|
|
|
}
|
|
|
|
"search" -> {
|
|
|
|
val builder = Uri.Builder()
|
|
|
|
builder.scheme(SCHEME_TWIDERE)
|
|
|
|
builder.authority(AUTHORITY_SEARCH)
|
|
|
|
builder.appendQueryParameter(QUERY_PARAM_ACCOUNT_HOST, USER_TYPE_TWITTER_COM)
|
|
|
|
builder.appendQueryParameter(QUERY_PARAM_QUERY, uri.getQueryParameter("q"))
|
2017-01-18 18:48:29 +01:00
|
|
|
return Pair(Intent(Intent.ACTION_VIEW, builder.build()), true)
|
2016-12-08 08:33:13 +01:00
|
|
|
}
|
|
|
|
"hashtag" -> {
|
|
|
|
val builder = Uri.Builder()
|
|
|
|
builder.scheme(SCHEME_TWIDERE)
|
|
|
|
builder.authority(AUTHORITY_SEARCH)
|
|
|
|
builder.appendQueryParameter(QUERY_PARAM_ACCOUNT_HOST, USER_TYPE_TWITTER_COM)
|
|
|
|
builder.appendQueryParameter(QUERY_PARAM_QUERY, "#${uri.lastPathSegment}")
|
2017-01-18 18:48:29 +01:00
|
|
|
return Pair(Intent(Intent.ACTION_VIEW, builder.build()), true)
|
2016-12-08 08:33:13 +01:00
|
|
|
}
|
|
|
|
"following" -> {
|
|
|
|
val builder = Uri.Builder()
|
|
|
|
builder.scheme(SCHEME_TWIDERE)
|
|
|
|
builder.authority(AUTHORITY_USER_FRIENDS)
|
2017-03-10 09:37:35 +01:00
|
|
|
builder.appendQueryParameter(QUERY_PARAM_USER_KEY, UserKey.SELF.toString())
|
2017-01-18 18:48:29 +01:00
|
|
|
return Pair(Intent(Intent.ACTION_VIEW, builder.build()), true)
|
2016-12-08 08:33:13 +01:00
|
|
|
}
|
|
|
|
"followers" -> {
|
|
|
|
val builder = Uri.Builder()
|
|
|
|
builder.scheme(SCHEME_TWIDERE)
|
|
|
|
builder.authority(AUTHORITY_USER_FOLLOWERS)
|
2017-03-10 09:37:35 +01:00
|
|
|
builder.appendQueryParameter(QUERY_PARAM_USER_KEY, UserKey.SELF.toString())
|
2017-01-18 18:48:29 +01:00
|
|
|
return Pair(Intent(Intent.ACTION_VIEW, builder.build()), true)
|
2016-12-08 08:33:13 +01:00
|
|
|
}
|
|
|
|
"favorites" -> {
|
|
|
|
val builder = Uri.Builder()
|
|
|
|
builder.scheme(SCHEME_TWIDERE)
|
|
|
|
builder.authority(AUTHORITY_USER_FAVORITES)
|
2017-03-10 09:37:35 +01:00
|
|
|
builder.appendQueryParameter(QUERY_PARAM_USER_KEY, UserKey.SELF.toString())
|
2017-01-18 18:48:29 +01:00
|
|
|
return Pair(Intent(Intent.ACTION_VIEW, builder.build()), true)
|
2016-12-08 08:33:13 +01:00
|
|
|
}
|
|
|
|
else -> {
|
2017-04-07 06:12:34 +02:00
|
|
|
if (pathSegments[0] in TWITTER_RESERVED_PATHS) {
|
2017-01-18 18:48:29 +01:00
|
|
|
return Pair(null, true)
|
2016-12-08 08:33:13 +01:00
|
|
|
}
|
|
|
|
return handleUserSpecificPageIntent(uri, pathSegments, pathSegments[0])
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2017-04-15 10:18:01 +02:00
|
|
|
val homeIntent = Intent(this, HomeActivity::class.java)
|
|
|
|
return Pair(homeIntent, true)
|
2016-12-08 08:33:13 +01:00
|
|
|
}
|
|
|
|
|
2017-01-18 18:48:29 +01:00
|
|
|
private fun handleUserSpecificPageIntent(uri: Uri, pathSegments: List<String>, screenName: String): Pair<Intent?, Boolean> {
|
2016-12-08 08:33:13 +01:00
|
|
|
val segsSize = pathSegments.size
|
|
|
|
if (segsSize == 1) {
|
|
|
|
val builder = Uri.Builder()
|
|
|
|
builder.scheme(SCHEME_TWIDERE)
|
|
|
|
builder.authority(AUTHORITY_USER)
|
|
|
|
builder.appendQueryParameter(QUERY_PARAM_ACCOUNT_HOST, USER_TYPE_TWITTER_COM)
|
|
|
|
builder.appendQueryParameter(QUERY_PARAM_SCREEN_NAME, screenName)
|
2017-01-18 18:48:29 +01:00
|
|
|
return Pair(Intent(Intent.ACTION_VIEW, builder.build()), true)
|
2016-12-08 08:33:13 +01:00
|
|
|
} else if (segsSize == 2) {
|
|
|
|
when (pathSegments[1]) {
|
|
|
|
"following" -> {
|
|
|
|
val builder = Uri.Builder()
|
|
|
|
builder.scheme(SCHEME_TWIDERE)
|
|
|
|
builder.authority(AUTHORITY_USER_FRIENDS)
|
|
|
|
builder.appendQueryParameter(QUERY_PARAM_ACCOUNT_HOST, USER_TYPE_TWITTER_COM)
|
|
|
|
builder.appendQueryParameter(QUERY_PARAM_SCREEN_NAME, screenName)
|
2017-01-18 18:48:29 +01:00
|
|
|
return Pair(Intent(Intent.ACTION_VIEW, builder.build()), true)
|
2016-12-08 08:33:13 +01:00
|
|
|
}
|
|
|
|
"followers" -> {
|
|
|
|
val builder = Uri.Builder()
|
|
|
|
builder.scheme(SCHEME_TWIDERE)
|
|
|
|
builder.authority(AUTHORITY_USER_FOLLOWERS)
|
|
|
|
builder.appendQueryParameter(QUERY_PARAM_ACCOUNT_HOST, USER_TYPE_TWITTER_COM)
|
|
|
|
builder.appendQueryParameter(QUERY_PARAM_SCREEN_NAME, screenName)
|
2017-01-18 18:48:29 +01:00
|
|
|
return Pair(Intent(Intent.ACTION_VIEW, builder.build()), true)
|
2016-12-08 08:33:13 +01:00
|
|
|
}
|
|
|
|
"favorites" -> {
|
|
|
|
val builder = Uri.Builder()
|
|
|
|
builder.scheme(SCHEME_TWIDERE)
|
|
|
|
builder.authority(AUTHORITY_USER_FAVORITES)
|
|
|
|
builder.appendQueryParameter(QUERY_PARAM_ACCOUNT_HOST, USER_TYPE_TWITTER_COM)
|
|
|
|
builder.appendQueryParameter(QUERY_PARAM_SCREEN_NAME, screenName)
|
2017-01-18 18:48:29 +01:00
|
|
|
return Pair(Intent(Intent.ACTION_VIEW, builder.build()), true)
|
2016-12-08 08:33:13 +01:00
|
|
|
}
|
|
|
|
else -> {
|
|
|
|
val builder = Uri.Builder()
|
|
|
|
builder.scheme(SCHEME_TWIDERE)
|
|
|
|
builder.authority(AUTHORITY_USER_LIST)
|
|
|
|
builder.appendQueryParameter(QUERY_PARAM_ACCOUNT_HOST, USER_TYPE_TWITTER_COM)
|
|
|
|
builder.appendQueryParameter(QUERY_PARAM_SCREEN_NAME, screenName)
|
|
|
|
builder.appendQueryParameter(QUERY_PARAM_LIST_NAME, pathSegments[1])
|
2017-01-18 18:48:29 +01:00
|
|
|
return Pair(Intent(Intent.ACTION_VIEW, builder.build()), true)
|
2016-12-08 08:33:13 +01:00
|
|
|
}
|
|
|
|
}
|
|
|
|
} else if (segsSize >= 3) {
|
2017-04-07 06:12:34 +02:00
|
|
|
if ("status" == pathSegments[1] && pathSegments[2].toLongOr(-1L) != -1L) {
|
2016-12-08 08:33:13 +01:00
|
|
|
val builder = Uri.Builder()
|
|
|
|
builder.scheme(SCHEME_TWIDERE)
|
|
|
|
builder.authority(AUTHORITY_STATUS)
|
|
|
|
builder.appendQueryParameter(QUERY_PARAM_ACCOUNT_HOST, USER_TYPE_TWITTER_COM)
|
|
|
|
builder.appendQueryParameter(QUERY_PARAM_STATUS_ID, pathSegments[2])
|
2017-01-18 18:48:29 +01:00
|
|
|
return Pair(Intent(Intent.ACTION_VIEW, builder.build()), true)
|
2016-12-08 08:33:13 +01:00
|
|
|
} else {
|
|
|
|
when (pathSegments[2]) {
|
|
|
|
"members" -> {
|
|
|
|
val builder = Uri.Builder()
|
|
|
|
builder.scheme(SCHEME_TWIDERE)
|
|
|
|
builder.authority(AUTHORITY_USER_LIST_MEMBERS)
|
|
|
|
builder.appendQueryParameter(QUERY_PARAM_ACCOUNT_HOST, USER_TYPE_TWITTER_COM)
|
|
|
|
builder.appendQueryParameter(QUERY_PARAM_SCREEN_NAME, screenName)
|
|
|
|
builder.appendQueryParameter(QUERY_PARAM_LIST_NAME, pathSegments[1])
|
2017-01-18 18:48:29 +01:00
|
|
|
return Pair(Intent(Intent.ACTION_VIEW, builder.build()), true)
|
2016-12-08 08:33:13 +01:00
|
|
|
}
|
|
|
|
"subscribers" -> {
|
|
|
|
val builder = Uri.Builder()
|
|
|
|
builder.scheme(SCHEME_TWIDERE)
|
|
|
|
builder.authority(AUTHORITY_USER_LIST_SUBSCRIBERS)
|
|
|
|
builder.appendQueryParameter(QUERY_PARAM_ACCOUNT_HOST, USER_TYPE_TWITTER_COM)
|
|
|
|
builder.appendQueryParameter(QUERY_PARAM_SCREEN_NAME, screenName)
|
|
|
|
builder.appendQueryParameter(QUERY_PARAM_LIST_NAME, pathSegments[1])
|
2017-01-18 18:48:29 +01:00
|
|
|
return Pair(Intent(Intent.ACTION_VIEW, builder.build()), true)
|
2016-12-08 08:33:13 +01:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2017-01-18 18:48:29 +01:00
|
|
|
return Pair(null, false)
|
2016-12-08 08:33:13 +01:00
|
|
|
}
|
|
|
|
|
2017-01-18 18:48:29 +01:00
|
|
|
private fun getTwitterIntentUriIntent(uri: Uri, pathSegments: List<String>): Pair<Intent?, Boolean> {
|
|
|
|
if (pathSegments.size < 2) return Pair(null, false)
|
2016-12-08 08:33:13 +01:00
|
|
|
when (pathSegments[1]) {
|
|
|
|
"tweet" -> {
|
|
|
|
val handledIntent = Intent(this, ComposeActivity::class.java)
|
|
|
|
handledIntent.action = Intent.ACTION_SEND
|
|
|
|
val text = uri.getQueryParameter("text")
|
|
|
|
val url = uri.getQueryParameter("url")
|
2017-01-12 18:29:15 +01:00
|
|
|
val sb = StringBuilder()
|
|
|
|
if (!text.isNullOrEmpty()) {
|
|
|
|
sb.append(text)
|
|
|
|
}
|
|
|
|
if (!url.isNullOrEmpty()) {
|
2020-06-08 23:07:20 +02:00
|
|
|
if (sb.isNotEmpty()) {
|
2017-01-12 18:29:15 +01:00
|
|
|
sb.append(" ")
|
|
|
|
}
|
|
|
|
sb.append(url)
|
|
|
|
}
|
|
|
|
handledIntent.putExtra(Intent.EXTRA_TEXT, sb.toString())
|
2017-01-18 18:48:29 +01:00
|
|
|
return Pair(handledIntent, true)
|
2016-12-08 08:33:13 +01:00
|
|
|
}
|
2017-04-12 13:25:10 +02:00
|
|
|
"retweet" -> {
|
2017-01-28 11:43:58 +01:00
|
|
|
val tweetId = uri.getQueryParameter("tweet_id") ?: return Pair(null, false)
|
2017-04-12 13:25:10 +02:00
|
|
|
val accountHost = USER_TYPE_TWITTER_COM
|
|
|
|
val intent = Intent(this, RetweetQuoteDialogActivity::class.java)
|
|
|
|
intent.putExtra(EXTRA_STATUS_ID, tweetId)
|
|
|
|
intent.putExtra(EXTRA_ACCOUNT_HOST, accountHost)
|
|
|
|
return Pair(intent, true)
|
|
|
|
}
|
|
|
|
"favorite", "like" -> {
|
|
|
|
val tweetId = uri.getQueryParameter("tweet_id") ?: return Pair(null, false)
|
|
|
|
val accountHost = USER_TYPE_TWITTER_COM
|
|
|
|
val intent = Intent(this, FavoriteConfirmDialogActivity::class.java)
|
|
|
|
intent.putExtra(EXTRA_STATUS_ID, tweetId)
|
|
|
|
intent.putExtra(EXTRA_ACCOUNT_HOST, accountHost)
|
|
|
|
return Pair(intent, true)
|
2017-01-28 11:43:58 +01:00
|
|
|
}
|
2017-02-25 15:05:52 +01:00
|
|
|
"user", "follow" -> {
|
|
|
|
val userKey = uri.getQueryParameter("user_id")?.let { UserKey(it, "twitter.com") }
|
|
|
|
val screenName = uri.getQueryParameter("screen_name")
|
2017-08-28 06:31:19 +02:00
|
|
|
return Pair(IntentUtils.userProfile(accountKey = null, userKey = userKey,
|
|
|
|
screenName = screenName, accountHost = USER_TYPE_TWITTER_COM), true)
|
2017-02-25 15:05:52 +01:00
|
|
|
}
|
2016-12-08 08:33:13 +01:00
|
|
|
}
|
2017-01-18 18:48:29 +01:00
|
|
|
return Pair(null, false)
|
2016-12-08 08:33:13 +01:00
|
|
|
}
|
|
|
|
|
2017-01-18 18:48:29 +01:00
|
|
|
private fun getIUriIntent(uri: Uri, pathSegments: List<String>): Pair<Intent?, Boolean> {
|
2017-04-15 10:18:01 +02:00
|
|
|
if (pathSegments.size < 2) return Pair(null, false)
|
|
|
|
when (pathSegments[1]) {
|
|
|
|
"moments" -> {
|
|
|
|
val preferences = DependencyHolder.get(this).preferences
|
|
|
|
val (intent, _) = IntentUtils.browse(this, preferences, userTheme, uri, true)
|
|
|
|
return Pair(intent, true)
|
|
|
|
}
|
|
|
|
"web" -> {
|
|
|
|
if (pathSegments.size < 3) return Pair(null, false)
|
|
|
|
when (pathSegments[2]) {
|
|
|
|
"status" -> {
|
|
|
|
if (pathSegments.size < 4) return Pair(null, false)
|
|
|
|
val builder = Uri.Builder()
|
|
|
|
builder.scheme(SCHEME_TWIDERE)
|
|
|
|
builder.authority(AUTHORITY_STATUS)
|
|
|
|
builder.appendQueryParameter(QUERY_PARAM_ACCOUNT_HOST, USER_TYPE_TWITTER_COM)
|
|
|
|
builder.appendQueryParameter(QUERY_PARAM_STATUS_ID, pathSegments[3])
|
|
|
|
return Pair(Intent(Intent.ACTION_VIEW, builder.build()), true)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2017-04-17 11:51:16 +02:00
|
|
|
"redirect" -> {
|
|
|
|
val url = uri.getQueryParameter("url")?.let(Uri::parse) ?: return Pair(null, false)
|
|
|
|
val preferences = DependencyHolder.get(this).preferences
|
|
|
|
val (intent, _) = IntentUtils.browse(this, preferences, userTheme, url, false)
|
|
|
|
return Pair(intent, true)
|
|
|
|
}
|
2017-04-15 10:18:01 +02:00
|
|
|
}
|
2017-01-18 18:48:29 +01:00
|
|
|
return Pair(null, false)
|
2016-12-08 08:33:13 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
private inner class TwitterLinkException(s: String) : Exception(s)
|
|
|
|
|
|
|
|
companion object {
|
|
|
|
|
2017-01-13 07:51:35 +01:00
|
|
|
val TWITTER_RESERVED_PATHS = arrayOf("about", "account", "accounts", "activity", "all",
|
|
|
|
"announcements", "anywhere", "api_rules", "api_terms", "apirules", "apps", "auth",
|
|
|
|
"badges", "blog", "business", "buttons", "contacts", "devices", "direct_messages",
|
|
|
|
"download", "downloads", "edit_announcements", "faq", "favorites", "find_sources",
|
|
|
|
"find_users", "followers", "following", "friend_request", "friendrequest", "friends",
|
|
|
|
"goodies", "help", "home", "im_account", "inbox", "invitations", "invite", "jobs",
|
|
|
|
"list", "login", "logo", "logout", "me", "mentions", "messages", "mockview",
|
|
|
|
"newtwitter", "notifications", "nudge", "oauth", "phoenix_search", "positions",
|
|
|
|
"privacy", "public_timeline", "related_tweets", "replies", "retweeted_of_mine",
|
|
|
|
"retweets", "retweets_by_others", "rules", "saved_searches", "search", "sent",
|
|
|
|
"settings", "share", "signup", "signin", "similar_to", "statistics", "terms", "tos",
|
|
|
|
"translate", "trends", "tweetbutton", "twttr", "update_discoverability", "users",
|
|
|
|
"welcome", "who_to_follow", "widgets", "zendesk_auth", "media_signup")
|
2016-12-08 08:33:13 +01:00
|
|
|
|
2017-01-13 07:51:35 +01:00
|
|
|
val FANFOU_RESERVED_PATHS = arrayOf("home", "privatemsg", "finder", "browse", "search",
|
|
|
|
"settings", "message", "mentions", "favorites", "friends", "followers", "sharer",
|
|
|
|
"photo", "album", "paipai", "q", "userview", "dialogue")
|
2016-12-08 08:33:13 +01:00
|
|
|
|
|
|
|
|
2020-06-08 23:11:06 +02:00
|
|
|
private const val AUTHORITY_TWITTER_COM = "twitter.com"
|
2016-12-08 08:33:13 +01:00
|
|
|
|
|
|
|
|
|
|
|
private fun regulateTwitterUri(data: Uri): Uri {
|
|
|
|
val encodedFragment = data.encodedFragment
|
|
|
|
if (encodedFragment != null && encodedFragment.startsWith("!/")) {
|
|
|
|
return regulateTwitterUri(Uri.parse("https://twitter.com" + encodedFragment.substring(1)))
|
|
|
|
}
|
|
|
|
val builder = data.buildUpon()
|
|
|
|
builder.scheme("https")
|
|
|
|
builder.authority(AUTHORITY_TWITTER_COM)
|
|
|
|
return builder.build()
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|