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