diff --git a/pluto-kotlin-client-sdk/build.gradle b/pluto-kotlin-client-sdk/build.gradle index 3cdd7cd..9106f40 100644 --- a/pluto-kotlin-client-sdk/build.gradle +++ b/pluto-kotlin-client-sdk/build.gradle @@ -4,7 +4,7 @@ apply plugin: 'kotlin-android-extensions' apply plugin: 'maven-publish' buildscript { - ext.versionCode = 11 + ext.versionCode = 12 ext.versionName = '0.5' } @@ -28,7 +28,6 @@ android { proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' } } - } task sourceJar(type: Jar) { diff --git a/pluto-kotlin-client-sdk/src/main/java/com/mushare/plutosdk/Pluto+Binding.kt b/pluto-kotlin-client-sdk/src/main/java/com/mushare/plutosdk/Pluto+Binding.kt new file mode 100644 index 0000000..af88e3d --- /dev/null +++ b/pluto-kotlin-client-sdk/src/main/java/com/mushare/plutosdk/Pluto+Binding.kt @@ -0,0 +1,111 @@ +package com.mushare.plutosdk + +import retrofit2.Call +import retrofit2.Callback +import retrofit2.Response + +val availableLoginTypes: Array + get() = arrayOf(Pluto.LoginType.mail, Pluto.LoginType.mail) + +val Pluto.availableBindings: Array? + get() = data.user?.bindings + +fun Pluto.bind( + type: Pluto.LoginType, + authString: String, + success: () -> Unit, + error: ((PlutoError) -> Unit)? = null, + handler: Pluto.PlutoRequestHandler? = null +) { + getAuthorizationHeader( + completion = { header -> + if (header == null) { + handler?.setCall(null) + error?.invoke(PlutoError.notSignIn) + return@getAuthorizationHeader + } + + val postData = when (type) { + Pluto.LoginType.mail -> { + BindPostData( + type = type.identifier, + mail = authString + ) + } + Pluto.LoginType.google -> { + BindPostData( + type = type.identifier, + idToken = authString + ) + } + } + plutoService.bind(postData, header).apply { + enqueue(object : Callback { + override fun onFailure(call: Call, t: Throwable) { + t.printStackTrace() + error?.invoke(PlutoError.badRequest) + } + + override fun onResponse( + call: Call, + response: Response + ) { + val plutoResponse = response.body() + if (plutoResponse != null) { + if (plutoResponse.statusOK()) { + success() + } else { + error?.invoke(plutoResponse.errorCode()) + } + } else { + error?.invoke(parseErrorCodeFromErrorBody(response.errorBody(), gson)) + } + } + }) + } + } + ) +} + +fun Pluto.unbind( + type: Pluto.LoginType, + success: () -> Unit, + error: ((PlutoError) -> Unit)? = null, + handler: Pluto.PlutoRequestHandler? = null +) { + getAuthorizationHeader( + completion = { header -> + if (header == null) { + handler?.setCall(null) + error?.invoke(PlutoError.notSignIn) + return@getAuthorizationHeader + } + + val postData = UnbindPostData(type.identifier) + plutoService.unbind(postData, header).apply { + enqueue(object : Callback { + override fun onFailure(call: Call, t: Throwable) { + t.printStackTrace() + error?.invoke(PlutoError.badRequest) + } + + override fun onResponse( + call: Call, + response: Response + ) { + val plutoResponse = response.body() + if (plutoResponse != null) { + if (plutoResponse.statusOK()) { + success() + } else { + error?.invoke(plutoResponse.errorCode()) + } + } else { + error?.invoke(parseErrorCodeFromErrorBody(response.errorBody(), gson)) + } + } + }) + } + } + ) +} \ No newline at end of file diff --git a/pluto-kotlin-client-sdk/src/main/java/com/mushare/plutosdk/Pluto.kt b/pluto-kotlin-client-sdk/src/main/java/com/mushare/plutosdk/Pluto.kt index 23a92d8..bcecb1f 100644 --- a/pluto-kotlin-client-sdk/src/main/java/com/mushare/plutosdk/Pluto.kt +++ b/pluto-kotlin-client-sdk/src/main/java/com/mushare/plutosdk/Pluto.kt @@ -30,6 +30,20 @@ class Pluto private constructor() { } } + enum class LoginType(val identifier: String) { + mail("mail"), + google("google"); + // TODO: wechat + + companion object { + private val map = values().associateBy(LoginType::identifier) + + fun from(identifier: String): LoginType? { + return map.getValue(identifier) + } + } + } + internal val data by lazy { PlutoModel(context) } val state: MutableLiveData by lazy { diff --git a/pluto-kotlin-client-sdk/src/main/java/com/mushare/plutosdk/PlutoModel.kt b/pluto-kotlin-client-sdk/src/main/java/com/mushare/plutosdk/PlutoModel.kt index e439e5b..cb1107d 100644 --- a/pluto-kotlin-client-sdk/src/main/java/com/mushare/plutosdk/PlutoModel.kt +++ b/pluto-kotlin-client-sdk/src/main/java/com/mushare/plutosdk/PlutoModel.kt @@ -108,5 +108,11 @@ data class PlutoUser( @field:SerializedName("user_id") var userId: String, @field:SerializedName("user_id_updated") var userIdUpdated: Boolean, @field:SerializedName("avatar") var avatar: String, - @field:SerializedName("name") var name: String + @field:SerializedName("name") var name: String, + @field:SerializedName("bindings") var bindings: Array +) + +data class PlutoUserBinding( + @field:SerializedName("login_type") val loginType: Pluto.LoginType, + @field:SerializedName("mail") var mail: String? ) \ No newline at end of file diff --git a/pluto-kotlin-client-sdk/src/main/java/com/mushare/plutosdk/PlutoService.kt b/pluto-kotlin-client-sdk/src/main/java/com/mushare/plutosdk/PlutoService.kt index 7225bb1..0000f7b 100644 --- a/pluto-kotlin-client-sdk/src/main/java/com/mushare/plutosdk/PlutoService.kt +++ b/pluto-kotlin-client-sdk/src/main/java/com/mushare/plutosdk/PlutoService.kt @@ -48,6 +48,18 @@ interface PlutoService { @Body body: UpdateUserInfoPutData, @HeaderMap authorizationHeader: Map ): Call + + @POST("v1/user/binding") + fun bind( + @Body body: BindPostData, + @HeaderMap authorizationHeader: Map + ): Call + + @POST("/v1/user/unbinding") + fun unbind( + @Body body: UnbindPostData, + @HeaderMap authorizationHeader: Map + ): Call } class RefreshAuthPostData( @@ -91,4 +103,15 @@ class UpdateUserInfoPutData( @field:SerializedName("name") var name: String?, @field:SerializedName("avatar") var avatar: String?, @field:SerializedName("user_id") var userId: String? +) + +class BindPostData( + @field:SerializedName("type") var type: String, + @field:SerializedName("code") var code: String? = null, + @field:SerializedName("id_token") var idToken: String? = null, + @field:SerializedName("mail") var mail: String? = null +) + +class UnbindPostData( + @field:SerializedName("type") var type: String ) \ No newline at end of file