OXYGENHUB
# 8440d51a2275 oxygenhub-android / app / src / main / java / io / oxygenhub / android / ui / nav / Links.kt
2.2 KiB · last changed Account and organisation pages 10 days ago source blame history raw
1
package io.oxygenhub.android.ui.nav
2
3
import java.net.URI
4
5
/**
6
 * The app's own screen for a page of the hub (Andy, 2026-10-25: whatever
7
 * is tapped in the inbox opens natively): an issue, proposal, run, change,
8
 * file, history, board, repository, account or organisation. Null for a page the app does not
9
 * show itself, or another site's, which the browser opens.
10
 */
11
fun routeFor(url: String, hub: String): Any? {
12
    val u = runCatching { URI(url) }.getOrNull() ?: return null
13
    val home = runCatching { URI(hub) }.getOrNull() ?: return null
14
    if (u.host != null && !u.host.equals(home.host, ignoreCase = true)) return null
15
    val parts = (u.rawPath ?: "").split('/').filter { it.isNotEmpty() }.map { java.net.URLDecoder.decode(it, "UTF-8") }
16
    if (parts.size >= 3 && parts[0] == "projects") {
17
        return parts[2].toLongOrNull()?.let { BoardRoute(parts[1], it) }
18
    }
19
    if (parts.size == 2 && parts[0] == "orgs") return OwnerRoute(parts[1])
20
    if (parts.size == 1 && parts[0] !in HUB_PAGES) return OwnerRoute(parts[0])
21
    if (parts.size < 2 || parts[0] in HUB_PAGES) return null
22
    val (owner, name) = parts[0] to parts[1]
23
    val rest = parts.drop(2)
24
    return when (rest.firstOrNull()) {
25
        null -> IssuesRoute(owner, name)
26
        "issue" -> rest.getOrNull(1)?.toLongOrNull()?.let { IssueRoute(owner, name, it) }
27
        "proposal" -> rest.getOrNull(1)?.toLongOrNull()?.let { ProposalRoute(owner, name, it) }
28
        "flow" -> rest.getOrNull(1)?.toLongOrNull()?.let { RunRoute(owner, name, it) }
29
        "change" -> rest.getOrNull(1)?.let { ChangeRoute(owner, name, it) }
30
        "file" -> if (rest.size >= 3) FileRoute(owner, name, rest[1], rest.drop(2).joinToString("/")) else null
31
        "changes" -> rest.getOrNull(1)?.let { HistoryRoute(owner, name, it) }
32
        else -> null
33
    }
34
}
35
36
/** The hub's own top-level pages: never an owner's name. */
37
private val HUB_PAGES = setOf(
38
    "about", "admin", "api", "apt", "avatar", "device", "drops", "explore", "health", "help", "insights", "live", "log",
39
    "login", "logout", "metrics", "new", "notifications", "orgs", "register", "search", "security-contact", "settings",
40
    "sky", "static", "verify", ".well-known",
41
)