Skip to content

Commit

Permalink
feat: url 支持仅传入 path 和 parameter
Browse files Browse the repository at this point in the history
  • Loading branch information
wangchenyan committed Sep 26, 2022
1 parent 48f8d8c commit 5b2ff2a
Show file tree
Hide file tree
Showing 5 changed files with 34 additions and 13 deletions.
4 changes: 2 additions & 2 deletions crouter-api/src/main/java/me/wcy/router/CRouter.kt
Original file line number Diff line number Diff line change
Expand Up @@ -17,8 +17,8 @@ object CRouter {
/**
* 设置路由客户端,不设置则使用默认客户端
*/
fun setRouterClient(routerClient: RouterClient) {
this.routerClient = routerClient
fun setRouterClient(client: RouterClient) {
this.routerClient = client
}

/**
Expand Down
10 changes: 10 additions & 0 deletions crouter-api/src/main/java/me/wcy/router/RouterClient.kt
Original file line number Diff line number Diff line change
Expand Up @@ -10,13 +10,15 @@ import java.util.Collections
*/
class RouterClient : Call.Factory {
private val interceptors: MutableList<Interceptor>
private val baseUrl: String?
private val loginProvider: ((context: Context, callback: () -> Unit) -> Unit)?
private val fragmentContainerIntentProvider: ((context: Context) -> Intent)?

constructor() : this(Builder())

internal constructor(builder: Builder) {
this.interceptors = Collections.unmodifiableList(ArrayList(builder.interceptors))
this.baseUrl = builder.baseUrl
this.loginProvider = builder.loginProvider
this.fragmentContainerIntentProvider = builder.fragmentContainerIntentProvider

Expand All @@ -29,6 +31,8 @@ class RouterClient : Call.Factory {
return interceptors
}

fun baseUrl() = baseUrl

fun loginProvider(): ((context: Context, callback: () -> Unit) -> Unit)? {
return loginProvider
}
Expand All @@ -47,6 +51,7 @@ class RouterClient : Call.Factory {

class Builder {
internal val interceptors: MutableList<Interceptor> = ArrayList()
internal var baseUrl: String? = null
internal var loginProvider: ((context: Context, callback: () -> Unit) -> Unit)? = null
internal var fragmentContainerIntentProvider: ((context: Context) -> Intent)? = null

Expand All @@ -69,6 +74,11 @@ class RouterClient : Call.Factory {
return this
}

fun baseUrl(baseUrl: String): Builder {
this.baseUrl = baseUrl
return this
}

/**
* 设置登录提供者。设置后 [Router.needLogin] 才能生效
*/
Expand Down
22 changes: 16 additions & 6 deletions crouter-api/src/main/java/me/wcy/router/RouterUtils.kt
Original file line number Diff line number Diff line change
Expand Up @@ -12,18 +12,28 @@ object RouterUtils {
* 判断路由是否匹配 URL
*/
fun match(route: Route, uri: Uri): Boolean {
val routeUrl = formatUrl(route.url())
val targetUrl = formatUrl(uri.scheme + "://" + uri.host + uri.path)
val routeUrl = route.url().formatUrl()
var targetUrl = if (uri.scheme.isNullOrEmpty()
&& uri.host.isNullOrEmpty()
&& CRouter.getRouterClient().baseUrl()?.isNotEmpty() == true
) {
CRouter.getRouterClient().baseUrl() + uri.path
} else {
uri.scheme + "://" + uri.host + uri.path
}
targetUrl = targetUrl.formatUrl()
return Regex(routeUrl).matches(targetUrl)
}

/**
* 格式化 URL,移除重复的 '/' 和最后一个 '/'
* 格式化 URL
* - 移除重复的 '/'
* - 移除最后一个 '/'
*/
private fun formatUrl(url: String): String {
val list = url.split(Regex("://"))
private fun String.formatUrl(): String {
val list = this.split(Regex("://"))
if (list.size != 2) {
throw IllegalArgumentException("url '$url' is illegal")
throw IllegalArgumentException("url '$this' is illegal")
}
val scheme = list[0]
var path = list[1].replace(Regex("/+"), "/")
Expand Down
8 changes: 4 additions & 4 deletions crouter-compiler/src/main/java/me/wcy/crouter/compiler/Log.kt
Original file line number Diff line number Diff line change
Expand Up @@ -14,21 +14,21 @@ object Log {
}

fun i(msg: String) {
sMessenger?.printMessage(Diagnostic.Kind.NOTE, msg + "\r\n")
sMessenger?.printMessage(Diagnostic.Kind.NOTE, msg + "\n")
}

fun w(msg: String) {
sMessenger?.printMessage(Diagnostic.Kind.WARNING, msg + "\r\n")
sMessenger?.printMessage(Diagnostic.Kind.WARNING, msg + "\n")
}

fun e(msg: String) {
sMessenger?.printMessage(Diagnostic.Kind.ERROR, msg + "\r\n")
sMessenger?.printMessage(Diagnostic.Kind.ERROR, msg + "\n")
}

fun e(msg: String, tr: Throwable) {
sMessenger?.printMessage(
Diagnostic.Kind.ERROR,
msg + "\r\n" + getStackTraceString(tr) + "\r\n"
msg + "\n" + getStackTraceString(tr) + "\n"
)
}

Expand Down
3 changes: 2 additions & 1 deletion sample/src/main/java/me/wcy/crouter/example/MainActivity.kt
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@ class MainActivity : BaseActivity() {

CRouter.setRouterClient(
RouterClient.Builder()
.baseUrl("https://host.com")
.loginProvider { context, callback ->
Toast.makeText(this@MainActivity, "拦截登录", Toast.LENGTH_SHORT).show()
CRouter.with(context)
Expand All @@ -37,7 +38,7 @@ class MainActivity : BaseActivity() {

button1.setOnClickListener {
CRouter.with(this)
.url("https://host.com/target.html")
.url("/target.html")
.startForResult { it ->
if (it.isSuccess("key")) {
val value = it.data?.getStringExtra("key")
Expand Down

0 comments on commit 5b2ff2a

Please sign in to comment.