refactor: Simplify router URL resolution

This commit is contained in:
Isira Seneviratne 2023-09-06 08:10:20 +05:30
parent 41c35c5392
commit 77a756d5c5

View File

@ -14,12 +14,11 @@ import com.github.libretube.util.TextUtils.toTimeInSeconds
class RouterActivity : BaseActivity() { class RouterActivity : BaseActivity() {
override fun onCreate(savedInstanceState: Bundle?) { override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState) super.onCreate(savedInstanceState)
if (intent.getStringExtra(Intent.EXTRA_TEXT) != null) { val uri = intent.getStringExtra(Intent.EXTRA_TEXT)?.toUri() ?: intent.data
// start processing the given text if (uri != null) {
handleSendText(intent.getStringExtra(Intent.EXTRA_TEXT)!!.toUri()) // Start processing the given text, if available. Otherwise use the link shared as text
} else if (intent.data != null) { // to the app.
// link shared as text to the app handleSendText(uri)
handleSendText(intent.data!!)
} else { } else {
// start app as normal if unknown action, shouldn't be reachable // start app as normal if unknown action, shouldn't be reachable
NavigationHelper.restartMainActivity(this) NavigationHelper.restartMainActivity(this)
@ -30,65 +29,25 @@ class RouterActivity : BaseActivity() {
* Resolve the uri and return a bundle with the arguments * Resolve the uri and return a bundle with the arguments
*/ */
private fun Intent.resolveType(uri: Uri) = apply { private fun Intent.resolveType(uri: Uri) = apply {
val channelNamePaths = listOf("/c/", "/user/") val lastSegment = uri.lastPathSegment
val videoPaths = listOf("/shorts/", "/embed/", "/v/", "/live/") val secondLastSegment = uri.pathSegments.getOrNull(uri.pathSegments.size - 2)
when { when {
uri.path!!.contains("/results") -> { lastSegment == "results" -> {
val searchQuery = uri.getQueryParameter("search_query") putExtra(IntentData.query, uri.getQueryParameter("search_query"))
putExtra(IntentData.query, searchQuery)
} }
secondLastSegment == "channel" -> {
uri.path!!.contains("/channel/") -> { putExtra(IntentData.channelId, lastSegment)
val channelId = uri.path!!
.replace("/channel/", "")
putExtra(IntentData.channelId, channelId)
} }
secondLastSegment == "c" || secondLastSegment == "user" -> {
channelNamePaths.any { uri.path!!.contains(it) } -> { putExtra(IntentData.channelName, lastSegment)
var channelName = uri.path!!
channelNamePaths.forEach {
channelName = channelName.replace(it, "")
}
putExtra(IntentData.channelName, channelName)
} }
lastSegment == "playlist" -> {
uri.path!!.contains("/playlist") -> { putExtra(IntentData.playlistId, uri.getQueryParameter("list"))
val playlistId = uri.getQueryParameter("list")
putExtra(IntentData.playlistId, playlistId)
} }
videoPaths.any { uri.path!!.contains(it) } -> {
var videoId = uri.path!!
videoPaths.forEach {
videoId = videoId.replace(it, "")
}
putExtra(IntentData.videoId, videoId)
uri.getQueryParameter("t")
?.let { putExtra(IntentData.timeStamp, it.toTimeInSeconds()) }
}
uri.path!!.contains("/watch") && uri.query != null -> {
val videoId = uri.getQueryParameter("v")
putExtra(IntentData.videoId, videoId)
uri.getQueryParameter("t")
?.let { putExtra(IntentData.timeStamp, it.toTimeInSeconds()) }
}
else -> { else -> {
val videoId = uri.path!!.replace("/", "") val id = if (lastSegment == "watch") uri.getQueryParameter("v") else lastSegment
putExtra(IntentData.videoId, id)
putExtra(IntentData.videoId, videoId) putExtra(IntentData.timeStamp, uri.getQueryParameter("t")?.toTimeInSeconds())
uri.getQueryParameter("t")
?.let { putExtra(IntentData.timeStamp, it.toTimeInSeconds()) }
} }
} }
} }
@ -96,9 +55,7 @@ class RouterActivity : BaseActivity() {
private fun handleSendText(uri: Uri) { private fun handleSendText(uri: Uri) {
Log.i(TAG(), uri.toString()) Log.i(TAG(), uri.toString())
val intent = this.packageManager.getLaunchIntentForPackage( val intent = packageManager.getLaunchIntentForPackage(packageName)!!.resolveType(uri)
this.packageName
)!!.resolveType(uri)
intent.flags = Intent.FLAG_ACTIVITY_CLEAR_TASK intent.flags = Intent.FLAG_ACTIVITY_CLEAR_TASK
startActivity(intent) startActivity(intent)
finishAndRemoveTask() finishAndRemoveTask()