1
+ package com.zionhuang.music.ui.screens.settings
2
+
3
+ import android.annotation.SuppressLint
4
+ import android.view.ViewGroup
5
+ import android.webkit.CookieManager
6
+ import android.webkit.JavascriptInterface
7
+ import android.webkit.WebResourceRequest
8
+ import android.webkit.WebStorage
9
+ import android.webkit.WebView
10
+ import android.webkit.WebViewClient
11
+ import androidx.activity.compose.BackHandler
12
+ import androidx.compose.foundation.layout.fillMaxSize
13
+ import androidx.compose.foundation.layout.windowInsetsPadding
14
+ import androidx.compose.material3.ExperimentalMaterial3Api
15
+ import androidx.compose.material3.Icon
16
+ import androidx.compose.material3.Text
17
+ import androidx.compose.material3.TopAppBar
18
+ import androidx.compose.runtime.Composable
19
+ import androidx.compose.runtime.getValue
20
+ import androidx.compose.runtime.rememberCoroutineScope
21
+ import androidx.compose.runtime.setValue
22
+ import androidx.compose.ui.Modifier
23
+ import androidx.compose.ui.res.painterResource
24
+ import androidx.compose.ui.res.stringResource
25
+ import androidx.compose.ui.viewinterop.AndroidView
26
+ import androidx.navigation.NavController
27
+ import com.zionhuang.music.LocalPlayerAwareWindowInsets
28
+ import com.zionhuang.music.R
29
+ import com.zionhuang.music.constants.DiscordNameKey
30
+ import com.zionhuang.music.constants.DiscordTokenKey
31
+ import com.zionhuang.music.constants.DiscordUsernameKey
32
+ import com.zionhuang.music.ui.component.IconButton
33
+ import com.zionhuang.music.ui.utils.backToMain
34
+ import com.zionhuang.music.utils.rememberPreference
35
+
36
+ @SuppressLint(" SetJavaScriptEnabled" )
37
+ @OptIn(ExperimentalMaterial3Api ::class )
38
+ @Composable
39
+ fun DiscordLoginScreen (
40
+ navController : NavController ,
41
+ ) {
42
+ val scope = rememberCoroutineScope()
43
+ var discordToken by rememberPreference(DiscordTokenKey , " " )
44
+ var discordUsername by rememberPreference(DiscordUsernameKey , " " )
45
+ var discordName by rememberPreference(DiscordNameKey , " " )
46
+
47
+ var webView: WebView ? = null
48
+
49
+ AndroidView (
50
+ modifier = Modifier
51
+ .windowInsetsPadding(LocalPlayerAwareWindowInsets .current)
52
+ .fillMaxSize(),
53
+ factory = { context ->
54
+ WebView (context).apply {
55
+ layoutParams = ViewGroup .LayoutParams (
56
+ ViewGroup .LayoutParams .MATCH_PARENT ,
57
+ ViewGroup .LayoutParams .MATCH_PARENT
58
+ )
59
+
60
+ webViewClient = object : WebViewClient () {
61
+ override fun shouldOverrideUrlLoading (
62
+ webView : WebView ,
63
+ request : WebResourceRequest ,
64
+ ): Boolean {
65
+ stopLoading()
66
+ if (request.url.toString().endsWith(" /app" )) {
67
+ loadUrl(" javascript:Android.onRetrieveToken((webpackChunkdiscord_app.push([[''],{},e=>{m=[];for(let c in e.c)m.push(e.c[c])}]),m).find(m=>m?.exports?.default?.getToken!==void 0).exports.default.getToken());" )
68
+ }
69
+ return false
70
+ }
71
+ }
72
+ settings.apply {
73
+ javaScriptEnabled = true
74
+ domStorageEnabled = true
75
+ setSupportZoom(true )
76
+ builtInZoomControls = true
77
+ }
78
+ val cookieManager = CookieManager .getInstance()
79
+ cookieManager.removeAllCookies(null )
80
+ cookieManager.flush()
81
+
82
+ WebStorage .getInstance().deleteAllData()
83
+ addJavascriptInterface(object {
84
+ @JavascriptInterface
85
+ fun onRetrieveToken (token : String ) {
86
+ discordToken = token
87
+ navController.navigateUp()
88
+ }
89
+ }, " Android" )
90
+
91
+ webView = this
92
+ loadUrl(" https://discord.com/login" )
93
+ }
94
+ }
95
+ )
96
+
97
+ TopAppBar (
98
+ title = { Text (stringResource(R .string.login)) },
99
+ navigationIcon = {
100
+ IconButton (
101
+ onClick = navController::navigateUp,
102
+ onLongClick = navController::backToMain
103
+ ) {
104
+ Icon (
105
+ painterResource(R .drawable.arrow_back),
106
+ contentDescription = null
107
+ )
108
+ }
109
+ }
110
+ )
111
+
112
+ BackHandler (enabled = webView?.canGoBack() == true ) {
113
+ webView?.goBack()
114
+ }
115
+ }
0 commit comments