From 044274038f99dd6f0cf4486468e7d2dace2d8c3f Mon Sep 17 00:00:00 2001 From: KingLucius Date: Sun, 9 Jun 2024 02:51:07 +0300 Subject: [PATCH] Used CountDownTimer instead of while --- .../ui/settings/SettingsAccount.kt | 109 +++++++++--------- app/src/main/res/drawable/cloud_2_solid.xml | 2 +- 2 files changed, 56 insertions(+), 55 deletions(-) diff --git a/app/src/main/java/com/lagradost/cloudstream3/ui/settings/SettingsAccount.kt b/app/src/main/java/com/lagradost/cloudstream3/ui/settings/SettingsAccount.kt index 1ffabedb..8cf26fde 100644 --- a/app/src/main/java/com/lagradost/cloudstream3/ui/settings/SettingsAccount.kt +++ b/app/src/main/java/com/lagradost/cloudstream3/ui/settings/SettingsAccount.kt @@ -2,6 +2,7 @@ package com.lagradost.cloudstream3.ui.settings import android.graphics.Bitmap import android.os.Bundle +import android.os.CountDownTimer import android.view.View import android.view.View.FOCUS_DOWN import android.view.inputmethod.EditorInfo @@ -63,7 +64,6 @@ import com.lagradost.cloudstream3.utils.UIHelper.dismissSafe import com.lagradost.cloudstream3.utils.UIHelper.hideKeyboard import com.lagradost.cloudstream3.utils.UIHelper.setImage import com.lagradost.cloudstream3.utils.UIHelper.toPx -import kotlinx.coroutines.delay import qrcode.QRCode import java.io.ByteArrayOutputStream @@ -146,9 +146,13 @@ class SettingsAccount : PreferenceFragmentCompat(), BiometricAuthenticator.Biome try { when (api) { is OAuth2API -> { - if (isLayout(TV or EMULATOR) && api.supportDeviceAuth && activity != null) { + if (isLayout(PHONE) || !api.supportDeviceAuth) { + api.authenticate(activity) + } else if (api.supportDeviceAuth && activity != null) { + val binding: DeviceAuthBinding = DeviceAuthBinding.inflate(activity.layoutInflater, null, false) + val builder = AlertDialog.Builder(activity) .setView(binding.root) @@ -166,27 +170,24 @@ class SettingsAccount : PreferenceFragmentCompat(), BiometricAuthenticator.Biome try { val pinCodeData = api.getDevicePin() if (pinCodeData == null) { - activity.runOnUiThread { - showToast( - activity.getString(R.string.device_pin_error_message) - ) - } + showToast(R.string.device_pin_error_message) api.authenticate(activity) return@ioSafe } - val logoBytes = ContextCompat.getDrawable( + /*val logoBytes = ContextCompat.getDrawable( activity, R.drawable.cloud_2_solid )?.toBitmapOrNull()?.let { bitmap -> val csLogo = ByteArrayOutputStream() bitmap.compress(Bitmap.CompressFormat.PNG, 100, csLogo) csLogo.toByteArray() - } + }*/ val qrCodeImage = QRCode.ofRoundedSquares() - .withColor(activity.colorFromAttribute(R.attr.colorPrimary)) - .withLogo(logoBytes, 200.toPx, 200.toPx) + .withColor(activity.colorFromAttribute(R.attr.textColor)) + .withBackgroundColor(activity.colorFromAttribute(R.attr.primaryBlackBackground)) + //.withLogo(logoBytes, 200.toPx, 200.toPx) //For later if logo needed anytime .build(pinCodeData.verificationUrl) .render().nativeImage() as Bitmap @@ -194,51 +195,59 @@ class SettingsAccount : PreferenceFragmentCompat(), BiometricAuthenticator.Biome dialog.show() binding.apply { devicePinCode.setText(txt(pinCodeData.userCode)) - deviceAuthMessage.setText(txt(R.string.device_pin_url_message, pinCodeData.verificationUrl)) + deviceAuthMessage.setText( + txt( + R.string.device_pin_url_message, + pinCodeData.verificationUrl + ) + ) deviceAuthQrcode.setImage( img(qrCodeImage) ) } - } - var expirationCounter = pinCodeData.expiresIn + val expirationMillis = + pinCodeData.expiresIn.times(1000).toLong() - while (expirationCounter > 0) { - activity.runOnUiThread { - binding.deviceAuthValidationCounter.setText( - txt( - R.string.device_pin_counter_text, expirationCounter.div(60) , expirationCounter.rem(60) + object : CountDownTimer(expirationMillis, 1000) { + + override fun onTick(millisUntilFinished: Long) { + val secondsUntilFinished = + millisUntilFinished.div(1000).toInt() + + binding.deviceAuthValidationCounter.setText( + txt( + R.string.device_pin_counter_text, + secondsUntilFinished.div(60), + secondsUntilFinished.rem(60) + ) ) - ) - } - if (expirationCounter.rem(pinCodeData.interval) == 0 && api.handleDeviceAuth(pinCodeData)) { - activity.runOnUiThread { - showToast( - activity.getString(R.string.authenticated_user) - .format( + ioSafe { + if (secondsUntilFinished.rem(pinCodeData.interval) == 0 && api.handleDeviceAuth(pinCodeData)) { + showToast( + txt( + R.string.authenticated_user, api.name ) - ) + ) + dialog.dismissSafe(activity) + cancel() + } + } + } + + override fun onFinish() { + showToast(R.string.device_pin_expired_message) dialog.dismissSafe(activity) } - return@ioSafe - } - delay(1000) - expirationCounter-- - } - activity.runOnUiThread { - showToast( - activity.getString(R.string.device_pin_expired_message) - ) - dialog.dismissSafe(activity) + + }.start() } } catch (e: Exception) { logError(e) } } - } else { - api.authenticate(activity) } } @@ -332,23 +341,15 @@ class SettingsAccount : PreferenceFragmentCompat(), BiometricAuthenticator.Biome server = if (api.requiresServer) binding.loginServerInput.text?.toString() else null, ) ioSafe { - val isSuccessful = try { - api.login(loginData) + try { + showToast( + txt( + if (api.login(loginData)) R.string.authenticated_user else R.string.authenticated_user_fail, + api.name + ) + ) } catch (e: Exception) { logError(e) - false - } - activity.runOnUiThread { - try { - showToast( - activity.getString(if (isSuccessful) R.string.authenticated_user else R.string.authenticated_user_fail) - .format( - api.name - ) - ) - } catch (e: Exception) { - logError(e) // format might fail - } } } dialog.dismissSafe(activity) diff --git a/app/src/main/res/drawable/cloud_2_solid.xml b/app/src/main/res/drawable/cloud_2_solid.xml index a1a37292..3810b4bf 100644 --- a/app/src/main/res/drawable/cloud_2_solid.xml +++ b/app/src/main/res/drawable/cloud_2_solid.xml @@ -3,6 +3,6 @@ android:viewportHeight="283" xmlns:android="http://schemas.android.com/apk/res/android"> \ No newline at end of file