From dc9c67480c9af074be4dbe129762cdf77b47a86e Mon Sep 17 00:00:00 2001 From: Emin Date: Mon, 22 Jul 2024 17:58:16 +0500 Subject: [PATCH] android: set domain, adjustments, fix bugs, optimize imports --- .../java/app/organicmaps/MwmActivity.java | 3 +- .../downloader/OnmapDownloader.java | 9 +++--- .../src/main/java/app/tourism/Constants.kt | 20 ++++++------ .../src/main/java/app/tourism/MainActivity.kt | 2 +- .../app/tourism/data/db/dao/ReviewsDao.kt | 1 - .../data/db/entities/ReviewToPublishEntity.kt | 1 - .../app/tourism/data/remote/TourismApi.kt | 2 -- .../data/repositories/AuthRepository.kt | 1 - .../main/java/app/tourism/di/NetworkModule.kt | 4 +-- .../java/app/tourism/di/RepositoriesModule.kt | 4 +-- .../java/app/tourism/ui/common/WebView.kt | 3 -- .../tourism/ui/common/special/CountryFlag.kt | 22 +++++++++++++ .../tourism/ui/common/textfields/EditText.kt | 1 - .../ui/screens/auth/sign_in/SignInScreen.kt | 4 +-- .../ui/screens/auth/sign_up/SignUpScreen.kt | 1 - .../categories/CategoriesViewModel.kt | 1 - .../categories/HorizontalSingleChoice.kt | 1 - .../favorites/favorites/FavoritesScreen.kt | 1 - .../ui/screens/main/home/HomeViewModel.kt | 24 ++++++++++---- .../main/place_details/PlaceViewModel.kt | 4 --- .../reviews/PostReviewViewModel.kt | 1 - .../place_details/reviews/ReviewsScreen.kt | 2 -- .../main/profile/profile/ProfileScreen.kt | 30 ++++++++++++------ .../main/java/app/tourism/utils/FileUtils.kt | 1 - android/app/src/main/res/drawable/eu_flag.png | Bin 0 -> 7232 bytes .../src/main/res/layout/ccp_country_flag.xml | 15 +++++++++ 26 files changed, 97 insertions(+), 61 deletions(-) create mode 100644 android/app/src/main/java/app/tourism/ui/common/special/CountryFlag.kt create mode 100644 android/app/src/main/res/drawable/eu_flag.png create mode 100644 android/app/src/main/res/layout/ccp_country_flag.xml diff --git a/android/app/src/main/java/app/organicmaps/MwmActivity.java b/android/app/src/main/java/app/organicmaps/MwmActivity.java index 173d629538..4112f3ceee 100644 --- a/android/app/src/main/java/app/organicmaps/MwmActivity.java +++ b/android/app/src/main/java/app/organicmaps/MwmActivity.java @@ -564,10 +564,11 @@ public class MwmActivity extends BaseMwmFragmentActivity Runnable delayedAction = () -> { CountryItem mCurrentCountry = CountryItem.fill("Tajikistan"); - goToTjkIfNotThere(); if(mCurrentCountry.status != CountryItem.STATUS_DONE) { // navigate to Dushanbe so it automatically downloads Tajikistan map goToDushanbe(); + } else { + goToTjkIfNotThere(); } }; handler.postDelayed(delayedAction, 1000); diff --git a/android/app/src/main/java/app/organicmaps/downloader/OnmapDownloader.java b/android/app/src/main/java/app/organicmaps/downloader/OnmapDownloader.java index 96a16a8467..f4debf1926 100644 --- a/android/app/src/main/java/app/organicmaps/downloader/OnmapDownloader.java +++ b/android/app/src/main/java/app/organicmaps/downloader/OnmapDownloader.java @@ -90,11 +90,13 @@ public class OnmapDownloader implements MwmActivity.LeftAnimationTrackListener private void navigationToMainActivityHandling() { Handler handler = new Handler(Looper.getMainLooper()); Runnable delayedAction = () -> { - if(mCurrentCountry.present) { + if(mCurrentCountry.present && !alreadyNavigating) { + alreadyNavigating = true; mActivity.removeScreenBlock(); Intent intent = new Intent(mActivity, MainActivity.class); intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK | Intent.FLAG_ACTIVITY_NEW_TASK); startActivity(mActivity, intent, null); + alreadyNavigating = true; } }; handler.postDelayed(delayedAction, 1000); @@ -118,10 +120,7 @@ public class OnmapDownloader implements MwmActivity.LeftAnimationTrackListener private void updateProgressState(boolean shouldAutoDownload) { - if(!alreadyNavigating) { - alreadyNavigating = true; - navigationToMainActivityHandling(); - } + navigationToMainActivityHandling(); updateStateInternal(shouldAutoDownload); } diff --git a/android/app/src/main/java/app/tourism/Constants.kt b/android/app/src/main/java/app/tourism/Constants.kt index c600b11238..fb83fb3615 100644 --- a/android/app/src/main/java/app/tourism/Constants.kt +++ b/android/app/src/main/java/app/tourism/Constants.kt @@ -1,8 +1,10 @@ package app.tourism +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 @@ -15,7 +17,7 @@ import app.organicmaps.R import app.tourism.ui.theme.getBorderColor const val TAG = "GLOBAL_TAG" -const val BASE_URL = "http://192.168.1.80:8888/api/" +const val BASE_URL = "https://product.rebus.tj" object Constants { // UI @@ -53,13 +55,11 @@ fun Modifier.applyAppBorder() = this @Composable fun Modifier.drawOverlayForTextBehind() = - this.drawBehind { - val colors = listOf( - Color.Black, - Color.Transparent + this.background( + brush = Brush.verticalGradient( + colors = listOf( + Color.Transparent, + Color.Black.copy(alpha = 0.8f), + ) ) - drawRect( - brush = Brush.verticalGradient(colors), - blendMode = BlendMode.DstIn - ) - } + ) diff --git a/android/app/src/main/java/app/tourism/MainActivity.kt b/android/app/src/main/java/app/tourism/MainActivity.kt index 3841c8c118..5010dc9fb2 100644 --- a/android/app/src/main/java/app/tourism/MainActivity.kt +++ b/android/app/src/main/java/app/tourism/MainActivity.kt @@ -46,8 +46,8 @@ class MainActivity : ComponentActivity() { intentFilter.addAction(WifiManager.NETWORK_STATE_CHANGED_ACTION) registerReceiver(wifiReceiver, intentFilter) - navigateToAuthIfNotAuthed() navigateToMapToDownloadIfNotPresent() + navigateToAuthIfNotAuthed() val blackest = resources.getColor(R.color.button_text) // yes, I know enableEdgeToEdge( diff --git a/android/app/src/main/java/app/tourism/data/db/dao/ReviewsDao.kt b/android/app/src/main/java/app/tourism/data/db/dao/ReviewsDao.kt index e00f7d5f0e..e0f384c753 100644 --- a/android/app/src/main/java/app/tourism/data/db/dao/ReviewsDao.kt +++ b/android/app/src/main/java/app/tourism/data/db/dao/ReviewsDao.kt @@ -1,7 +1,6 @@ package app.tourism.data.db.dao import androidx.room.Dao -import androidx.room.Delete import androidx.room.Insert import androidx.room.OnConflictStrategy import androidx.room.Query diff --git a/android/app/src/main/java/app/tourism/data/db/entities/ReviewToPublishEntity.kt b/android/app/src/main/java/app/tourism/data/db/entities/ReviewToPublishEntity.kt index 54741d908f..044f85eacf 100644 --- a/android/app/src/main/java/app/tourism/data/db/entities/ReviewToPublishEntity.kt +++ b/android/app/src/main/java/app/tourism/data/db/entities/ReviewToPublishEntity.kt @@ -4,7 +4,6 @@ import androidx.room.Entity import androidx.room.PrimaryKey import app.tourism.domain.models.details.ReviewToPost import java.io.File -import java.net.URI @Entity(tableName = "reviews_planned_to_post") data class ReviewPlannedToPostEntity( diff --git a/android/app/src/main/java/app/tourism/data/remote/TourismApi.kt b/android/app/src/main/java/app/tourism/data/remote/TourismApi.kt index 6471195a53..afe922ecf4 100644 --- a/android/app/src/main/java/app/tourism/data/remote/TourismApi.kt +++ b/android/app/src/main/java/app/tourism/data/remote/TourismApi.kt @@ -4,7 +4,6 @@ import app.tourism.data.dto.AllDataDto import app.tourism.data.dto.CategoryDto import app.tourism.data.dto.FavoritesDto import app.tourism.data.dto.FavoritesIdsDto -import app.tourism.data.dto.HashDto import app.tourism.data.dto.auth.AuthResponseDto import app.tourism.data.dto.place.ReviewDto import app.tourism.data.dto.place.ReviewIdsDto @@ -17,7 +16,6 @@ import okhttp3.MultipartBody import okhttp3.RequestBody import retrofit2.Response import retrofit2.http.Body -import retrofit2.http.DELETE import retrofit2.http.Field import retrofit2.http.FormUrlEncoded import retrofit2.http.GET diff --git a/android/app/src/main/java/app/tourism/data/repositories/AuthRepository.kt b/android/app/src/main/java/app/tourism/data/repositories/AuthRepository.kt index 6343c97181..db67281abc 100644 --- a/android/app/src/main/java/app/tourism/data/repositories/AuthRepository.kt +++ b/android/app/src/main/java/app/tourism/data/repositories/AuthRepository.kt @@ -7,7 +7,6 @@ import app.tourism.domain.models.SimpleResponse import app.tourism.domain.models.auth.AuthResponse import app.tourism.domain.models.auth.RegistrationData import app.tourism.domain.models.resource.Resource -import dagger.hilt.android.qualifiers.ApplicationContext import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.flow diff --git a/android/app/src/main/java/app/tourism/di/NetworkModule.kt b/android/app/src/main/java/app/tourism/di/NetworkModule.kt index 7f715e14d5..c28de5def4 100644 --- a/android/app/src/main/java/app/tourism/di/NetworkModule.kt +++ b/android/app/src/main/java/app/tourism/di/NetworkModule.kt @@ -24,7 +24,7 @@ object NetworkModule { @Singleton fun provideApi(okHttpClient: OkHttpClient): TourismApi { return Retrofit.Builder() - .baseUrl(BASE_URL) + .baseUrl("$BASE_URL/api/") .addConverterFactory(GsonConverterFactory.create()) .client(okHttpClient) .build() @@ -66,7 +66,7 @@ object NetworkModule { @Named(CURRENCY_RETROFIT_LABEL) fun provideCurrencyRetrofit(client: OkHttpClient): Retrofit { return Retrofit.Builder() - .baseUrl(BASE_URL) + .baseUrl("$BASE_URL/api/") .addConverterFactory(GsonConverterFactory.create()) .client(client) .build() diff --git a/android/app/src/main/java/app/tourism/di/RepositoriesModule.kt b/android/app/src/main/java/app/tourism/di/RepositoriesModule.kt index 4c36945f9d..ccaa30a48e 100644 --- a/android/app/src/main/java/app/tourism/di/RepositoriesModule.kt +++ b/android/app/src/main/java/app/tourism/di/RepositoriesModule.kt @@ -1,14 +1,14 @@ package app.tourism.di import android.content.Context +import app.tourism.data.db.Database import app.tourism.data.prefs.UserPreferences import app.tourism.data.remote.CurrencyApi import app.tourism.data.remote.TourismApi import app.tourism.data.repositories.AuthRepository import app.tourism.data.repositories.CurrencyRepository -import app.tourism.data.repositories.ProfileRepository -import app.tourism.data.db.Database import app.tourism.data.repositories.PlacesRepository +import app.tourism.data.repositories.ProfileRepository import app.tourism.data.repositories.ReviewsRepository import dagger.Module import dagger.Provides diff --git a/android/app/src/main/java/app/tourism/ui/common/WebView.kt b/android/app/src/main/java/app/tourism/ui/common/WebView.kt index 427b2e7337..ab60b13be8 100644 --- a/android/app/src/main/java/app/tourism/ui/common/WebView.kt +++ b/android/app/src/main/java/app/tourism/ui/common/WebView.kt @@ -1,11 +1,8 @@ package app.tourism.ui.common import android.webkit.WebView -import androidx.compose.foundation.isSystemInDarkTheme import androidx.compose.runtime.Composable import androidx.compose.ui.viewinterop.AndroidView -import androidx.webkit.WebSettingsCompat -import androidx.webkit.WebViewFeature @Composable fun WebView(data: String) { diff --git a/android/app/src/main/java/app/tourism/ui/common/special/CountryFlag.kt b/android/app/src/main/java/app/tourism/ui/common/special/CountryFlag.kt new file mode 100644 index 0000000000..e41a615ae5 --- /dev/null +++ b/android/app/src/main/java/app/tourism/ui/common/special/CountryFlag.kt @@ -0,0 +1,22 @@ +package app.tourism.ui.common.special + +import android.view.LayoutInflater +import androidx.compose.runtime.Composable +import androidx.compose.ui.Modifier +import androidx.compose.ui.viewinterop.AndroidView +import app.organicmaps.R +import com.hbb20.CountryCodePicker + +@Composable +fun CountryFlag(modifier: Modifier = Modifier, countryCodeName: String) { + AndroidView( + modifier = Modifier.then(modifier), + factory = { context -> + val view = LayoutInflater.from(context) + .inflate(R.layout.ccp_country_flag, null, false) + val ccp = view.findViewById(R.id.ccp) + ccp.setCountryForNameCode(countryCodeName) + view + } + ) +} \ No newline at end of file diff --git a/android/app/src/main/java/app/tourism/ui/common/textfields/EditText.kt b/android/app/src/main/java/app/tourism/ui/common/textfields/EditText.kt index c975af5685..835fd0e6e7 100644 --- a/android/app/src/main/java/app/tourism/ui/common/textfields/EditText.kt +++ b/android/app/src/main/java/app/tourism/ui/common/textfields/EditText.kt @@ -4,7 +4,6 @@ import androidx.compose.animation.animateColorAsState import androidx.compose.animation.core.animateIntAsState import androidx.compose.animation.core.animateOffsetAsState import androidx.compose.animation.core.tween -import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.IntrinsicSize import androidx.compose.foundation.layout.PaddingValues 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 3d25f00d81..9a6b2d6dca 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 @@ -2,7 +2,6 @@ package app.tourism.ui.screens.auth.sign_in import PasswordEditText import androidx.compose.foundation.Image -import androidx.compose.foundation.background import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.fillMaxSize @@ -31,7 +30,6 @@ import app.tourism.BASE_URL import app.tourism.Constants import app.tourism.domain.models.resource.Resource import app.tourism.ui.ObserveAsEvents -import app.tourism.ui.common.BlurryContainer import app.tourism.ui.common.VerticalSpace import app.tourism.ui.common.buttons.PrimaryButton import app.tourism.ui.common.nav.BackButton @@ -128,7 +126,7 @@ fun SignInScreen( onClick = { openUrlInBrowser( context, - "http://192.168.1.80:8888/forgot-password" + "$BASE_URL/forgot-password" ) }, ) { 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 ee65fc3e43..ec1f6ab803 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 @@ -31,7 +31,6 @@ import app.organicmaps.R import app.tourism.Constants import app.tourism.domain.models.resource.Resource import app.tourism.ui.ObserveAsEvents -import app.tourism.ui.common.BlurryContainer import app.tourism.ui.common.VerticalSpace import app.tourism.ui.common.buttons.PrimaryButton import app.tourism.ui.common.nav.BackButton diff --git a/android/app/src/main/java/app/tourism/ui/screens/main/categories/categories/CategoriesViewModel.kt b/android/app/src/main/java/app/tourism/ui/screens/main/categories/categories/CategoriesViewModel.kt index 2d18a889e9..300cb68283 100644 --- a/android/app/src/main/java/app/tourism/ui/screens/main/categories/categories/CategoriesViewModel.kt +++ b/android/app/src/main/java/app/tourism/ui/screens/main/categories/categories/CategoriesViewModel.kt @@ -3,7 +3,6 @@ package app.tourism.ui.screens.main.categories.categories import android.content.Context import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope -import androidx.lifecycle.viewmodel.compose.viewModel import app.organicmaps.R import app.tourism.data.repositories.PlacesRepository import app.tourism.domain.models.categories.PlaceCategory diff --git a/android/app/src/main/java/app/tourism/ui/screens/main/categories/categories/HorizontalSingleChoice.kt b/android/app/src/main/java/app/tourism/ui/screens/main/categories/categories/HorizontalSingleChoice.kt index 017dd25248..524ee45886 100644 --- a/android/app/src/main/java/app/tourism/ui/screens/main/categories/categories/HorizontalSingleChoice.kt +++ b/android/app/src/main/java/app/tourism/ui/screens/main/categories/categories/HorizontalSingleChoice.kt @@ -14,7 +14,6 @@ import androidx.compose.ui.draw.clip import androidx.compose.ui.graphics.Color import androidx.compose.ui.unit.dp import app.tourism.applyAppBorder -import app.tourism.ui.common.HorizontalSpace import app.tourism.ui.models.SingleChoiceItem import app.tourism.ui.theme.TextStyles diff --git a/android/app/src/main/java/app/tourism/ui/screens/main/favorites/favorites/FavoritesScreen.kt b/android/app/src/main/java/app/tourism/ui/screens/main/favorites/favorites/FavoritesScreen.kt index 1f0523a454..1160b85598 100644 --- a/android/app/src/main/java/app/tourism/ui/screens/main/favorites/favorites/FavoritesScreen.kt +++ b/android/app/src/main/java/app/tourism/ui/screens/main/favorites/favorites/FavoritesScreen.kt @@ -5,7 +5,6 @@ import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.padding import androidx.compose.foundation.lazy.LazyColumn import androidx.compose.foundation.lazy.items -import androidx.compose.material3.ListItem import androidx.compose.material3.Scaffold import androidx.compose.runtime.Composable import androidx.compose.runtime.collectAsState diff --git a/android/app/src/main/java/app/tourism/ui/screens/main/home/HomeViewModel.kt b/android/app/src/main/java/app/tourism/ui/screens/main/home/HomeViewModel.kt index b20782c4ec..5bfa83b421 100644 --- a/android/app/src/main/java/app/tourism/ui/screens/main/home/HomeViewModel.kt +++ b/android/app/src/main/java/app/tourism/ui/screens/main/home/HomeViewModel.kt @@ -1,8 +1,10 @@ package app.tourism.ui.screens.main.home import android.content.Context +import android.util.Log import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope +import app.organicmaps.util.log.Logger import app.tourism.data.repositories.PlacesRepository import app.tourism.domain.models.SimpleResponse import app.tourism.domain.models.categories.PlaceCategory @@ -44,32 +46,42 @@ class HomeViewModel @Inject constructor( private val _sights = MutableStateFlow>(emptyList()) val sights = _sights.asStateFlow() private fun getTopSights() { + val categoryId = PlaceCategory.Sights.id viewModelScope.launch(Dispatchers.IO) { - val categoryId = PlaceCategory.Sights.id - placesRepository.getPlacesByCategoryFromApiIfThereIsChange(categoryId) placesRepository.getTopPlaces(categoryId) .collectLatest { resource -> if (resource is Resource.Success) { - resource.data?.let { _sights.value = it } + resource.data?.let { + _sights.value = it + Log.d("lok narosh", it.toString()) + } } } } + viewModelScope.launch(Dispatchers.IO) { + placesRepository.getPlacesByCategoryFromApiIfThereIsChange(categoryId) + } } private val _restaurants = MutableStateFlow>(emptyList()) val restaurants = _restaurants.asStateFlow() private fun getTopRestaurants() { + val categoryId = PlaceCategory.Restaurants.id viewModelScope.launch(Dispatchers.IO) { - val categoryId = PlaceCategory.Restaurants.id - placesRepository.getPlacesByCategoryFromApiIfThereIsChange(categoryId) placesRepository.getTopPlaces(categoryId) .collectLatest { resource -> if (resource is Resource.Success) { - resource.data?.let { _restaurants.value = it } + resource.data?.let { + Log.d("lok narosh", it.toString()) + _restaurants.value = it + } } } } + viewModelScope.launch(Dispatchers.IO) { + placesRepository.getPlacesByCategoryFromApiIfThereIsChange(categoryId) + } } private val _downloadResponse = MutableStateFlow>(Resource.Idle()) diff --git a/android/app/src/main/java/app/tourism/ui/screens/main/place_details/PlaceViewModel.kt b/android/app/src/main/java/app/tourism/ui/screens/main/place_details/PlaceViewModel.kt index 3e40e40bad..cc7f29cf8c 100644 --- a/android/app/src/main/java/app/tourism/ui/screens/main/place_details/PlaceViewModel.kt +++ b/android/app/src/main/java/app/tourism/ui/screens/main/place_details/PlaceViewModel.kt @@ -2,12 +2,9 @@ package app.tourism.ui.screens.main.place_details import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope -import app.tourism.Constants -import app.tourism.data.dto.PlaceLocation import app.tourism.data.repositories.PlacesRepository import app.tourism.domain.models.details.PlaceFull import app.tourism.domain.models.resource.Resource -import app.tourism.utils.makeLongListOfTheSameItem import dagger.hilt.android.lifecycle.HiltViewModel import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.channels.Channel @@ -15,7 +12,6 @@ import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.asStateFlow import kotlinx.coroutines.flow.collectLatest import kotlinx.coroutines.flow.receiveAsFlow -import kotlinx.coroutines.flow.update import kotlinx.coroutines.launch import javax.inject.Inject diff --git a/android/app/src/main/java/app/tourism/ui/screens/main/place_details/reviews/PostReviewViewModel.kt b/android/app/src/main/java/app/tourism/ui/screens/main/place_details/reviews/PostReviewViewModel.kt index f29f20bc36..0bb9a9c835 100644 --- a/android/app/src/main/java/app/tourism/ui/screens/main/place_details/reviews/PostReviewViewModel.kt +++ b/android/app/src/main/java/app/tourism/ui/screens/main/place_details/reviews/PostReviewViewModel.kt @@ -6,7 +6,6 @@ import androidx.lifecycle.viewModelScope import app.organicmaps.R import app.tourism.data.repositories.ReviewsRepository import app.tourism.domain.models.SimpleResponse -import app.tourism.domain.models.details.Review import app.tourism.domain.models.details.ReviewToPost import app.tourism.domain.models.resource.Resource import dagger.hilt.android.lifecycle.HiltViewModel diff --git a/android/app/src/main/java/app/tourism/ui/screens/main/place_details/reviews/ReviewsScreen.kt b/android/app/src/main/java/app/tourism/ui/screens/main/place_details/reviews/ReviewsScreen.kt index 075f237d05..7da0d9cfe9 100644 --- a/android/app/src/main/java/app/tourism/ui/screens/main/place_details/reviews/ReviewsScreen.kt +++ b/android/app/src/main/java/app/tourism/ui/screens/main/place_details/reviews/ReviewsScreen.kt @@ -33,7 +33,6 @@ import app.tourism.Constants import app.tourism.ui.ObserveAsEvents import app.tourism.ui.common.HorizontalSpace import app.tourism.ui.common.VerticalSpace -import app.tourism.ui.common.special.RatingBar import app.tourism.ui.screens.main.place_details.reviews.components.PostReview import app.tourism.ui.screens.main.place_details.reviews.components.Review import app.tourism.ui.theme.TextStyles @@ -42,7 +41,6 @@ import app.tourism.ui.utils.showToast import app.tourism.ui.utils.showYesNoAlertDialog import kotlinx.coroutines.delay import kotlinx.coroutines.launch -import kotlin.math.roundToInt @OptIn(ExperimentalMaterial3Api::class) @Composable diff --git a/android/app/src/main/java/app/tourism/ui/screens/main/profile/profile/ProfileScreen.kt b/android/app/src/main/java/app/tourism/ui/screens/main/profile/profile/ProfileScreen.kt index f85b9dcae1..2a3d63e1ec 100644 --- a/android/app/src/main/java/app/tourism/ui/screens/main/profile/profile/ProfileScreen.kt +++ b/android/app/src/main/java/app/tourism/ui/screens/main/profile/profile/ProfileScreen.kt @@ -1,11 +1,13 @@ package app.tourism.ui.screens.main.profile.profile import androidx.annotation.DrawableRes +import androidx.compose.foundation.Image import androidx.compose.foundation.clickable import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.height import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.size import androidx.compose.foundation.rememberScrollState @@ -21,7 +23,6 @@ import androidx.compose.material3.SwitchDefaults import androidx.compose.material3.Text import androidx.compose.material3.rememberModalBottomSheetState import androidx.compose.runtime.Composable -import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.collectAsState import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableStateOf @@ -52,6 +53,7 @@ import app.tourism.ui.common.buttons.PrimaryButton import app.tourism.ui.common.buttons.SecondaryButton import app.tourism.ui.common.nav.AppTopBar import app.tourism.ui.common.special.CountryAsLabel +import app.tourism.ui.common.special.CountryFlag import app.tourism.ui.common.ui_state.Loading import app.tourism.ui.screens.main.ThemeViewModel import app.tourism.ui.theme.TextStyles @@ -172,36 +174,44 @@ fun ProfileBar(personalData: PersonalData) { @Composable fun CurrencyRates(modifier: Modifier = Modifier, currencyRates: CurrencyRates) { - // todo Row( modifier = Modifier .fillMaxWidth() .applyAppBorder() - .padding(horizontal = 15.dp, vertical = 24.dp) + .padding(horizontal = 15.dp, vertical = 18.dp) .then(modifier), horizontalArrangement = Arrangement.SpaceAround, verticalAlignment = Alignment.CenterVertically ) { CurrencyRatesItem( - currency = stringResource(id = R.string.usd), + countryCode = "US", value = "%.2f".format(currencyRates.usd), ) CurrencyRatesItem( - currency = stringResource(id = R.string.eur), + countryCode = "EU", value = "%.2f".format(currencyRates.eur), ) CurrencyRatesItem( - currency = stringResource(id = R.string.rub), + countryCode = "RU", value = "%.2f".format(currencyRates.rub), ) } } @Composable -fun CurrencyRatesItem(currency: String, value: String) { - Row { - Text(text = currency, style = TextStyles.b1) - HorizontalSpace(width = 4.dp) +fun CurrencyRatesItem(countryCode: String, value: String) { + Row(verticalAlignment = Alignment.CenterVertically) { + if (countryCode == "EU") + Row { + Image( + modifier = Modifier.height(21.dp), + painter = painterResource(id = R.drawable.eu_flag), + contentDescription = null + ) + HorizontalSpace(width = 8.dp) + } + else + CountryFlag(countryCodeName = countryCode) Text(text = value, style = TextStyles.b1.copy(fontWeight = FontWeight.SemiBold)) } } diff --git a/android/app/src/main/java/app/tourism/utils/FileUtils.kt b/android/app/src/main/java/app/tourism/utils/FileUtils.kt index cf56dc2809..bda2790367 100644 --- a/android/app/src/main/java/app/tourism/utils/FileUtils.kt +++ b/android/app/src/main/java/app/tourism/utils/FileUtils.kt @@ -4,7 +4,6 @@ import android.content.Context import android.graphics.Bitmap import id.zelory.compressor.Compressor import id.zelory.compressor.constraint.format -import id.zelory.compressor.constraint.resolution import id.zelory.compressor.constraint.size import java.io.File diff --git a/android/app/src/main/res/drawable/eu_flag.png b/android/app/src/main/res/drawable/eu_flag.png new file mode 100644 index 0000000000000000000000000000000000000000..434ad410062944a9bc1427e001e971033eae5a48 GIT binary patch literal 7232 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 + + + \ No newline at end of file