diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 4b0c95b1f..6903d8687 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -24,7 +24,6 @@ android:name=".ui.MainActivity" android:configChanges="orientation" android:exported="true" - android:screenOrientation="userPortrait" android:theme="@style/Theme.TranslateYou" android:windowSoftInputMode="adjustResize" tools:ignore="LockedOrientationActivity"> diff --git a/app/src/main/java/com/bnyro/translate/ui/ShareActivity.kt b/app/src/main/java/com/bnyro/translate/ui/ShareActivity.kt index be271aeaf..a0a675a75 100644 --- a/app/src/main/java/com/bnyro/translate/ui/ShareActivity.kt +++ b/app/src/main/java/com/bnyro/translate/ui/ShareActivity.kt @@ -19,6 +19,7 @@ package com.bnyro.translate.ui import android.annotation.SuppressLint import android.content.Intent +import android.content.res.Configuration import android.net.Uri import android.os.Build import android.os.Bundle @@ -31,6 +32,7 @@ import androidx.compose.runtime.LaunchedEffect import androidx.compose.ui.Modifier import androidx.compose.ui.platform.LocalConfiguration import androidx.compose.ui.res.stringResource +import androidx.compose.ui.unit.Dp import androidx.compose.ui.unit.dp import androidx.compose.ui.window.DialogProperties import com.bnyro.translate.R @@ -54,38 +56,31 @@ class ShareActivity : BaseActivity() { translationModel.refresh(this@ShareActivity) } - AlertDialog( - modifier = Modifier - .heightIn(max = screenHeight * 2 / 3) - .padding(horizontal = 10.dp), - properties = DialogProperties( - dismissOnClickOutside = false, - usePlatformDefaultWidth = false - ), - onDismissRequest = { finish() }, - confirmButton = { - DialogButton( - text = stringResource(R.string.okay) - ) { - finish() - } - }, - dismissButton = { - DialogButton(text = stringResource(R.string.clear)) { - translationModel.clearTranslation() - } - }, - title = { - AppHeader() - }, - text = { - TranslationComponent( - modifier = Modifier.fillMaxSize(), - viewModel = translationModel, - showLanguageSelector = true - ) + AlertDialog(modifier = Modifier + .heightIn( + max = if (configuration.orientation == Configuration.ORIENTATION_PORTRAIT) screenHeight * 2 / 3 else Dp.Unspecified + ) + .padding(horizontal = 10.dp), properties = DialogProperties( + dismissOnClickOutside = false, usePlatformDefaultWidth = false + ), onDismissRequest = { finish() }, confirmButton = { + DialogButton( + text = stringResource(R.string.okay) + ) { + finish() } - ) + }, dismissButton = { + DialogButton(text = stringResource(R.string.clear)) { + translationModel.clearTranslation() + } + }, title = { + AppHeader() + }, text = { + TranslationComponent( + modifier = Modifier.fillMaxSize(), + viewModel = translationModel, + showLanguageSelector = true + ) + }) } setFinishOnTouchOutside(false) diff --git a/app/src/main/java/com/bnyro/translate/ui/components/AppHeader.kt b/app/src/main/java/com/bnyro/translate/ui/components/AppHeader.kt index 57ef4fc76..12f3d7b23 100644 --- a/app/src/main/java/com/bnyro/translate/ui/components/AppHeader.kt +++ b/app/src/main/java/com/bnyro/translate/ui/components/AppHeader.kt @@ -52,7 +52,7 @@ fun AppHeader() { verticalAlignment = Alignment.CenterVertically ) { Icon( - modifier = Modifier.size(70.dp), + modifier = Modifier.size(50.dp), painter = painterResource(R.drawable.ic_app_icon), contentDescription = stringResource(R.string.app_name), ) diff --git a/app/src/main/java/com/bnyro/translate/ui/components/LanguageSelectionComponent.kt b/app/src/main/java/com/bnyro/translate/ui/components/LanguageSelectionComponent.kt new file mode 100644 index 000000000..ae53988fe --- /dev/null +++ b/app/src/main/java/com/bnyro/translate/ui/components/LanguageSelectionComponent.kt @@ -0,0 +1,166 @@ +/* + * Copyright (c) 2024 You Apps + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package com.bnyro.translate.ui.components + +import android.content.res.Configuration +import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.size +import androidx.compose.material3.Icon +import androidx.compose.material3.IconButton +import androidx.compose.material3.MaterialTheme +import androidx.compose.runtime.Composable +import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.remember +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.platform.LocalConfiguration +import androidx.compose.ui.res.painterResource +import androidx.compose.ui.unit.dp +import com.bnyro.translate.R +import com.bnyro.translate.obj.Translation +import com.bnyro.translate.ui.models.TranslationModel + +@Composable +fun LanguageSelectionComponent(viewModel: TranslationModel) { + val orientation = LocalConfiguration.current.orientation + + if (orientation == Configuration.ORIENTATION_PORTRAIT) { + Row( + modifier = Modifier + .padding(10.dp) + .padding(top = 5.dp), + verticalAlignment = Alignment.CenterVertically + ) { + Box( + modifier = Modifier.weight(1f), + contentAlignment = Alignment.Center + ) { + LanguageSelector( + viewModel.availableLanguages, + viewModel.sourceLanguage, + autoLanguageEnabled = viewModel.engine.autoLanguageCode != null, + viewModel = viewModel + ) { + if (it == viewModel.targetLanguage) { + viewModel.targetLanguage = viewModel.sourceLanguage + } + viewModel.sourceLanguage = it + viewModel.translateNow() + } + } + + SwapLanguagesButton(viewModel) + + Box( + modifier = Modifier.weight(1f), + contentAlignment = Alignment.Center + ) { + LanguageSelector( + viewModel.availableLanguages, + viewModel.targetLanguage, + viewModel = viewModel + ) { + if (it == viewModel.sourceLanguage) { + viewModel.sourceLanguage = viewModel.targetLanguage + } + viewModel.targetLanguage = it + viewModel.translateNow() + } + } + } + } else { + Column( + modifier = Modifier + .padding(10.dp) + .padding(top = 5.dp), + horizontalAlignment = Alignment.CenterHorizontally + ) { + Box( + contentAlignment = Alignment.Center + ) { + LanguageSelector( + viewModel.availableLanguages, + viewModel.sourceLanguage, + autoLanguageEnabled = viewModel.engine.autoLanguageCode != null, + viewModel = viewModel + ) { + if (it == viewModel.targetLanguage) { + viewModel.targetLanguage = viewModel.sourceLanguage + } + viewModel.sourceLanguage = it + viewModel.translateNow() + } + } + + SwapLanguagesButton(viewModel) + + Box( + contentAlignment = Alignment.Center + ) { + LanguageSelector( + viewModel.availableLanguages, + viewModel.targetLanguage, + viewModel = viewModel + ) { + if (it == viewModel.sourceLanguage) { + viewModel.sourceLanguage = viewModel.targetLanguage + } + viewModel.targetLanguage = it + viewModel.translateNow() + } + } + } + } +} + +@Composable +fun SwapLanguagesButton(viewModel: TranslationModel) { + val switchBtnEnabled by remember { + mutableStateOf(viewModel.sourceLanguage.code.isNotEmpty()) + } + + IconButton( + onClick = { + if (viewModel.availableLanguages.isEmpty()) return@IconButton + if (!switchBtnEnabled) return@IconButton + val temp = viewModel.sourceLanguage + viewModel.sourceLanguage = viewModel.targetLanguage + viewModel.targetLanguage = temp + + if (viewModel.translation.translatedText.isNotEmpty()) { + viewModel.insertedText = viewModel.translation.translatedText + viewModel.translation = Translation("") + } + + viewModel.translateNow() + } + ) { + Icon( + painterResource(R.drawable.ic_switch), + null, + modifier = Modifier + .size(18.dp), + tint = if (switchBtnEnabled) MaterialTheme.colorScheme.onSurface else Color.Gray + ) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/bnyro/translate/ui/components/TranslationFooter.kt b/app/src/main/java/com/bnyro/translate/ui/components/TranslationFooter.kt deleted file mode 100644 index 75bdf2fd3..000000000 --- a/app/src/main/java/com/bnyro/translate/ui/components/TranslationFooter.kt +++ /dev/null @@ -1,112 +0,0 @@ -/* - * Copyright (c) 2024 You Apps - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -package com.bnyro.translate.ui.components - -import androidx.compose.foundation.layout.Box -import androidx.compose.foundation.layout.Row -import androidx.compose.foundation.layout.padding -import androidx.compose.foundation.layout.size -import androidx.compose.material3.Icon -import androidx.compose.material3.IconButton -import androidx.compose.material3.MaterialTheme -import androidx.compose.runtime.Composable -import androidx.compose.runtime.getValue -import androidx.compose.runtime.mutableStateOf -import androidx.compose.runtime.remember -import androidx.compose.ui.Alignment -import androidx.compose.ui.Modifier -import androidx.compose.ui.graphics.Color -import androidx.compose.ui.res.painterResource -import androidx.compose.ui.unit.dp -import com.bnyro.translate.R -import com.bnyro.translate.obj.Translation -import com.bnyro.translate.ui.models.TranslationModel - -@Composable -fun TranslationFooter(viewModel: TranslationModel) { - Row( - modifier = Modifier - .padding(10.dp) - .padding(top = 5.dp), - verticalAlignment = Alignment.CenterVertically - ) { - Box( - modifier = Modifier.weight(1f), - contentAlignment = Alignment.Center - ) { - LanguageSelector( - viewModel.availableLanguages, - viewModel.sourceLanguage, - autoLanguageEnabled = viewModel.engine.autoLanguageCode != null, - viewModel = viewModel - ) { - if (it == viewModel.targetLanguage) { - viewModel.targetLanguage = viewModel.sourceLanguage - } - viewModel.sourceLanguage = it - viewModel.translateNow() - } - } - - val switchBtnEnabled by remember { - mutableStateOf(viewModel.sourceLanguage.code.isNotEmpty()) - } - - IconButton( - onClick = { - if (viewModel.availableLanguages.isEmpty()) return@IconButton - if (!switchBtnEnabled) return@IconButton - val temp = viewModel.sourceLanguage - viewModel.sourceLanguage = viewModel.targetLanguage - viewModel.targetLanguage = temp - - if (viewModel.translation.translatedText.isNotEmpty()) { - viewModel.insertedText = viewModel.translation.translatedText - viewModel.translation = Translation("") - } - - viewModel.translateNow() - } - ) { - Icon( - painterResource(R.drawable.ic_switch), - null, - modifier = Modifier - .size(18.dp), - tint = if (switchBtnEnabled) MaterialTheme.colorScheme.onSurface else Color.Gray - ) - } - - Box( - modifier = Modifier.weight(1f), - contentAlignment = Alignment.Center - ) { - LanguageSelector( - viewModel.availableLanguages, - viewModel.targetLanguage, - viewModel = viewModel - ) { - if (it == viewModel.sourceLanguage) { - viewModel.sourceLanguage = viewModel.targetLanguage - } - viewModel.targetLanguage = it - viewModel.translateNow() - } - } - } -} \ No newline at end of file diff --git a/app/src/main/java/com/bnyro/translate/ui/screens/TranslationPage.kt b/app/src/main/java/com/bnyro/translate/ui/screens/TranslationPage.kt index cd677ff04..0f0f8d74a 100644 --- a/app/src/main/java/com/bnyro/translate/ui/screens/TranslationPage.kt +++ b/app/src/main/java/com/bnyro/translate/ui/screens/TranslationPage.kt @@ -18,10 +18,11 @@ package com.bnyro.translate.ui.screens import android.annotation.SuppressLint -import android.util.Log +import android.content.res.Configuration import android.view.ViewTreeObserver import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.Spacer import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.height @@ -45,6 +46,7 @@ import androidx.compose.runtime.setValue import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.Color +import androidx.compose.ui.platform.LocalConfiguration import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.platform.LocalView import androidx.compose.ui.res.stringResource @@ -54,7 +56,7 @@ import androidx.core.view.WindowInsetsCompat import androidx.navigation.NavController import com.bnyro.translate.R import com.bnyro.translate.obj.MenuItemData -import com.bnyro.translate.ui.components.TranslationFooter +import com.bnyro.translate.ui.components.LanguageSelectionComponent import com.bnyro.translate.ui.models.TranslationModel import com.bnyro.translate.ui.nav.Destination import com.bnyro.translate.ui.views.AdditionalInfoComponent @@ -70,23 +72,6 @@ fun TranslationPage( viewModel: TranslationModel ) { val context = LocalContext.current - val view = LocalView.current - - var isKeyboardOpen by remember { - mutableStateOf(false) - } - // detect whether the keyboard is open or closed - DisposableEffect(view) { - val listener = ViewTreeObserver.OnGlobalLayoutListener { - isKeyboardOpen = ViewCompat.getRootWindowInsets(view) - ?.isVisible(WindowInsetsCompat.Type.ime()) ?: true - } - - view.viewTreeObserver.addOnGlobalLayoutListener(listener) - onDispose { - view.viewTreeObserver.removeOnGlobalLayoutListener(listener) - } - } LaunchedEffect(Unit) { viewModel.refresh(context) @@ -133,55 +118,82 @@ fun TranslationPage( ) ) } - ) { - Column( - modifier = Modifier - .padding(it) - .fillMaxSize(), - verticalArrangement = Arrangement.Center, - horizontalAlignment = Alignment.CenterHorizontally - ) { + ) { pV -> + val orientation = LocalConfiguration.current.orientation + + if (orientation == Configuration.ORIENTATION_PORTRAIT) { Column( modifier = Modifier - .fillMaxSize(), - horizontalAlignment = Alignment.CenterHorizontally + .fillMaxSize() + .padding(pV) ) { - ElevatedCard( - modifier = Modifier - .weight(1.0f) - ) { - Column( - modifier = Modifier.padding(16.dp) - ) { - TranslationComponent(Modifier.weight(1f), viewModel) + MainTranslationArea(modifier = Modifier.weight(1f), viewModel = viewModel) - if (Preferences.get(Preferences.showAdditionalInfo, true) - && !isKeyboardOpen - ) { - AdditionalInfoComponent(viewModel.translation, viewModel) - } + LanguageSelectionComponent(viewModel = viewModel) + } + } else { + Row( + modifier = Modifier + .fillMaxSize() + .padding(pV) + ) { + LanguageSelectionComponent(viewModel = viewModel) - Spacer( - modifier = Modifier - .height(15.dp) - ) + MainTranslationArea(modifier = Modifier.weight(1f), viewModel = viewModel) + } + } + } +} - if (viewModel.simTranslationEnabled) { - Log.e("sim tra", "sim") - SimTranslationComponent(viewModel) - } else { - HorizontalDivider( - color = Color.Gray, - modifier = Modifier - .align(alignment = Alignment.CenterHorizontally) - .size(70.dp, 2.dp) - ) - } - } - } +@Composable +fun MainTranslationArea(modifier: Modifier, viewModel: TranslationModel) { + val view = LocalView.current + + var isKeyboardOpen by remember { + mutableStateOf(false) + } + // detect whether the keyboard is open or closed + DisposableEffect(view) { + val listener = ViewTreeObserver.OnGlobalLayoutListener { + isKeyboardOpen = ViewCompat.getRootWindowInsets(view) + ?.isVisible(WindowInsetsCompat.Type.ime()) ?: true + } - TranslationFooter(viewModel = viewModel) + view.viewTreeObserver.addOnGlobalLayoutListener(listener) + onDispose { + view.viewTreeObserver.removeOnGlobalLayoutListener(listener) + } + } + + ElevatedCard( + modifier = modifier + ) { + Column( + modifier = Modifier.padding(16.dp) + ) { + TranslationComponent(Modifier.weight(1f), viewModel) + + if (Preferences.get(Preferences.showAdditionalInfo, true) + && !isKeyboardOpen + ) { + AdditionalInfoComponent(viewModel.translation, viewModel) + } + + Spacer( + modifier = Modifier + .height(15.dp) + ) + + if (viewModel.simTranslationEnabled) { + SimTranslationComponent(viewModel) + } else { + HorizontalDivider( + color = Color.Gray, + modifier = Modifier + .align(alignment = Alignment.CenterHorizontally) + .size(70.dp, 2.dp) + ) } } } -} +} \ No newline at end of file