Skip to content

Commit 07dbc38

Browse files
committed
3.0.2 (49)
* 修复登录页可能会闪退的问题(增加对refresh token接口的错误处理)。 * 统一身份认证登录页面改为全屏显示。
1 parent 26e133b commit 07dbc38

8 files changed

Lines changed: 116 additions & 70 deletions

File tree

app/build.gradle

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,8 @@ android {
1111
applicationId "com.gardilily.onedottongji"
1212
minSdkVersion 29
1313
targetSdkVersion 33
14-
versionCode 48
15-
versionName "3.0.1"
14+
versionCode 49
15+
versionName "3.0.2"
1616

1717
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
1818
}

app/src/main/AndroidManifest.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@
3333
android:theme="@style/Theme.OneDotTongjiRefresh.Main" />
3434

3535
<activity android:name=".activity.TongjiOAuth"
36-
android:theme="@style/Theme.OneTJ.Base" />
36+
android:theme="@style/Theme.OneTJ.NoActionBar.Immersed" />
3737

3838
<activity android:name=".activity.About"
3939
android:theme="@style/Theme.OneTJ.Base"/>

app/src/main/java/com/gardilily/onedottongji/activity/Login.kt

Lines changed: 6 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,7 @@ class Login : Activity() {
6464
Intent(this@Login, TongjiOAuth::class.java),
6565
MacroDefines.UNILOGIN_WEBVIEW_FOR_1SESSIONID
6666
)
67-
overridePendingTransition(android.R.anim.fade_in, android.R.anim.fade_out)
67+
6868
}
6969

