From 2cee99a8ca0011a411b5ca0163bf9bb7ffc8dc4f Mon Sep 17 00:00:00 2001 From: fdx Date: Fri, 11 Nov 2022 11:53:05 +0800 Subject: [PATCH] =?UTF-8?q?2.8.5=20=E8=A7=A3=E5=86=B3Google=20=E7=99=BB?= =?UTF-8?q?=E5=BD=95=E5=A4=B1=E6=95=88=E7=9A=84=E9=97=AE=E9=A2=98.=20?= =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E8=BF=9C=E7=A8=8B=E9=85=8D=E7=BD=AE=EF=BC=8C?= =?UTF-8?q?=E4=BF=9D=E8=AF=81=E5=90=8E=E7=BB=AD=E7=9A=84=E5=AE=9E=E6=97=B6?= =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/build.gradle.kts | 7 +- .../main/java/im/fdx/v2ex/ui/LoginActivity.kt | 497 +++++++++--------- .../java/im/fdx/v2ex/ui/WebViewActivity.kt | 23 +- .../java/im/fdx/v2ex/ui/main/MainActivity.kt | 5 + .../main/res/xml/remote_config_defaults.xml | 7 + 5 files changed, 290 insertions(+), 249 deletions(-) create mode 100644 app/src/main/res/xml/remote_config_defaults.xml diff --git a/app/build.gradle.kts b/app/build.gradle.kts index 5c3a5dd..85e6208 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -23,8 +23,8 @@ android { applicationId = "im.fdx.v2ex" minSdk = 22 targetSdk = 33 - versionCode = 55 - versionName = "2.8.4" + versionCode = 56 + versionName = "2.8.5" } lint { checkReleaseBuilds = false @@ -130,8 +130,9 @@ dependencies { implementation("com.github.chrisbanes:PhotoView:2.3.0") implementation("com.github.esafirm.android-image-picker:imagepicker:2.4.5") - implementation(platform("com.google.firebase:firebase-bom:31.0.1")) + implementation(platform("com.google.firebase:firebase-bom:31.0.2")) implementation("com.google.firebase:firebase-crashlytics-ktx") + implementation ("com.google.firebase:firebase-config-ktx") implementation("com.google.firebase:firebase-analytics-ktx") } repositories { diff --git a/app/src/main/java/im/fdx/v2ex/ui/LoginActivity.kt b/app/src/main/java/im/fdx/v2ex/ui/LoginActivity.kt index 67a7b22..a6bab21 100644 --- a/app/src/main/java/im/fdx/v2ex/ui/LoginActivity.kt +++ b/app/src/main/java/im/fdx/v2ex/ui/LoginActivity.kt @@ -5,25 +5,22 @@ import android.app.Activity import android.content.Intent import android.os.Bundle import android.text.SpannableString -import android.text.SpannableStringBuilder import android.text.Spanned import android.text.method.LinkMovementMethod -import android.text.style.URLSpan import android.util.Log import android.view.LayoutInflater import android.view.View.GONE import android.view.View.VISIBLE import android.widget.EditText import androidx.appcompat.app.AlertDialog -import androidx.core.content.ContextCompat import androidx.core.os.bundleOf -import androidx.core.text.set import com.bumptech.glide.load.model.GlideUrl import com.bumptech.glide.load.model.LazyHeaders import com.bumptech.glide.load.resource.drawable.DrawableTransitionOptions.withCrossFade import com.elvishew.xlog.XLog -import com.google.android.material.appbar.MaterialToolbar import com.google.android.material.snackbar.Snackbar +import com.google.firebase.ktx.Firebase +import com.google.firebase.remoteconfig.ktx.remoteConfig import im.fdx.v2ex.GlideApp import im.fdx.v2ex.R import im.fdx.v2ex.databinding.ActivityLoginBinding @@ -38,280 +35,294 @@ import im.fdx.v2ex.view.CustomChrome import im.fdx.v2ex.view.UrlSpanNoUnderline import okhttp3.* import okhttp3.HttpUrl.Companion.toHttpUrlOrNull -import org.jetbrains.anko.longToast import org.jetbrains.anko.toast import org.jsoup.Jsoup import java.io.IOException class LoginActivity : BaseActivity() { - /** - * 不一定是用户名,可能是邮箱 - */ - private var loginName: String? = null - private var password: String? = null - - var onceCode: String? = null - var passwordKey: String? = null - var nameKey: String? = null - var imageCodeKey: String? = null - private lateinit var binding: ActivityLoginBinding - - override fun onCreate(savedInstanceState: Bundle?) { - super.onCreate(savedInstanceState) - - binding = ActivityLoginBinding.inflate(layoutInflater) - setContentView(binding.root) - val toolbar = setUpToolbar() - val usernamePref = pref.getString(Keys.KEY_USERNAME, "") - binding.btnLogin.setOnClickListener { - if (!isValidated()) return@setOnClickListener - loginName = binding.inputUsername.text.toString() - password = binding.inputPassword.text.toString() - binding.pbLogin.visibility = VISIBLE - binding.btnLogin.visibility = GONE - postLogin(nameKey ?: "", passwordKey ?: "", onceCode = onceCode - ?: "", imageCodeKey = imageCodeKey ?: "") - } - binding.linkSignUp.setOnClickListener { - CustomChrome(this@LoginActivity).load(NetManager.SIGN_UP_URL) - } - binding.ivCode.setOnClickListener { - getLoginElement() - } + /** + * 不一定是用户名,可能是邮箱 + */ + private var loginName: String? = null + private var password: String? = null + + var onceCode: String? = null + var passwordKey: String? = null + var nameKey: String? = null + var imageCodeKey: String? = null + private lateinit var binding: ActivityLoginBinding + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + + binding = ActivityLoginBinding.inflate(layoutInflater) + setContentView(binding.root) + val toolbar = setUpToolbar() + val usernamePref = pref.getString(Keys.KEY_USERNAME, "") + binding.btnLogin.setOnClickListener { + if (!isValidated()) return@setOnClickListener + loginName = binding.inputUsername.text.toString() + password = binding.inputPassword.text.toString() + binding.pbLogin.visibility = VISIBLE + binding.btnLogin.visibility = GONE + postLogin( + nameKey ?: "", passwordKey ?: "", onceCode = onceCode + ?: "", imageCodeKey = imageCodeKey ?: "" + ) + } + binding.linkSignUp.setOnClickListener { + CustomChrome(this@LoginActivity).load(NetManager.SIGN_UP_URL) + } + binding.ivCode.setOnClickListener { + getLoginElement() + } - val span = SpannableString("点击登录或注册,表明您已了解并同意《V2EX社区规则》") - val url = UrlSpanNoUnderline("https://www.v2ex.com/about") { - CustomChrome(this@LoginActivity).load("https://www.v2ex.com/about") - } - span.setSpan(url, 18, 27, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE) + val span = SpannableString("点击登录或注册,表明您已了解并同意《V2EX社区规则》") + val url = UrlSpanNoUnderline("https://www.v2ex.com/about") { + CustomChrome(this@LoginActivity).load("https://www.v2ex.com/about") + } + span.setSpan(url, 18, 27, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE) + + binding.tvAgreement.movementMethod = LinkMovementMethod() + binding.tvAgreement.text = span + binding.tvGoogleLogin.setOnClickListener { + if (onceCode == null) { + toast("请稍后") + } else { + + Firebase.remoteConfig.fetchAndActivate().addOnCompleteListener { + logi("google_sign_in_url") + logi(Firebase.remoteConfig.getString("google_sign_in_url")) + val intent = Intent(this, WebViewActivity::class.java).apply { + putExtras(bundleOf("url" to Firebase.remoteConfig.getString("google_sign_in_url"))) + } + startActivityForResult(intent, 144) + } - binding.tvAgreement.movementMethod = LinkMovementMethod() - binding.tvAgreement.text = span + } + } - binding.tvGoogleLogin.setOnClickListener{ - if(onceCode == null) { - toast("请稍后") - } else { - val intent = Intent(this, WebViewActivity::class.java).apply { - putExtras(bundleOf( "url" to "https://www.v2ex.com/auth/google?once=$onceCode")) + if (!usernamePref.isNullOrEmpty()) { + binding.inputUsername.setText(usernamePref) + binding.inputPassword.requestFocus() } - startActivityForResult(intent, 144 ) - } + + getLoginElement() } - if (!usernamePref.isNullOrEmpty()) { - binding.inputUsername.setText(usernamePref) - binding.inputPassword.requestFocus() + @Deprecated("Deprecated in Java") + override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { + super.onActivityResult(requestCode, resultCode, data) + if (requestCode == 144 && resultCode == RESULT_OK) { + finish() + } } - getLoginElement() - } + private fun getLoginElement() { - @Deprecated("Deprecated in Java") - override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { - super.onActivityResult(requestCode, resultCode, data) - if (requestCode == 144 && resultCode == RESULT_OK) { - finish() - } - } - - private fun getLoginElement() { - - val requestToGetOnce = Request.Builder() - .url(SIGN_IN_URL) - .build() - - HttpHelper.OK_CLIENT.newCall(requestToGetOnce).enqueue(object : Callback { - override fun onFailure(call: Call, e: IOException) { - loge("error in get login page") - } - - @Throws(IOException::class) - override fun onResponse(call: Call, response0: Response) { - val htmlString = response0.body?.string() - val body = Jsoup.parse(htmlString).body() - nameKey = body.getElementsByAttributeValue("placeholder", "用户名或电子邮件地址").attr("name") - passwordKey = body.getElementsByAttributeValue("type", "password").attr("name") - onceCode = body.getElementsByAttributeValue("name", "once").attr("value") - imageCodeKey = body.getElementsByAttributeValueContaining("placeholder", "请输入上图中的验证码").attr("name") - runOnUiThread { - val str = "https://www.v2ex.com/_captcha?once=$onceCode" - - val headers: LazyHeaders = LazyHeaders.Builder() - .addHeader("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8") - .addHeader("Accept-Charset", "utf-8, iso-8859-1, utf-16, *;q=0.7") - .addHeader("Accept-Language", "zh-CN,zh;q=0.8,en;q=0.6") - .addHeader("Host", "www.v2ex.com") - .addHeader("Cache-Control", "max-age=0") - // .addHeader("X-Requested-With", "com.android.browser") - // .addHeader("User-Agent", "Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3013.3 Mobile Safari/537.36"); - .addHeader("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36" + " (KHTML, like Gecko) Chrome/58.0.3013.3 Safari/537.36") - .addHeader("cookie", HttpHelper.myCookieJar.loadForRequest(str.toHttpUrlOrNull()!!).joinToString(separator = ";")) - .build() - val url = GlideUrl(str, headers) - if (!this@LoginActivity.isDestroyed) { - GlideApp.with(binding.ivCode) - .load(url) - .transition(withCrossFade()) - .centerCrop().into(binding.ivCode) - } - } - XLog.tag("LoginActivity").d("$nameKey|$passwordKey|$onceCode|$imageCodeKey") - } - }) - } - - private fun postLogin(nameKey: String, passwordKey: String, onceCode: String, imageCodeKey: String) { - val requestBody = FormBody.Builder() - .add(nameKey, binding.inputUsername.text.toString()) - .add(passwordKey, binding.inputPassword.text.toString()) - .add(imageCodeKey, binding.etInputCode.text.toString()) - .add("once", onceCode) - .build() - - val request = Request.Builder() - .url(SIGN_IN_URL) - .header("Origin", HTTPS_V2EX_BASE) - .header("Referer", SIGN_IN_URL) - .header("Content-Type", "application/x-www-form-urlencoded") - .post(requestBody) - .build() - HttpHelper.OK_CLIENT.newCall(request).start(object : Callback { - override fun onFailure(call: Call, e: IOException) { - Log.e("LoginActivity", "error in Post Login") - } - - @Throws(IOException::class) - override fun onResponse(call: Call, response: Response) { - val httpcode = response.code - val errorMsg = Parser(response.body!!.string()).getErrorMsg() - logd("http code: ${response.code}") - logd("errorMsg: $errorMsg") - - when (httpcode) { - 302 -> { - vCall(HTTPS_V2EX_BASE).start(object : Callback { - override fun onFailure(call: Call, e: IOException) { - e.printStackTrace() - } - - @Throws(IOException::class) - override fun onResponse(call: Call, response2: Response) { - if (response2.code == 302) { - if (("/2fa" == response2.header("Location"))) { - runOnUiThread { - binding.pbLogin.visibility = GONE - binding.btnLogin.visibility = VISIBLE - showTwoStepDialog(this@LoginActivity) + val requestToGetOnce = Request.Builder() + .url(SIGN_IN_URL) + .build() + + HttpHelper.OK_CLIENT.newCall(requestToGetOnce).enqueue(object : Callback { + override fun onFailure(call: Call, e: IOException) { + loge("error in get login page") + } + + @Throws(IOException::class) + override fun onResponse(call: Call, response0: Response) { + val htmlString = response0.body?.string() + val body = Jsoup.parse(htmlString).body() + nameKey = body.getElementsByAttributeValue("placeholder", "用户名或电子邮件地址").attr("name") + passwordKey = body.getElementsByAttributeValue("type", "password").attr("name") + onceCode = body.getElementsByAttributeValue("name", "once").attr("value") + imageCodeKey = body.getElementsByAttributeValueContaining("placeholder", "请输入上图中的验证码").attr("name") + runOnUiThread { + val str = "https://www.v2ex.com/_captcha?once=$onceCode" + + val headers: LazyHeaders = LazyHeaders.Builder() + .addHeader("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8") + .addHeader("Accept-Charset", "utf-8, iso-8859-1, utf-16, *;q=0.7") + .addHeader("Accept-Language", "zh-CN,zh;q=0.8,en;q=0.6") + .addHeader("Host", "www.v2ex.com") + .addHeader("Cache-Control", "max-age=0") + // .addHeader("X-Requested-With", "com.android.browser") + // .addHeader("User-Agent", "Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3013.3 Mobile Safari/537.36"); + .addHeader( + "User-Agent", + "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36" + " (KHTML, like Gecko) Chrome/58.0.3013.3 Safari/537.36" + ) + .addHeader( + "cookie", + HttpHelper.myCookieJar.loadForRequest(str.toHttpUrlOrNull()!!).joinToString(separator = ";") + ) + .build() + val url = GlideUrl(str, headers) + if (!this@LoginActivity.isDestroyed) { + GlideApp.with(binding.ivCode) + .load(url) + .transition(withCrossFade()) + .centerCrop().into(binding.ivCode) } - } - } else { - setLogin(true) - runOnUiThread { - toast("登录成功") - finish() - } } - } - }) + XLog.tag("LoginActivity").d("$nameKey|$passwordKey|$onceCode|$imageCodeKey") + } + }) + } - } - 200 -> runOnUiThread { - showHint(binding.root, errorMsg, Snackbar.LENGTH_INDEFINITE) - getLoginElement() - binding.pbLogin.visibility = GONE - binding.btnLogin.visibility = VISIBLE - } - } + private fun postLogin(nameKey: String, passwordKey: String, onceCode: String, imageCodeKey: String) { + val requestBody = FormBody.Builder() + .add(nameKey, binding.inputUsername.text.toString()) + .add(passwordKey, binding.inputPassword.text.toString()) + .add(imageCodeKey, binding.etInputCode.text.toString()) + .add("once", onceCode) + .build() + + val request = Request.Builder() + .url(SIGN_IN_URL) + .header("Origin", HTTPS_V2EX_BASE) + .header("Referer", SIGN_IN_URL) + .header("Content-Type", "application/x-www-form-urlencoded") + .post(requestBody) + .build() + HttpHelper.OK_CLIENT.newCall(request).start(object : Callback { + override fun onFailure(call: Call, e: IOException) { + Log.e("LoginActivity", "error in Post Login") + } - } - }) - } + @Throws(IOException::class) + override fun onResponse(call: Call, response: Response) { + val httpcode = response.code + val errorMsg = Parser(response.body!!.string()).getErrorMsg() + logd("http code: ${response.code}") + logd("errorMsg: $errorMsg") + + when (httpcode) { + 302 -> { + vCall(HTTPS_V2EX_BASE).start(object : Callback { + override fun onFailure(call: Call, e: IOException) { + e.printStackTrace() + } + + @Throws(IOException::class) + override fun onResponse(call: Call, response2: Response) { + if (response2.code == 302) { + if (("/2fa" == response2.header("Location"))) { + runOnUiThread { + binding.pbLogin.visibility = GONE + binding.btnLogin.visibility = VISIBLE + showTwoStepDialog(this@LoginActivity) + } + } + } else { + setLogin(true) + runOnUiThread { + toast("登录成功") + finish() + } + } + } + }) - private fun isValidated(): Boolean { - val username = binding.inputUsername.text.toString() - val password = binding.inputPassword.text.toString() + } + 200 -> runOnUiThread { + showHint(binding.root, errorMsg, Snackbar.LENGTH_INDEFINITE) + getLoginElement() + binding.pbLogin.visibility = GONE + binding.btnLogin.visibility = VISIBLE + } + } - if (username.isEmpty()) { - binding.inputUsername.error = "名字不能为空" - binding.inputUsername.requestFocus() - return false - } - if (password.isEmpty()) { - binding.inputPassword.error = "密码不能为空" - binding.inputPassword.requestFocus() - return false + } + }) } - if (binding.etInputCode.text.isNullOrEmpty()) { - binding.etInputCode.error = "验证码不能为空" - binding.etInputCode.requestFocus() - return false + + private fun isValidated(): Boolean { + val username = binding.inputUsername.text.toString() + val password = binding.inputPassword.text.toString() + + if (username.isEmpty()) { + binding.inputUsername.error = "名字不能为空" + binding.inputUsername.requestFocus() + return false + } + if (password.isEmpty()) { + binding.inputPassword.error = "密码不能为空" + binding.inputPassword.requestFocus() + return false + } + if (binding.etInputCode.text.isNullOrEmpty()) { + binding.etInputCode.error = "验证码不能为空" + binding.etInputCode.requestFocus() + return false + } + + return true } - return true - } - - /** - * 两步验证,对话框 - */ - @SuppressLint("InflateParams") - fun showTwoStepDialog(activity: Activity) { - val dialogEt = LayoutInflater.from(activity).inflate(R.layout.dialog_et, null) - val etCode = dialogEt.findViewById(R.id.et_two_step_code) - AlertDialog.Builder(activity, R.style.AppTheme_Simple) + /** + * 两步验证,对话框 + */ + @SuppressLint("InflateParams") + fun showTwoStepDialog(activity: Activity) { + val dialogEt = LayoutInflater.from(activity).inflate(R.layout.dialog_et, null) + val etCode = dialogEt.findViewById(R.id.et_two_step_code) + AlertDialog.Builder(activity, R.style.AppTheme_Simple) .setTitle("您需要进行两步验证") .setPositiveButton("验证") { _, _ -> - finishLogin(etCode.text.toString(), activity) + finishLogin(etCode.text.toString(), activity) } .setNegativeButton("暂不登录") { _, _ -> - HttpHelper.myCookieJar.clear() - setLogin(false) + HttpHelper.myCookieJar.clear() + setLogin(false) } .setView(dialogEt).show() - } - - /** - * 两步验证,完成登录 - */ - private fun finishLogin(code: String, activity: Activity) { - val twoStepUrl = "https://www.v2ex.com/2fa" - vCall(twoStepUrl).enqueue(object : Callback { - override fun onFailure(call: Call, e: IOException) { - NetManager.dealError(activity) - } - - override fun onResponse(call: Call, response: Response) { - if (response.code == 200) { - val bodyStr = response.body?.string()!! - val once = Parser(bodyStr).getOnceNum() - val body: RequestBody = FormBody.Builder() - .add("code", code) - .add("once", once).build() - HttpHelper.OK_CLIENT.newCall(Request.Builder() - .post(body) - .url(twoStepUrl) - .build()) - .enqueue(object : Callback { + } + + /** + * 两步验证,完成登录 + */ + private fun finishLogin(code: String, activity: Activity) { + val twoStepUrl = "https://www.v2ex.com/2fa" + vCall(twoStepUrl).enqueue(object : Callback { override fun onFailure(call: Call, e: IOException) { - NetManager.dealError(activity) + NetManager.dealError(activity) } override fun onResponse(call: Call, response: Response) { - activity.runOnUiThread { - if (response?.code == 302) { - activity.toast("登录成功") - setLogin(true) - } else { - activity.toast("登录失败") + if (response.code == 200) { + val bodyStr = response.body?.string()!! + val once = Parser(bodyStr).getOnceNum() + val body: RequestBody = FormBody.Builder() + .add("code", code) + .add("once", once).build() + HttpHelper.OK_CLIENT.newCall( + Request.Builder() + .post(body) + .url(twoStepUrl) + .build() + ) + .enqueue(object : Callback { + override fun onFailure(call: Call, e: IOException) { + NetManager.dealError(activity) + } + + override fun onResponse(call: Call, response: Response) { + activity.runOnUiThread { + if (response?.code == 302) { + activity.toast("登录成功") + setLogin(true) + } else { + activity.toast("登录失败") + } + } + } + }) } - } } - }) - } - } - }) - } + }) + } } diff --git a/app/src/main/java/im/fdx/v2ex/ui/WebViewActivity.kt b/app/src/main/java/im/fdx/v2ex/ui/WebViewActivity.kt index 04dcae9..3f49931 100644 --- a/app/src/main/java/im/fdx/v2ex/ui/WebViewActivity.kt +++ b/app/src/main/java/im/fdx/v2ex/ui/WebViewActivity.kt @@ -4,6 +4,7 @@ package im.fdx.v2ex.ui import android.annotation.SuppressLint import android.app.Activity import android.app.ProgressDialog +import android.graphics.Bitmap import android.os.Bundle import android.util.Log import android.view.KeyEvent @@ -45,9 +46,13 @@ class WebViewActivity : BaseActivity() { myWebView = findViewById(R.id.webview) val webSettings = myWebView.settings + toolbar.title = "正在加载中" + + webSettings.setSupportZoom(true) // webSettings.userAgentString = "Mozilla/5.0 (Linux; Android 8.0; Pixel 2 Build/OPD3.170816.012)" + // " AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.105 Mobile Safari/537.36" + webSettings.userAgentString = webSettings.userAgentString.replace(Regex("(?<=\\W)wv"), "") webSettings.javaScriptEnabled = true val chromeClient = MyChromeClient() myWebView.webChromeClient = chromeClient @@ -83,10 +88,21 @@ class WebViewActivity : BaseActivity() { super.onReceivedHttpError(view, request, errorResponse) } - //todo hard code for google login override fun onPageFinished(view: WebView?, url: String?) { val cookie = CookieManager.getInstance().getCookie(url) - Log.i("fdxcookie", "$url----$cookie") +// Log.i("fdxcookiePageFinished", "$url----$cookie") + super.onPageFinished(view, url) + } + + override fun onPageCommitVisible(view: WebView?, url: String?) { + val cookie = CookieManager.getInstance().getCookie(url) +// Log.i("fdxcookieCommitVisible", "$url----$cookie") + super.onPageCommitVisible(view, url) + } + + override fun onPageStarted(view: WebView?, url: String?, favicon: Bitmap?) { + val cookie = CookieManager.getInstance().getCookie(url) +// Log.i("fdxcookiePageStarted", "$url----$cookie") if(cookie?.contains("A2=") == true && url !=null) { // "abc:efg;" HttpHelper.cookiePersistor.persistAll(strtocookie(url, cookie)) @@ -95,9 +111,10 @@ class WebViewActivity : BaseActivity() { finish() } noFirst = true - super.onPageFinished(view, url) + super.onPageStarted(view, url, favicon) } + } diff --git a/app/src/main/java/im/fdx/v2ex/ui/main/MainActivity.kt b/app/src/main/java/im/fdx/v2ex/ui/main/MainActivity.kt index 2fc8b39..91aaa5a 100644 --- a/app/src/main/java/im/fdx/v2ex/ui/main/MainActivity.kt +++ b/app/src/main/java/im/fdx/v2ex/ui/main/MainActivity.kt @@ -29,6 +29,10 @@ import androidx.work.WorkManager import com.google.android.material.navigation.NavigationView import com.google.android.material.tabs.TabLayout import com.google.android.material.tabs.TabLayoutMediator +import com.google.firebase.ktx.Firebase +import com.google.firebase.remoteconfig.FirebaseRemoteConfigSettings +import com.google.firebase.remoteconfig.ktx.remoteConfig +import com.google.firebase.remoteconfig.ktx.remoteConfigSettings import de.hdodenhof.circleimageview.CircleImageView import im.fdx.v2ex.* import im.fdx.v2ex.databinding.ActivityMainNavDrawerBinding @@ -275,6 +279,7 @@ class MainActivity : BaseActivity(), NavigationView.OnNavigationItemSelectedList }) startGetNotification() + Firebase.remoteConfig.setDefaultsAsync(R.xml.remote_config_defaults) } private fun updateUserInBackground() { diff --git a/app/src/main/res/xml/remote_config_defaults.xml b/app/src/main/res/xml/remote_config_defaults.xml new file mode 100644 index 0000000..22fb1ac --- /dev/null +++ b/app/src/main/res/xml/remote_config_defaults.xml @@ -0,0 +1,7 @@ + + + + google_sign_in_url + https://www.v2ex.com/signin + + \ No newline at end of file