diff --git a/android/app/build.gradle b/android/app/build.gradle index 9d982b3096..1427d09c7c 100644 --- a/android/app/build.gradle +++ b/android/app/build.gradle @@ -392,8 +392,6 @@ dependencies { implementation "androidx.navigation:navigation-compose:2.8.0-beta03" implementation "org.jetbrains.kotlinx:kotlinx-serialization-json:1.6.3" - // blurriness - implementation "com.github.skydoves:cloudy:0.1.2" // countries implementation 'com.hbb20:ccp:2.7.3' // webview diff --git a/android/app/src/main/java/app/tourism/Constants.kt b/android/app/src/main/java/app/tourism/Constants.kt index 1aa012fc03..18ad7fecd0 100644 --- a/android/app/src/main/java/app/tourism/Constants.kt +++ b/android/app/src/main/java/app/tourism/Constants.kt @@ -4,12 +4,9 @@ import androidx.compose.foundation.background import androidx.compose.foundation.border import androidx.compose.foundation.layout.WindowInsets import androidx.compose.foundation.shape.RoundedCornerShape -import androidx.compose.material3.MaterialTheme import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier import androidx.compose.ui.draw.clip -import androidx.compose.ui.draw.drawBehind -import androidx.compose.ui.graphics.BlendMode import androidx.compose.ui.graphics.Brush import androidx.compose.ui.graphics.Color import androidx.compose.ui.unit.dp @@ -63,3 +60,18 @@ fun Modifier.drawOverlayForTextBehind() = ) ) ) + +@Composable +fun Modifier.drawDarkContainerBehind(): Modifier { + val alpha = 0.4f + return this + .clip(RoundedCornerShape(20.dp)) + .background( + Brush.verticalGradient( + colors = listOf( + Color.Black.copy(alpha = alpha), + Color.Black.copy(alpha = alpha) + ) + ) + ) +} diff --git a/android/app/src/main/java/app/tourism/ui/common/BlurryContainer.kt b/android/app/src/main/java/app/tourism/ui/common/BlurryContainer.kt deleted file mode 100644 index bd1001d6ca..0000000000 --- a/android/app/src/main/java/app/tourism/ui/common/BlurryContainer.kt +++ /dev/null @@ -1,54 +0,0 @@ -package app.tourism.ui.common - -import androidx.compose.foundation.layout.Box -import androidx.compose.foundation.layout.Column -import androidx.compose.foundation.layout.fillMaxWidth -import androidx.compose.foundation.layout.height -import androidx.compose.foundation.shape.RoundedCornerShape -import androidx.compose.runtime.Composable -import androidx.compose.runtime.getValue -import androidx.compose.runtime.mutableStateOf -import androidx.compose.runtime.remember -import androidx.compose.runtime.setValue -import androidx.compose.ui.Alignment -import androidx.compose.ui.Modifier -import androidx.compose.ui.draw.clip -import androidx.compose.ui.layout.onSizeChanged -import androidx.compose.ui.platform.LocalDensity -import androidx.compose.ui.unit.dp -import com.skydoves.cloudy.Cloudy -import com.skydoves.cloudy.CloudyState - -@Composable -fun BlurryContainer(modifier: Modifier = Modifier, content: @Composable () -> Unit) { - val localDensity = LocalDensity.current - - val cloudyState = remember { mutableStateOf(CloudyState.Nothing) } - - Box(Modifier.then(modifier)) { - var height by remember { mutableStateOf(0.dp) } - Cloudy( - radius = 25, - modifier = Modifier - .fillMaxWidth() - .height(height) - .align(Alignment.Center) - .clip(RoundedCornerShape(16.dp)), - - onStateChanged = { - println("cloudyState: $cloudyState") - cloudyState.value = it - } - ) {} - if (cloudyState.value is CloudyState.Success || cloudyState.value is CloudyState.Error || cloudyState.value is CloudyState.Loading) - Column( - Modifier - .align(Alignment.Center) - .onSizeChanged { newSize -> - height = with(localDensity) { newSize.height.toDp() } - } - ) { - content() - } - } -} \ No newline at end of file diff --git a/android/app/src/main/java/app/tourism/ui/screens/auth/sign_in/SignInScreen.kt b/android/app/src/main/java/app/tourism/ui/screens/auth/sign_in/SignInScreen.kt index b8e60c2d9f..23d43fb14f 100644 --- a/android/app/src/main/java/app/tourism/ui/screens/auth/sign_in/SignInScreen.kt +++ b/android/app/src/main/java/app/tourism/ui/screens/auth/sign_in/SignInScreen.kt @@ -1,13 +1,16 @@ package app.tourism.ui.screens.auth.sign_in import PasswordEditText +import android.view.RoundedCorner import androidx.compose.foundation.Image +import androidx.compose.foundation.background import androidx.compose.foundation.clickable import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.shape.RoundedCornerShape import androidx.compose.foundation.text.KeyboardActions import androidx.compose.foundation.text.KeyboardOptions import androidx.compose.material3.Text @@ -16,7 +19,9 @@ import androidx.compose.runtime.Composable import androidx.compose.runtime.collectAsState import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier +import androidx.compose.ui.draw.clip import androidx.compose.ui.focus.FocusDirection +import androidx.compose.ui.graphics.Brush import androidx.compose.ui.graphics.Color import androidx.compose.ui.layout.ContentScale import androidx.compose.ui.platform.LocalContext @@ -31,6 +36,7 @@ import app.organicmaps.R import app.tourism.BASE_URL import app.tourism.Constants import app.tourism.domain.models.resource.Resource +import app.tourism.drawDarkContainerBehind import app.tourism.drawOverlayForTextBehind import app.tourism.ui.ObserveAsEvents import app.tourism.ui.common.VerticalSpace @@ -84,11 +90,12 @@ fun SignInScreen( .align(Alignment.TopCenter) ) { VerticalSpace(height = 80.dp) - Box(Modifier.padding(Constants.SCREEN_PADDING)) { - Image( - painter = painterResource(id = R.drawable.blur_background), - contentDescription = null - ) + + Box( + Modifier + .padding(Constants.SCREEN_PADDING) + .drawDarkContainerBehind() + ) { Column(Modifier.padding(36.dp)) { Text( modifier = Modifier.align(Alignment.CenterHorizontally), diff --git a/android/app/src/main/java/app/tourism/ui/screens/auth/sign_up/SignUpScreen.kt b/android/app/src/main/java/app/tourism/ui/screens/auth/sign_up/SignUpScreen.kt index 67b9b30579..f54ad802c7 100644 --- a/android/app/src/main/java/app/tourism/ui/screens/auth/sign_up/SignUpScreen.kt +++ b/android/app/src/main/java/app/tourism/ui/screens/auth/sign_up/SignUpScreen.kt @@ -32,6 +32,7 @@ import androidx.hilt.navigation.compose.hiltViewModel import app.organicmaps.R import app.tourism.Constants import app.tourism.domain.models.resource.Resource +import app.tourism.drawDarkContainerBehind import app.tourism.drawOverlayForTextBehind import app.tourism.ui.ObserveAsEvents import app.tourism.ui.common.VerticalSpace @@ -93,11 +94,8 @@ fun SignUpScreen( .align(alignment = Alignment.TopCenter) ) { VerticalSpace(height = 48.dp) - Box(Modifier.padding(Constants.SCREEN_PADDING)) { - Image( - painter = painterResource(id = R.drawable.blur_background), - contentDescription = null - ) + Box(Modifier.padding(Constants.SCREEN_PADDING) + .drawDarkContainerBehind()) { Column( Modifier.padding(36.dp) ) { diff --git a/android/app/src/main/res/drawable/blur_background.png b/android/app/src/main/res/drawable/blur_background.png deleted file mode 100644 index d06de80a23..0000000000 Binary files a/android/app/src/main/res/drawable/blur_background.png and /dev/null differ diff --git a/android/app/src/main/res/drawable/blur_background.xml b/android/app/src/main/res/drawable/blur_background.xml new file mode 100644 index 0000000000..42645d2f39 --- /dev/null +++ b/android/app/src/main/res/drawable/blur_background.xml @@ -0,0 +1,10 @@ + + + diff --git a/iphone/Maps/Tourism/Presentation/Auth/Screens/SignUpViewController.swift b/iphone/Maps/Tourism/Presentation/Auth/Screens/SignUpViewController.swift index 849f20de7c..ba54f3f138 100644 --- a/iphone/Maps/Tourism/Presentation/Auth/Screens/SignUpViewController.swift +++ b/iphone/Maps/Tourism/Presentation/Auth/Screens/SignUpViewController.swift @@ -105,15 +105,38 @@ class SignUpViewController: UIViewController { return button }() + private let developedByLabel: UILabel = { + let label = UILabel() + label.text = L("developed_by_label") + label.textColor = .white + UIKitFont.applyStyle(to: label, style: UIKitFont.h4) + applyWrapContent(label: label) + label.translatesAutoresizingMaskIntoConstraints = false + return label + }() + override func viewDidLoad() { super.viewDidLoad() setupViews() } private func setupViews() { + let gradientView = UIView(frame: CGRect(x: 0, y: view.height - 100, width: view.width, height: 100)) + let tapGesture = UITapGestureRecognizer(target: self, action: #selector(developedByLabelTapped)) + + gradientView.addGestureRecognizer(tapGesture) + gradientView.isUserInteractionEnabled = true + + let gradient = CAGradientLayer() + gradient.frame = gradientView.bounds + gradient.colors = [UIColor.clear.cgColor, UIColor.black.cgColor] + gradientView.layer.insertSublayer(gradient, at: 0) + view.addSubview(backgroundImageView) view.addSubview(backButton) view.addSubview(containerView) + view.addSubview(gradientView) + view.addSubview(developedByLabel) containerView.addSubview(blurView) containerView.addSubview(titleLabel) @@ -193,7 +216,10 @@ class SignUpViewController: UIViewController { // Forgot Password Button forgotPasswordButton.topAnchor.constraint(equalTo: signUpButton.bottomAnchor, constant: 20), forgotPasswordButton.leadingAnchor.constraint(equalTo: containerView.leadingAnchor, constant: 32), - forgotPasswordButton.bottomAnchor.constraint(equalTo: containerView.bottomAnchor, constant: -32) + forgotPasswordButton.bottomAnchor.constraint(equalTo: containerView.bottomAnchor, constant: -32), + + developedByLabel.trailingAnchor.constraint(equalTo: view.trailingAnchor, constant: -16), + developedByLabel.bottomAnchor.constraint(equalTo: view.bottomAnchor, constant: -32) ]) backButton.addTarget(self, action: #selector(backButtonTapped), for: .touchUpInside) @@ -236,6 +262,13 @@ class SignUpViewController: UIViewController { self.navigationController?.popViewController(animated: false) } + @objc func developedByLabelTapped() { + print("developedByLabelTapped") + if let url = URL(string: "https://rebus.tj") { + UIApplication.shared.open(url) + } + } + // MARK: - other functions private func showError(message: String) { signUpButton.isLoading = false