7070
GarCloudApi.checkUpdate(this, false)
@@ -233,33 +233,13 @@ class Login : Activity() {
233233
when (requestCode) {
234234
MacroDefines.UNILOGIN_WEBVIEW_FOR_1SESSIONID -> {
235235

236-
val resultData = data?.getStringArrayExtra(TongjiOAuth.RESULT_KEY)
237-
if (resultData == null) {
238-
239-
Toast.makeText(this, "授权失败 qwq", Toast.LENGTH_SHORT).show()
240-
return
241-
}
242-
243-
if (resultData[0] != null || resultData[1] == null) {
244-
245-
Toast.makeText(this, "授权失败 qwq (${resultData[0]})", Toast.LENGTH_SHORT).show()
246-
return
247-
}
248-
249-
val code = resultData[1]
250-
setUISpinning(true)
236+
data ?: return
251237

252-
thread {
253-
254-
if (TongjiApi.instance.code2token(code, this@Login)) {
255-
runOnUiThread {
256-
startActivity(Intent(this@Login, Home::class.java))
257-
overridePendingTransition(android.R.anim.fade_in, android.R.anim.fade_out)
258-
finish()
259-
}
260-
}
261-
runOnUiThread { setUISpinning(false) }
238+
val error = data.getStringExtra(TongjiOAuth.RESULT_ERROR)
262239

240+
if (error == null) {
241+
startActivity(Intent(this@Login, Home::class.java))
242+
finish()
263243
}
264244

265245
} // MacroDefines.UNILOGIN_WEBVIEW_FOR_1SESSIONID ->

app/src/main/java/com/gardilily/onedottongji/activity/TongjiOAuth.kt

Lines changed: 67 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -9,39 +9,61 @@ import android.webkit.WebResourceRequest
99
import android.webkit.WebSettings
1010
import android.webkit.WebView
1111
import android.webkit.WebViewClient
12+
import android.widget.Toast
1213
import androidx.appcompat.app.AppCompatActivity
1314
import com.gardilily.onedottongji.R
1415
import com.gardilily.onedottongji.tools.tongjiapi.TongjiApi
1516
import com.google.android.material.elevation.SurfaceColors
17+
import kotlin.concurrent.thread
1618

1719
/**
1820
*
21+
* Intent 传入:
22+
* scope: String 需要授权的项目。之间用空格分开。
1923
*
2024
* activity 信息返回格式:
2125
* oauthResult: Array<String?>(error, code)
2226
* err 非空,表示登录失败。
2327
* code 非空,可用 code 换结果。
2428
*/
25-
class TongjiOAuth : AppCompatActivity() {
29+
class TongjiOAuth : OneTJActivityBase(
30+
hasTitleBar = false,
31+
withSpinning = true
32+
) {
2633

2734
companion object {
28-
const val RESULT_KEY = "oauthResult"
35+
/**
36+
* 需要授权的选项。
37+
* String
38+
*/
39+
const val INTENT_PARAM_SCOPE = "scope"
40+
41+
/**
42+
* 授权错误信息。
43+
* String
44+
*/
45+
const val RESULT_ERROR = "oauthError"
46+
47+
/**
48+
* 授权得到的 code。
49+
* String
50+
*/
51+
const val RESULT_AUTH_CODE = "oauthCode"
52+
2953
}
3054

3155
private lateinit var webView : WebView
3256

3357
override fun onCreate(savedInstanceState: Bundle?) {
3458
super.onCreate(savedInstanceState)
35-
3659
setContentView(R.layout.activity_tongji_oauth)
3760

38-
val color = SurfaceColors.SURFACE_2.getColor(this)
39-
window.navigationBarColor = color
40-
window.statusBarColor = color
41-
title = "同济大学开放平台 - 身份认证"
61+
stageSpinningProgressBar(findViewById(R.id.tongjiOAuth_rootContainer))
62+
63+
val scope = intent.getStringExtra(INTENT_PARAM_SCOPE)
4264

4365
initWebView()
44-
loadOAuthPage()
66+
loadOAuthPage(scope)
4567

4668
}
4769

@@ -79,8 +101,34 @@ class TongjiOAuth : AppCompatActivity() {
79101
val code = uri.getQueryParameter("code")
80102
val error = uri.getQueryParameter("error")
81103

82-
setResult(0, Intent().putExtra(RESULT_KEY, arrayOf(error, code)))
83-
finish()
104+
val resIntent = Intent()
105+
resIntent.putExtra(RESULT_AUTH_CODE, code)
106+
resIntent.putExtra(RESULT_ERROR, error)
107+
108+
code?.let {
109+
110+
thread {
111+
val res = TongjiApi.instance.code2token(it, this@TongjiOAuth)
112+
113+
114+
runOnUiThread {
115+
if (!res) {
116+
117+
Toast.makeText(
118+
this@TongjiOAuth,
119+
"授权失败(code2token)",
120+
Toast.LENGTH_SHORT
121+
).show()
122+
123+
resIntent.putExtra(RESULT_ERROR, "code2token returns false")
124+
}
125+
126+
setResult(0, resIntent)
127+
finish()
128+
129+
} // runOnUiThread {
130+
} // thread {
131+
} // code?.let {
84132

85133
return true // 防止白屏。
86134
}
@@ -92,7 +140,7 @@ class TongjiOAuth : AppCompatActivity() {
92140
webView.webChromeClient = object : WebChromeClient() {}
93141
}
94142

95-
private fun loadOAuthPage() {
143+
private fun loadOAuthPage(scope: String?) {
96144
// https://api.tongji.edu.cn/docs/#/architecture/authentication
97145
val urlBuilder = StringBuilder("${TongjiApi.BASE_URL}/keycloak/realms/OpenPlatform/protocol/openid-connect/auth")
98146

@@ -101,15 +149,17 @@ class TongjiOAuth : AppCompatActivity() {
101149
urlBuilder.append("&response_type=code")
102150

103151
val scopeBuilder = StringBuilder()
104-
TongjiApi.SCOPE_LIST.forEach {
105-
if (it != TongjiApi.SCOPE_LIST.first()) {
106-
scopeBuilder.append(' ')
107-
}
152+
if (scope == null) {
153+
TongjiApi.SCOPE_LIST.forEach {
154+
if (it != TongjiApi.SCOPE_LIST.first()) {
155+
scopeBuilder.append(' ')
156+
}
108157

109-
scopeBuilder.append(it)
158+
scopeBuilder.append(it)
159+
}
110160
}
111161

112-
urlBuilder.append("&scope=$scopeBuilder")
162+
urlBuilder.append("&scope=${scope ?: scopeBuilder}")
113163

114164
webView.loadUrl(urlBuilder.toString())
115165

app/src/main/java/com/gardilily/onedottongji/tools/tongjiapi/TongjiApi.kt

Lines changed: 32 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -206,23 +206,32 @@ class TongjiApi {
206206
return this.addHeader("Authorization", "Bearer ${getTokenData().token}")
207207
}
208208

209-
private fun processGetTokenResponse(json: JSONObject) {
210-
val accessToken = json.getString("access_token")
211-
// 有效期。单位为秒(应该是吧)
212-
val expiresIn = json.getLong("expires_in")
213-
val currentTime = System.currentTimeMillis() / 1000
214-
val expireTime = currentTime + expiresIn - 10
215-
216-
val refreshToken = json.getString("refresh_token")
217-
val refreshTokenExpiresIn = json.getLong("refresh_expires_in")
218-
val refreshTokenExpireTime = currentTime + refreshTokenExpiresIn - 10
219-
220-
storeTokenData(TokenData(
221-
token = accessToken,
222-
expireTimeSec = expireTime,
223-
refreshToken = refreshToken,
224-
refreshTokenExpireSec = refreshTokenExpireTime
225-
))
209+
private fun processGetTokenResponse(json: JSONObject): Boolean {
210+
return try {
211+
val accessToken = json.getString("access_token")
212+
// 有效期。单位为秒(应该是吧)
213+
val expiresIn = json.getLong("expires_in")
214+
val currentTime = System.currentTimeMillis() / 1000
215+
val expireTime = currentTime + expiresIn - 10
216+
217+
val refreshToken = json.getString("refresh_token")
218+
val refreshTokenExpiresIn = json.getLong("refresh_expires_in")
219+
val refreshTokenExpireTime = currentTime + refreshTokenExpiresIn - 10
220+
221+
storeTokenData(
222+
TokenData(
223+
token = accessToken,
224+
expireTimeSec = expireTime,
225+
refreshToken = refreshToken,
226+
refreshTokenExpireSec = refreshTokenExpireTime
227+
)
228+
)
229+
230+
true
231+
} catch (e: Exception) {
232+
e.printStackTrace()
233+
false
234+
}
226235
}
227236

228237
fun code2token(code: String, activity: Activity): Boolean {
@@ -251,9 +260,7 @@ class TongjiApi {
251260
val bodyString = response.body?.string()
252261
val responseJson = bodyString?.let { JSONObject(it) } ?: return false
253262

254-
processGetTokenResponse(responseJson)
255-
256-
return true
263+
return processGetTokenResponse(responseJson)
257264
}
258265

259266
/**
@@ -292,9 +299,9 @@ class TongjiApi {
292299
null
293300
} ?: return false
294301

295-
processGetTokenResponse(resJson)
296302

297-
return false
303+
return processGetTokenResponse(resJson)
304+
298305
}
299306

300307
data class StudentInfo(
@@ -748,6 +755,8 @@ class TongjiApi {
748755
allThreadsFiredSemaphore.release()
749756
}
750757

758+
val donePages = AtomicInteger(1)
759+
751760
for (page in 2 .. pages step CONCURRENT_SIZE) {
752761

753762
if (apiControl.stop.get()) {
@@ -783,7 +792,7 @@ class TongjiApi {
783792
return@thread
784793
}
785794

786-
val currProgress = thisPage * 100 / pages
795+
val currProgress = donePages.incrementAndGet() * 100 / pages
787796
if (currProgress > progress.get()) {
788797
progress.set(currProgress)
789798
onProgressUpdate?.let { it(currProgress) }

app/src/main/res/layout/activity_tongji_oauth.xml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
xmlns:tools="http://schemas.android.com/tools"
44
android:layout_width="match_parent"
55
android:layout_height="match_parent"
6+
android:id="@+id/tongjiOAuth.rootContainer"
67
tools:context=".activity.TongjiOAuth">
78

89
<WebView

app/src/main/res/values/strings.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
<resources>
22
<string name="app_name">一块钱</string>
3-
<string name="app_buildTime" translatable="false">2023.07.14–14:31</string>
3+
<string name="app_buildTime" translatable="false">2023.07.16–17:06</string>
44
<string name="login_to_tongji_university">统一身份认证登录</string>
55
<string name="version">版本</string>
66
<string name="check_for_update">检查更新</string>

updateLog.txt

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,9 @@
1+
Version: 3.0.2 (49)
2+
Build Time: 2023.07.16–17:06
3+
Update Log:
4+
* 修复登录页可能会闪退的问题(增加对refresh token接口的错误处理)。
5+
* 统一身份认证登录页面改为全屏显示。
6+
17
Version: 3.0.1 (48)
28
Build Time: 2023.07.14–14:31
39
Update Log:

0 commit comments

Comments
 (0)