Refactor
parent
9a85fa22ce
commit
bb4d204228
|
@ -28,55 +28,30 @@ class AccountService(private val mCtx: MainActivity, private val mHttp: HttpServ
|
||||||
* @param loginFlowUrl The login flow URL
|
* @param loginFlowUrl The login flow URL
|
||||||
*/
|
*/
|
||||||
fun login(baseUrl: String, loginFlowUrl: String) {
|
fun login(baseUrl: String, loginFlowUrl: String) {
|
||||||
// Make POST request to login flow URL
|
|
||||||
val client = OkHttpClient()
|
|
||||||
val request = Request.Builder()
|
|
||||||
.url(loginFlowUrl)
|
|
||||||
.header("User-Agent", "Memories")
|
|
||||||
.post("".toRequestBody("application/json".toMediaTypeOrNull()))
|
|
||||||
.build()
|
|
||||||
|
|
||||||
val response: Response
|
|
||||||
try {
|
try {
|
||||||
response = client.newCall(request).execute()
|
val res = mHttp.postLoginFlow(loginFlowUrl)
|
||||||
|
val body = mHttp.bodyJson(res) ?: throw Exception("Failed to parse login flow response")
|
||||||
|
|
||||||
|
// Parse response body as JSON
|
||||||
|
val pollObj = body.getJSONObject("poll")
|
||||||
|
val pollToken = pollObj.getString("token")
|
||||||
|
val pollUrl = pollObj.getString("endpoint")
|
||||||
|
val loginUrl = body.getString("login")
|
||||||
|
|
||||||
|
// Open login page in browser
|
||||||
|
toast("Opening login page ...")
|
||||||
|
mCtx.startActivity(Intent(Intent.ACTION_VIEW, Uri.parse(loginUrl)))
|
||||||
|
|
||||||
|
// Start polling in background
|
||||||
|
Thread { pollLogin(pollUrl, pollToken, baseUrl) }.start()
|
||||||
} catch (e: SocketTimeoutException) {
|
} catch (e: SocketTimeoutException) {
|
||||||
toast("Failed to connect to login flow URL")
|
toast("Failed to connect to login flow URL")
|
||||||
return
|
return
|
||||||
}
|
|
||||||
|
|
||||||
// Read response body
|
|
||||||
val body = response.body?.string()
|
|
||||||
response.body?.close()
|
|
||||||
if (body == null) {
|
|
||||||
toast("Failed to get login flow response")
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
// Parse response body as JSON
|
|
||||||
val json = JSONObject(body)
|
|
||||||
val pollToken: String
|
|
||||||
val pollUrl: String
|
|
||||||
val loginUrl: String
|
|
||||||
try {
|
|
||||||
val pollObj = json.getJSONObject("poll")
|
|
||||||
pollToken = pollObj.getString("token")
|
|
||||||
pollUrl = pollObj.getString("endpoint")
|
|
||||||
loginUrl = json.getString("login")
|
|
||||||
|
|
||||||
toast("Opening login page...")
|
|
||||||
|
|
||||||
// Open login page in browser
|
|
||||||
mCtx.startActivity(Intent(Intent.ACTION_VIEW, Uri.parse(loginUrl)))
|
|
||||||
} catch (e: Exception) {
|
} catch (e: Exception) {
|
||||||
Log.e(TAG, "login: ", e)
|
Log.e(TAG, "login: ", e)
|
||||||
toast("Failed to parse login flow response")
|
toast(e.message ?: "Unknown error")
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
// Start polling in background
|
|
||||||
Thread {
|
|
||||||
pollLogin(pollUrl, pollToken, baseUrl)
|
|
||||||
}.start()
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -3,8 +3,10 @@ package gallery.memories.service
|
||||||
import android.net.Uri
|
import android.net.Uri
|
||||||
import android.util.Base64
|
import android.util.Base64
|
||||||
import android.webkit.WebView
|
import android.webkit.WebView
|
||||||
|
import okhttp3.MediaType.Companion.toMediaTypeOrNull
|
||||||
import okhttp3.OkHttpClient
|
import okhttp3.OkHttpClient
|
||||||
import okhttp3.Request
|
import okhttp3.Request
|
||||||
|
import okhttp3.RequestBody.Companion.toRequestBody
|
||||||
import okhttp3.Response
|
import okhttp3.Response
|
||||||
import org.json.JSONArray
|
import org.json.JSONArray
|
||||||
import org.json.JSONObject
|
import org.json.JSONObject
|
||||||
|
@ -88,21 +90,35 @@ class HttpService {
|
||||||
/** Get the API description request */
|
/** Get the API description request */
|
||||||
@Throws(Exception::class)
|
@Throws(Exception::class)
|
||||||
fun getApiDescription(): Response {
|
fun getApiDescription(): Response {
|
||||||
return runRequest("api/describe")
|
return runRequest(buildGet("api/describe"))
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Make login flow request */
|
||||||
|
@Throws(Exception::class)
|
||||||
|
fun postLoginFlow(loginFlowUrl: String): Response {
|
||||||
|
return runRequest(Request.Builder()
|
||||||
|
.url(loginFlowUrl)
|
||||||
|
.header("User-Agent", "Memories")
|
||||||
|
.post("".toRequestBody("application/json".toMediaTypeOrNull()))
|
||||||
|
.build())
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Run a request and get a JSON object */
|
/** Run a request and get a JSON object */
|
||||||
@Throws(Exception::class)
|
@Throws(Exception::class)
|
||||||
private fun runRequest(path: String): Response {
|
private fun runRequest(request: Request): Response {
|
||||||
return OkHttpClient().newCall(buildRequest(path)).execute()
|
return OkHttpClient().newCall(request).execute()
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Build a request */
|
/** Build a GET request */
|
||||||
private fun buildRequest(path: String): Request {
|
private fun buildGet(path: String, auth: Boolean = true): Request {
|
||||||
return Request.Builder()
|
val builder = Request.Builder()
|
||||||
.url(memoriesUrl + path)
|
.url(memoriesUrl + path)
|
||||||
|
.header("User-Agent", "Memories")
|
||||||
.get()
|
.get()
|
||||||
.header("Authorization", authHeader ?: "")
|
|
||||||
.build()
|
if (auth)
|
||||||
|
builder.header("Authorization", authHeader ?: "")
|
||||||
|
|
||||||
|
return builder.build()
|
||||||
}
|
}
|
||||||
}
|
}
|
Loading…
Reference in New Issue