adjustments and bug fixes

This commit is contained in:
Emin 2024-07-17 14:50:15 +05:00
parent dc0523cbb3
commit e78bbe397e
21 changed files with 155 additions and 50 deletions

View file

@ -413,7 +413,6 @@ dependencies {
def retrofit = '2.11.0'
implementation "com.squareup.retrofit2:retrofit:$retrofit"
implementation "com.squareup.retrofit2:converter-gson:$retrofit"
implementation "com.squareup.retrofit2:converter-simplexml:$retrofit"
def okhttp = '5.0.0-alpha.14'
implementation "com.squareup.okhttp3:okhttp:$okhttp"
implementation "com.squareup.okhttp3:logging-interceptor:$okhttp"

View file

@ -564,10 +564,10 @@ 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
blockScreen();
Framework.nativeZoomToPoint(38.5598, 68.7870, 10, true);
goToDushanbe();
}
};
handler.postDelayed(delayedAction, 1000);
@ -585,16 +585,31 @@ public class MwmActivity extends BaseMwmFragmentActivity
startLocationToPoint(endPoint.toMapObject());
}
private void goToTjkIfNotThere() {
final double[] center = Framework.nativeGetScreenRectCenter();
final double lat = center[0];
final double lon = center[1];
if(!isInsideTajikistan(lat, lon))
goToTjk();
}
private void goToDushanbe() {
Framework.nativeZoomToPoint(38.5598, 68.7870, 10, false);
}
public void goToTjk() {
Framework.nativeZoomToPoint(38.5598, 68.7870, 8, false);
}
public void blockScreen() {
getWindow().setFlags(WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE,
WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE);
}
}
public void removeScreenBlock() {
getWindow().clearFlags(WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE);
}
private void refreshLightStatusBar()
{
UiUtils.setLightStatusBar(this, !(

View file

@ -7,10 +7,12 @@ import android.location.Location;
import android.os.Handler;
import android.os.Looper;
import android.text.TextUtils;
import android.util.Log;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;
import androidx.annotation.Nullable;
@ -27,6 +29,7 @@ import app.organicmaps.util.UiUtils;
import app.tourism.MainActivity;
import java.util.List;
import java.util.Objects;
public class OnmapDownloader implements MwmActivity.LeftAnimationTrackListener
{
@ -34,12 +37,15 @@ public class OnmapDownloader implements MwmActivity.LeftAnimationTrackListener
private final MwmActivity mActivity;
private final View mFrame;
private final TextView mTitle;
private final TextView mSize;
private final WheelProgressView mProgress;
private final Button mButton;
private int mStorageSubscriptionSlot;
private boolean alreadyNavigating = false;
@Nullable
private CountryItem mCurrentCountry;
@ -101,6 +107,7 @@ public class OnmapDownloader implements MwmActivity.LeftAnimationTrackListener
{
mCurrentCountry = (TextUtils.isEmpty(countryId) ? null : CountryItem.fill(countryId));
updateState(true);
stopIfNotTjk();
}
};
@ -109,19 +116,12 @@ public class OnmapDownloader implements MwmActivity.LeftAnimationTrackListener
updateStateInternal(shouldAutoDownload);
}
private static boolean isMapDownloading(@Nullable CountryItem country)
{
if (country == null) return false;
boolean enqueued = country.status == CountryItem.STATUS_ENQUEUED;
boolean progress = country.status == CountryItem.STATUS_PROGRESS;
boolean applying = country.status == CountryItem.STATUS_APPLYING;
return enqueued || progress || applying;
}
private void updateProgressState(boolean shouldAutoDownload)
{
navigationToMainActivityHandling();
if(!alreadyNavigating) {
alreadyNavigating = true;
navigationToMainActivityHandling();
}
updateStateInternal(shouldAutoDownload);
}
@ -144,6 +144,7 @@ public class OnmapDownloader implements MwmActivity.LeftAnimationTrackListener
if (showFrame)
{
setUiForTjkDownload();
UiUtils.showIf(progress || enqueued, mProgress);
UiUtils.showIf(!progress && !enqueued, mButton);
@ -151,6 +152,7 @@ public class OnmapDownloader implements MwmActivity.LeftAnimationTrackListener
if (progress)
{
mActivity.blockScreen();
mProgress.setPending(false);
mProgress.setProgress(Math.round(mCurrentCountry.progress));
sizeText = StringUtils.formatUsingSystemLocale("%1$s %2$.2f%%",
@ -160,6 +162,7 @@ public class OnmapDownloader implements MwmActivity.LeftAnimationTrackListener
{
if (enqueued)
{
mActivity.blockScreen();
sizeText = mActivity.getString(R.string.downloader_queued);
mProgress.setPending(true);
}
@ -187,6 +190,7 @@ public class OnmapDownloader implements MwmActivity.LeftAnimationTrackListener
mButton.setText(failed ? R.string.downloader_retry
: R.string.download);
mActivity.removeScreenBlock();
}
}
@ -197,10 +201,23 @@ public class OnmapDownloader implements MwmActivity.LeftAnimationTrackListener
UiUtils.showIf(showFrame, mFrame);
}
public void stopIfNotTjk() {
if(mCurrentCountry != null && !Objects.equals(mCurrentCountry.id, "Tajikistan")) {
mActivity.goToTjk();
Toast.makeText(mActivity, R.string.plz_dont_go_out_of_tjk, Toast.LENGTH_LONG).show();
MapManager.nativeCancel(mCurrentCountry.id);
}
}
public void setUiForTjkDownload() {
mTitle.setText(mActivity.getString(R.string.wait_tjk_map_downloading));
}
public OnmapDownloader(MwmActivity activity)
{
mActivity = activity;
mFrame = activity.findViewById(R.id.onmap_downloader);
mTitle = mFrame.findViewById(R.id.downloader_title);
mSize = mFrame.findViewById(R.id.downloader_size);
View controls = mFrame.findViewById(R.id.downloader_controls_frame);

View file

@ -43,6 +43,8 @@ public class MapButtonsController extends Fragment
@Nullable
private View mBottomButtonsFrame;
@Nullable
private View mBackButton;
@Nullable
private FloatingActionButton mToggleMapLayerButton;
@Nullable
@ -81,6 +83,7 @@ public class MapButtonsController extends Fragment
mInnerLeftButtonsFrame = mFrame.findViewById(R.id.map_buttons_inner_left);
mInnerRightButtonsFrame = mFrame.findViewById(R.id.map_buttons_inner_right);
mBottomButtonsFrame = mFrame.findViewById(R.id.map_buttons_bottom);
mBackButton = mFrame.findViewById(R.id.back_btn);
final FloatingActionButton helpButton = mFrame.findViewById(R.id.help_button);
if (helpButton != null)
@ -151,6 +154,11 @@ public class MapButtonsController extends Fragment
UiUtils.setViewInsetsPadding(view, windowInsets);
return windowInsets;
});
if(mBackButton != null) {
mBackButton.setOnClickListener((v) -> activity.getOnBackPressedDispatcher().onBackPressed());
}
return mFrame;
}

View file

@ -46,8 +46,8 @@ class MainActivity : ComponentActivity() {
intentFilter.addAction(WifiManager.NETWORK_STATE_CHANGED_ACTION)
registerReceiver(wifiReceiver, intentFilter)
navigateToMapToDownloadIfNotPresent()
navigateToAuthIfNotAuthed()
navigateToMapToDownloadIfNotPresent()
val blackest = resources.getColor(R.color.button_text) // yes, I know
enableEdgeToEdge(
@ -74,7 +74,10 @@ class MainActivity : ComponentActivity() {
private fun navigateToAuthIfNotAuthed() {
val token = userPreferences.getToken()
if (token.isNullOrEmpty()) navigateToAuth()
if (token.isNullOrEmpty()) {
navigateToAuth()
return
}
profileVM.getPersonalData()
lifecycleScope.launch {

View file

@ -1,4 +1,4 @@
package app.tourism.data.dto
package app.tourism.data.dto.currency
import app.tourism.data.db.entities.CurrencyRatesEntity
import app.tourism.domain.models.profile.CurrencyRates

View file

@ -1,6 +1,6 @@
package app.tourism.data.remote
import app.tourism.data.dto.CurrencyRatesDataDto
import app.tourism.data.dto.currency.CurrencyRatesDataDto
import retrofit2.Response
import retrofit2.http.GET

View file

@ -5,8 +5,6 @@ import app.tourism.BASE_URL
import app.tourism.data.prefs.UserPreferences
import app.tourism.data.remote.CurrencyApi
import app.tourism.data.remote.TourismApi
import app.tourism.data.repositories.CurrencyRepository
import app.tourism.data.db.Database
import dagger.Module
import dagger.Provides
import dagger.hilt.InstallIn
@ -16,8 +14,6 @@ import okhttp3.OkHttpClient
import okhttp3.logging.HttpLoggingInterceptor
import retrofit2.Retrofit
import retrofit2.converter.gson.GsonConverterFactory
import retrofit2.converter.simplexml.SimpleXmlConverterFactory
import java.util.concurrent.TimeUnit
import javax.inject.Named
import javax.inject.Singleton

View file

@ -17,11 +17,14 @@ 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>(CloudyState.Nothing) }
Box(Modifier.then(modifier)) {
var height by remember { mutableStateOf(0.dp) }
Cloudy(
@ -30,16 +33,22 @@ fun BlurryContainer(modifier: Modifier = Modifier, content: @Composable () -> Un
.fillMaxWidth()
.height(height)
.align(Alignment.Center)
.clip(RoundedCornerShape(16.dp))
.clip(RoundedCornerShape(16.dp)),
onStateChanged = {
println("cloudyState: $cloudyState")
cloudyState.value = it
}
) {}
Column(
Modifier
.align(Alignment.Center)
.onSizeChanged { newSize ->
height = with(localDensity) { newSize.height.toDp() }
}
) {
content()
}
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()
}
}
}

View file

@ -2,6 +2,7 @@ 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
@ -10,6 +11,7 @@ import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.text.KeyboardActions
import androidx.compose.foundation.text.KeyboardOptions
import androidx.compose.material3.Text
import androidx.compose.material3.TextButton
import androidx.compose.runtime.Composable
import androidx.compose.runtime.collectAsState
import androidx.compose.ui.Alignment
@ -25,6 +27,7 @@ import androidx.compose.ui.text.input.ImeAction
import androidx.compose.ui.unit.dp
import androidx.hilt.navigation.compose.hiltViewModel
import app.organicmaps.R
import app.tourism.BASE_URL
import app.tourism.Constants
import app.tourism.domain.models.resource.Resource
import app.tourism.ui.ObserveAsEvents
@ -35,6 +38,7 @@ import app.tourism.ui.common.nav.BackButton
import app.tourism.ui.common.textfields.AuthEditText
import app.tourism.ui.theme.TextStyles
import app.tourism.ui.utils.showToast
import app.tourism.utils.openUrlInBrowser
@Composable
fun SignInScreen(
@ -78,11 +82,12 @@ fun SignInScreen(
.fillMaxWidth()
.align(Alignment.TopCenter)
) {
VerticalSpace(height = 48.dp)
BlurryContainer(
Modifier
.padding(Constants.SCREEN_PADDING),
) {
VerticalSpace(height = 80.dp)
Box(Modifier.padding(Constants.SCREEN_PADDING)) {
Image(
painter = painterResource(id = R.drawable.blur_background),
contentDescription = null
)
Column(Modifier.padding(36.dp)) {
Text(
modifier = Modifier.align(Alignment.CenterHorizontally),
@ -117,6 +122,21 @@ fun SignInScreen(
isLoading = signInResponse is Resource.Loading,
onClick = { vm.signIn() },
)
VerticalSpace(height = 16.dp)
TextButton(
onClick = {
openUrlInBrowser(
context,
"http://192.168.1.80:8888/forgot-password"
)
},
) {
Text(
text = stringResource(id = R.string.forgot_password),
color = Color.White
)
}
}
}
}

View file

@ -87,12 +87,14 @@ fun SignUpScreen(
Column(
Modifier
.fillMaxWidth()
.align(alignment = Alignment.TopCenter)) {
.align(alignment = Alignment.TopCenter)
) {
VerticalSpace(height = 48.dp)
BlurryContainer(
Modifier
.padding(Constants.SCREEN_PADDING),
) {
Box(Modifier.padding(Constants.SCREEN_PADDING)) {
Image(
painter = painterResource(id = R.drawable.blur_background),
contentDescription = null
)
Column(
Modifier.padding(36.dp)
) {

View file

@ -68,18 +68,26 @@ class CategoriesViewModel @Inject constructor(
_selectedCategory.collectLatest { item ->
item?.key?.let { id ->
val categoryId = id as Long
placesRepository.getPlacesByCategoryFromApiIfThereIsChange(categoryId)
placesRepository.getPlacesByCategoryFromDbFlow(categoryId)
.collectLatest { resource ->
if (resource is Resource.Success) {
resource.data?.let { _places.value = it }
}
}
}
}
}
}
private fun onCategoryChangeGetPlacesFromApiAlso() {
viewModelScope.launch {
_selectedCategory.collectLatest { item ->
item?.key?.let { id ->
val categoryId = id as Long
placesRepository.getPlacesByCategoryFromApiIfThereIsChange(categoryId)
}
}
}
}
init {
@ -90,6 +98,7 @@ class CategoriesViewModel @Inject constructor(
)
_selectedCategory.value = categories.value.first()
onCategoryChangeGetPlaces()
onCategoryChangeGetPlacesFromApiAlso()
}
}

View file

@ -0,0 +1,10 @@
package app.tourism.utils
import android.content.Context
import android.content.Intent
import android.net.Uri
fun openUrlInBrowser(context: Context, url: String) {
val intent = Intent(Intent.ACTION_VIEW, Uri.parse(url))
context.startActivity(intent)
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 10 KiB

View file

@ -8,6 +8,13 @@
android:clipToPadding="false"
tools:background="@color/bg_primary">
<com.google.android.material.floatingactionbutton.FloatingActionButton
android:id="@+id/back_btn"
style="@style/MwmWidget.MapButton.Back"
app:srcCompat="@drawable/back"
android:layout_margin="8dp"
android:contentDescription="@string/back"/>
<androidx.constraintlayout.widget.ConstraintLayout
android:id="@+id/map_buttons_top"
android:layout_width="wrap_content"

View file

@ -8,6 +8,13 @@
android:clipToPadding="false"
tools:background="@color/bg_primary">
<com.google.android.material.floatingactionbutton.FloatingActionButton
android:id="@+id/back_btn"
style="@style/MwmWidget.MapButton.Back"
app:srcCompat="@drawable/back"
android:layout_margin="8dp"
android:contentDescription="@string/back"/>
<androidx.constraintlayout.widget.ConstraintLayout
android:id="@+id/map_buttons_top"
android:layout_width="wrap_content"

View file

@ -28,7 +28,6 @@
android:fontFamily="@string/robotoMedium"
android:textStyle="normal"
android:gravity="center_horizontal"
android:text="@string/wait_tjk_map_downloading"
android:textSize="16sp"
tools:ignore="UnusedAttribute"/>
<TextView

View file

@ -2229,5 +2229,5 @@
<string name="review_will_be_published">Отзыв будет публикован когда будете онлайн</string>
<string name="review_was_published">Отзыв был успешно опубликован</string>
<string name="failed_to_publish_review">Не удалось публиковать отзыв</string>
<string name="plz_dont_go_out_of_tjk">Поажалуйста, не выходите за рамки Таджикистана</string>
<string name="plz_dont_go_out_of_tjk">Поажалуйста, не выходите за рамки Таджикистана, вы должны быть в Таджикистане</string>
</resources>

View file

@ -2271,5 +2271,5 @@
<string name="review_will_be_published">Review will be published when you are online</string>
<string name="review_was_published">Review was successfully published</string>
<string name="failed_to_publish_review">Failed to publish review\n</string>
<string name="plz_dont_go_out_of_tjk">Please, don\'t go out of Tajikistan</string>
<string name="plz_dont_go_out_of_tjk">Please, don\'t go out of Tajikistan, it\'s Tajikistan app</string>
</resources>

View file

@ -41,6 +41,10 @@
<item name="cornerSize">10dp</item>
</style>
<style name="MwmWidget.MapButton.Back">
<item name="maxImageSize">34dp</item>
</style>
<style name="MwmWidget.Button">
<item name="android:layout_width">wrap_content</item>
<item name="android:layout_height">wrap_content</item>

View file

@ -17,7 +17,7 @@ android.nonTransitiveRClass=true
android.useAndroidX=true
enableVulkanDiagnostics=OFF
org.gradle.caching=true
org.gradle.jvmargs=-Xmx2048M -Dkotlin.daemon.jvm.options\="-Xmx2048M" -Xms256m
org.gradle.jvmargs=-Xmx4096M -Dkotlin.daemon.jvm.options\="-Xmx4096M" -Xms1024m
propCompileSdkVersion=34
propMinSdkVersion=21
propTargetSdkVersion=34