[android] Add donation option to Place Page

This implementation follows iOS version as much as possible and uses the same core logic.

Resolves #10081

Signed-off-by: Alexey Krasilnikov <alexey@krasilnikov.me>
This commit is contained in:
Alexey Krasilnikov 2025-01-21 03:21:42 +07:00 committed by Roman Tsisyk
parent b092262c74
commit 1c9d16a141
52 changed files with 515 additions and 5 deletions

View file

@ -1993,4 +1993,74 @@ Java_app_organicmaps_Framework_nativeGetKayakHotelLink(JNIEnv * env, jclass, jst
return url.empty() ? nullptr : jni::ToJavaString(env, url);
}
JNIEXPORT jboolean JNICALL
Java_app_organicmaps_Framework_nativeShouldShowProducts(JNIEnv * env, jclass)
{
return frm()->ShouldShowProducts();
}
JNIEXPORT jobject JNICALL
Java_app_organicmaps_Framework_nativeGetProductsConfiguration(JNIEnv * env, jclass)
{
auto config = frm()->GetProductsConfiguration();
if (!config) return nullptr;
static jclass const productClass = jni::GetGlobalClassRef(
env,
"app/organicmaps/products/Product"
);
static jmethodID const productConstructor = jni::GetConstructorID(
env,
productClass,
"(Ljava/lang/String;Ljava/lang/String;)V"
);
jobjectArray products = jni::ToJavaArray(
env,
productClass,
config->GetProducts(),
[](JNIEnv * env, products::ProductsConfig::Product const & product)
{
jni::TScopedLocalRef const title(env, jni::ToJavaString(env, product.GetTitle()));
jni::TScopedLocalRef const link(env, jni::ToJavaString(env, product.GetLink()));
return env->NewObject(
productClass,
productConstructor,
title.get(),
link.get()
);
});
static jclass const productsConfigClass = jni::GetGlobalClassRef(
env,
"app/organicmaps/products/ProductsConfig"
);
static jmethodID const productsConfigConstructor = jni::GetConstructorID(
env,
productsConfigClass,
"(Ljava/lang/String;[Lapp/organicmaps/products/Product;)V"
);
jni::TScopedLocalRef const placePagePrompt(env, jni::ToJavaString(env, config->GetPlacePagePrompt()));
return env->NewObject(productsConfigClass, productsConfigConstructor, placePagePrompt.get(), products);
}
JNIEXPORT void JNICALL
Java_app_organicmaps_Framework_nativeDidCloseProductsPopup(JNIEnv * env, jclass, jstring reason)
{
frm()->DidCloseProductsPopup(frm()->FromString(jni::ToNativeString(env, reason)));
}
JNIEXPORT void JNICALL
Java_app_organicmaps_Framework_nativeDidSelectProduct(JNIEnv * env, jclass, jstring title, jstring link)
{
products::ProductsConfig::Product product(
jni::ToNativeString(env, title),
jni::ToNativeString(env, link)
);
frm()->DidSelectProduct(product);
}
} // extern "C"

View file

@ -15,6 +15,8 @@ import app.organicmaps.api.RequestType;
import app.organicmaps.bookmarks.data.DistanceAndAzimut;
import app.organicmaps.bookmarks.data.FeatureId;
import app.organicmaps.bookmarks.data.MapObject;
import app.organicmaps.products.Product;
import app.organicmaps.products.ProductsConfig;
import app.organicmaps.routing.JunctionInfo;
import app.organicmaps.routing.RouteMarkData;
import app.organicmaps.routing.RoutePointInfo;
@ -461,4 +463,13 @@ public class Framework
@Nullable
public static native String nativeGetKayakHotelLink(@NonNull String countryIsoCode, @NonNull String uri,
long firstDaySec, long lastDaySec);
public static native boolean nativeShouldShowProducts();
@Nullable
public static native ProductsConfig nativeGetProductsConfiguration();
public static native void nativeDidCloseProductsPopup(String reason);
public static native void nativeDidSelectProduct(String title, String link);
}

View file

@ -0,0 +1,20 @@
package app.organicmaps.products;
import androidx.annotation.Keep;
import androidx.annotation.Nullable;
// Called from JNI.
@Keep
@SuppressWarnings("unused")
public class Product {
@Nullable
public String title;
@Nullable
public String link;
public Product(@Nullable String title, @Nullable String link) {
this.title = title;
this.link = link;
}
}

View file

@ -0,0 +1,20 @@
package app.organicmaps.products;
import androidx.annotation.Keep;
import androidx.annotation.Nullable;
// Called from JNI.
@Keep
@SuppressWarnings("unused")
public class ProductsConfig {
public ProductsConfig(@Nullable String placePagePrompt, @Nullable Product[] products) {
this.placePagePrompt = placePagePrompt;
this.products = products;
}
@Nullable
public String placePagePrompt;
@Nullable
public Product[] products;
}

View file

@ -57,5 +57,13 @@ public final class Constants
public static final String XIAOMI = "XIAOMI";
}
public static class ProductsPopupCloseReason
{
public static final String CLOSE = "close";
public static final String REMIND_LATER = "remind_later";
public static final String ALREADY_DONATED = "already_donated";
public static final String SELECT_PRODUCT = "select_product";
}
private Constants() {}
}

View file

@ -50,6 +50,7 @@ import app.organicmaps.widget.placepage.sections.PlacePageBookmarkFragment;
import app.organicmaps.widget.placepage.sections.PlacePageLinksFragment;
import app.organicmaps.widget.placepage.sections.PlacePageOpeningHoursFragment;
import app.organicmaps.widget.placepage.sections.PlacePagePhoneFragment;
import app.organicmaps.widget.placepage.sections.PlacePageProductsFragment;
import app.organicmaps.widget.placepage.sections.PlacePageWikipediaFragment;
import com.google.android.material.button.MaterialButton;
@ -69,6 +70,7 @@ public class PlacePageView extends Fragment implements View.OnClickListener,
{
private static final String PREF_COORDINATES_FORMAT = "coordinates_format";
private static final String BOOKMARK_FRAGMENT_TAG = "BOOKMARK_FRAGMENT_TAG";
private static final String PRODUCTS_FRAGMENT_TAG = "PRODUCTS_FRAGMENT_TAG";
private static final String WIKIPEDIA_FRAGMENT_TAG = "WIKIPEDIA_FRAGMENT_TAG";
private static final String PHONE_FRAGMENT_TAG = "PHONE_FRAGMENT_TAG";
private static final String OPENING_HOURS_FRAGMENT_TAG = "OPENING_HOURS_FRAGMENT_TAG";
@ -202,9 +204,11 @@ public class PlacePageView extends Fragment implements View.OnClickListener,
mFrame.setOnClickListener((v) -> mPlacePageViewListener.onPlacePageRequestToggleState());
mPreview = mFrame.findViewById(R.id.pp__preview);
mFrame.addOnLayoutChangeListener((v, left, top, right, bottom, oldLeft, oldTop, oldRight, oldBottom) -> {
final int oldHeight = oldBottom - oldTop;
final int newHeight = bottom - top;
if (oldHeight != newHeight)
mPlacePageViewListener.onPlacePageContentChanged(mPreview.getHeight(), newHeight);
});
@ -387,6 +391,18 @@ public class PlacePageView extends Fragment implements View.OnClickListener,
updateViewFragment(PlacePageWikipediaFragment.class, WIKIPEDIA_FRAGMENT_TAG, R.id.place_page_wikipedia_fragment, hasWikipediaEntry());
}
private boolean hasProductsEntry()
{
return Framework.nativeShouldShowProducts();
}
private void updateProductsView()
{
var hasProductsEntry = hasProductsEntry();
updateViewFragment(PlacePageProductsFragment.class, PRODUCTS_FRAGMENT_TAG, R.id.place_page_products_fragment, hasProductsEntry);
}
private void setTextAndColorizeSubtitle()
{
String text = mMapObject.getSubtitle();
@ -480,6 +496,7 @@ public class PlacePageView extends Fragment implements View.OnClickListener,
}
updateLinksView();
updateOpeningHoursView();
updateProductsView();
updateWikipediaView();
updateBookmarkView();
updatePhoneView();

View file

@ -0,0 +1,107 @@
package app.organicmaps.widget.placepage.sections;
import static androidx.core.util.ObjectsCompat.requireNonNull;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.LinearLayout;
import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.fragment.app.Fragment;
import java.util.Objects;
import app.organicmaps.Framework;
import app.organicmaps.R;
import app.organicmaps.products.Product;
import app.organicmaps.products.ProductsConfig;
import app.organicmaps.util.Constants;
import app.organicmaps.util.UiUtils;
import app.organicmaps.util.Utils;
public class PlacePageProductsFragment extends Fragment
{
@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState)
{
return inflater.inflate(R.layout.place_page_products_fragment, container, false);
}
@Override
public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState)
{
super.onViewCreated(view, savedInstanceState);
var config = Framework.nativeGetProductsConfiguration();
if (config != null && isValidConfig(config))
{
UiUtils.show(view);
updateView(view, config);
} else
{
UiUtils.hide(view);
}
}
private void updateView(@NonNull View view, @NonNull ProductsConfig config)
{
var layoutInflater = LayoutInflater.from(view.getContext());
TextView productsPrompt = requireNonNull(view.findViewById(R.id.products_prompt));
LinearLayout productsButtons = requireNonNull(view.findViewById(R.id.products_buttons));
View closeButton = requireNonNull(view.findViewById(R.id.products_close));
View productsRemindLater = requireNonNull(view.findViewById(R.id.products_remind_later));
View alreadyDonated = requireNonNull(view.findViewById(R.id.products_already_donated));
productsPrompt.setText(config.placePagePrompt);
productsButtons.removeAllViews();
for (var product : Objects.requireNonNull(config.products))
{
var button = (Button) layoutInflater.inflate(R.layout.item_product, productsButtons, false);
button.setText(product.title);
button.setOnClickListener((v) -> {
onProductSelected(product);
});
productsButtons.addView(button);
}
closeButton.setOnClickListener((v) -> {
closeWithReason(view, Constants.ProductsPopupCloseReason.CLOSE);
});
productsRemindLater.setOnClickListener((v) -> {
closeWithReason(view, Constants.ProductsPopupCloseReason.REMIND_LATER);
});
alreadyDonated.setOnClickListener((v) -> {
closeWithReason(view, Constants.ProductsPopupCloseReason.ALREADY_DONATED);
});
}
private void closeWithReason(View view, String reason)
{
Framework.nativeDidCloseProductsPopup(reason);
UiUtils.hide(view);
}
private void onProductSelected(Product product)
{
Utils.openUrl(requireActivity(), product.link);
Framework.nativeDidSelectProduct(product.title, product.link);
}
private boolean isValidConfig(@NonNull ProductsConfig config)
{
return config.products != null && config.products.length > 0;
}
}

View file

@ -0,0 +1,11 @@
<?xml version="1.0" encoding="utf-8"?>
<Button xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
style="@style/MwmWidget.Button.Accent"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginTop="@dimen/margin_base"
android:layout_marginStart="@dimen/margin_base"
android:layout_weight="1"
tools:text="5 Eur/Month"
android:gravity="center" />

View file

@ -7,6 +7,7 @@
android:background="?panel"
android:orientation="vertical">
<include layout="@layout/place_page_fat_shadow"/>
<LinearLayout
@ -77,6 +78,12 @@
<include layout="@layout/place_page_open_in"/>
</LinearLayout>
<androidx.fragment.app.FragmentContainerView
android:id="@+id/place_page_products_fragment"
android:layout_width="match_parent"
android:layout_height="wrap_content"
tools:layout="@layout/place_page_products_fragment" />
<include
layout="@layout/place_page_fat_shadow"
android:id="@+id/edit_top_space"

View file

@ -0,0 +1,119 @@
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<include
android:id="@+id/products_space_top"
layout="@layout/place_page_fat_shadow"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<View
android:layout_width="match_parent"
android:layout_height="0dp"
android:background="?ppBackground"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/products_space_top" />
<com.google.android.material.button.MaterialButton
android:id="@+id/products_close"
style="@style/Widget.MaterialComponents.Button.UnelevatedButton"
android:layout_width="@dimen/place_page_top_button"
android:layout_height="@dimen/place_page_top_button"
android:layout_marginTop="@dimen/margin_base"
android:layout_marginEnd="@dimen/margin_half"
android:background="?attr/selectableItemBackgroundBorderless"
android:contentDescription="@string/close"
android:insetLeft="0dp"
android:insetTop="0dp"
android:insetRight="0dp"
android:insetBottom="0dp"
android:padding="0dp"
app:icon="@drawable/ic_close"
app:iconGravity="textStart"
app:iconPadding="0dp"
app:iconSize="24dp"
app:iconTint="?iconTint"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toBottomOf="@id/products_space_top"
app:shapeAppearanceOverlay="@style/ShapeAppearanceOverlay.Button.Round" />
<TextView
android:id="@+id/products_title"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_alignParentStart="true"
android:layout_marginStart="@dimen/margin_base"
android:layout_marginTop="@dimen/margin_base"
android:layout_marginEnd="@dimen/margin_base"
android:text="@string/support_organic_maps"
android:textAppearance="?android:attr/textAppearanceMedium"
app:layout_constraintEnd_toStartOf="@id/products_close"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/products_space_top" />
<TextView
android:id="@+id/products_prompt"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginStart="@dimen/margin_base"
android:layout_marginTop="@dimen/margin_base"
android:layout_marginEnd="@dimen/margin_base"
android:fontFamily="@string/robotoRegular"
android:lineSpacingExtra="@dimen/line_spacing_extra_2"
android:textAppearance="?android:attr/textAppearance"
android:textColor="?android:attr/textColorPrimary"
android:textStyle="normal"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/products_title"
tools:ignore="UnusedAttribute"
tools:text="asdasdadadasdasdasdasdasdasdasdadas" />
<LinearLayout
android:id="@+id/products_buttons"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginEnd="@dimen/margin_base"
android:orientation="horizontal"
app:layout_constraintTop_toBottomOf="@id/products_prompt" />
<TextView
android:id="@+id/products_already_donated"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="@dimen/margin_base"
android:layout_marginTop="@dimen/margin_base"
android:layout_marginEnd="@dimen/margin_base"
android:layout_marginBottom="@dimen/margin_base"
android:text="@string/already_donated"
android:textAlignment="center"
android:textAppearance="@style/MwmTextAppearance.PlacePage.Accent"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toStartOf="@id/products_remind_later"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/products_buttons" />
<TextView
android:id="@+id/products_remind_later"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="@dimen/margin_base"
android:layout_marginTop="@dimen/margin_base"
android:layout_marginEnd="@dimen/margin_base"
android:layout_marginBottom="@dimen/margin_base"
android:text="@string/remind_me_later"
android:textAlignment="center"
android:textAppearance="@style/MwmTextAppearance.PlacePage.Accent"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toEndOf="@id/products_already_donated"
app:layout_constraintTop_toBottomOf="@id/products_buttons" />
</androidx.constraintlayout.widget.ConstraintLayout>

View file

@ -286,6 +286,9 @@
<string name="faq">اسئلة مكررة</string>
<!-- Button in the main menu -->
<string name="donate">تبرع</string>
<string name="already_donated">تم التبرع</string>
<string name="remind_me_later">ذكر لاحقاً</string>
<string name="support_organic_maps">دعم Organic Maps</string>
<!-- Button in the main Help dialog -->
<string name="how_to_support_us">دعم المشروع</string>
<!-- Button in the main Help dialog -->

View file

@ -272,6 +272,9 @@
<string name="faq">Tez-tez soruşulan suallar</string>
<!-- Button in the main menu -->
<string name="donate">Bağışlamaq</string>
<string name="already_donated">Artıq ianə edildi</string>
<string name="remind_me_later">Daha sonra xatırlat</string>
<string name="support_organic_maps">Organic Maps-i dəstəkləmək</string>
<!-- Button in the main Help dialog -->
<string name="how_to_support_us">Bu layihəni dəstəkləyin</string>
<!-- Button in the main Help dialog -->

View file

@ -272,6 +272,9 @@
<string name="faq">Пытанні і адказы</string>
<!-- Button in the main menu -->
<string name="donate">Падтрымаць грашыма</string>
<string name="already_donated">Ужо ахвяравана</string>
<string name="remind_me_later">Нагадаць пазней</string>
<string name="support_organic_maps">Падтрымаць Organic Maps</string>
<!-- Button in the main Help dialog -->
<string name="how_to_support_us">Падтрымаць праект</string>
<!-- Button in the main Help dialog -->

View file

@ -255,6 +255,9 @@
<string name="faq">Въпроси и отговори</string>
<!-- Button in the main menu -->
<string name="donate">Дарете</string>
<string name="already_donated">Вече дарено</string>
<string name="remind_me_later">Напомни по-късно</string>
<string name="support_organic_maps">Подкрепи Organic Maps</string>
<!-- Button in the main Help dialog -->
<string name="how_to_support_us">Подкрепете проекта</string>
<!-- Button in the main Help dialog -->

View file

@ -273,6 +273,9 @@
<string name="faq">Preguntes més freqüents</string>
<!-- Button in the main menu -->
<string name="donate">Donatiu</string>
<string name="already_donated">Ja donat</string>
<string name="remind_me_later">Recorda més tard</string>
<string name="support_organic_maps">Donar suport a Organic Maps</string>
<!-- Button in the main Help dialog -->
<string name="how_to_support_us">Donar suport al projecte</string>
<!-- Button in the main Help dialog -->

View file

@ -254,6 +254,9 @@
<string name="faq">Otázky a odpovědi</string>
<!-- Button in the main menu -->
<string name="donate">Darovat</string>
<string name="already_donated">Již darováno</string>
<string name="remind_me_later">Připomeň později</string>
<string name="support_organic_maps">Podpořit Organic Maps</string>
<!-- Button in the main Help dialog -->
<string name="how_to_support_us">Podpořte projekt</string>
<!-- Button in the main Help dialog -->

View file

@ -246,6 +246,9 @@
<string name="faq">Spørgsmål og svar</string>
<!-- Button in the main menu -->
<string name="donate">Doner</string>
<string name="already_donated">Allerede doneret</string>
<string name="remind_me_later">Mind mig senere</string>
<string name="support_organic_maps">Støtte Organic Maps</string>
<!-- Button in the main Help dialog -->
<string name="how_to_support_us">Støt projektet</string>
<!-- Button in the main Help dialog -->

View file

@ -271,6 +271,9 @@
<string name="faq">Häufige Fragen und Antworten</string>
<!-- Button in the main menu -->
<string name="donate">Spenden</string>
<string name="already_donated">Bereits gespendet</string>
<string name="remind_me_later">Später erinnern</string>
<string name="support_organic_maps">Organic Maps unterstützen</string>
<!-- Button in the main Help dialog -->
<string name="how_to_support_us">Unterstütze das Projekt</string>
<!-- Button in the main Help dialog -->

View file

@ -274,6 +274,9 @@
<string name="faq">Συχνές ερωτήσεις</string>
<!-- Button in the main menu -->
<string name="donate">Δωρεά</string>
<string name="already_donated">Ήδη δωρεά</string>
<string name="remind_me_later">Υπενθύμισε αργότερα</string>
<string name="support_organic_maps">Υποστήριξε το Organic Maps</string>
<!-- Button in the main Help dialog -->
<string name="how_to_support_us">Στηρίξτε αυτό το πρότζεκτ</string>
<!-- Button in the main Help dialog -->

View file

@ -271,6 +271,9 @@
<string name="faq">Preguntas frecuentes</string>
<!-- Button in the main menu -->
<string name="donate">Donar</string>
<string name="already_donated">Ya donado</string>
<string name="remind_me_later">Recordar más tarde</string>
<string name="support_organic_maps">Apoyar Organic Maps</string>
<!-- Button in the main Help dialog -->
<string name="how_to_support_us">Apoye el proyecto</string>
<!-- Button in the main Help dialog -->

View file

@ -264,6 +264,9 @@
<string name="faq">Korduma kippuvad küsimused</string>
<!-- Button in the main menu -->
<string name="donate">Anneta</string>
<string name="already_donated">Juba annetatud</string>
<string name="remind_me_later">Meenuta hiljem</string>
<string name="support_organic_maps">Toetada Organic Maps</string>
<!-- Button in the main Help dialog -->
<string name="how_to_support_us">Toetage projekti</string>
<!-- Button in the main Help dialog -->

View file

@ -272,6 +272,9 @@
<string name="faq">Ohiko galderak</string>
<!-- Button in the main menu -->
<string name="donate">Dohaintza eman</string>
<string name="already_donated">Dohaintza jada emana</string>
<string name="remind_me_later">Gogoratu geroago</string>
<string name="support_organic_maps">Sustatu Organic Maps</string>
<!-- Button in the main Help dialog -->
<string name="how_to_support_us">Proiektuari laguntza eman</string>
<!-- Button in the main Help dialog -->

View file

@ -239,6 +239,9 @@
<string name="faq">پرسش‌های زیاد پرسیده شده</string>
<!-- Button in the main menu -->
<string name="donate">حمایت مالی</string>
<string name="already_donated">قبلاً اهدا شده</string>
<string name="remind_me_later">بعداً یادآوری کن</string>
<string name="support_organic_maps">پشتیبانی از Organic Maps</string>
<!-- Button in the main Help dialog -->
<string name="how_to_support_us">ﺪﯿﻨﮐ ﺖﯾﺎﻤﺣ ﻩﮊﻭﺮﭘ ﺯﺍ</string>
<!-- Button in the main Help dialog -->

View file

@ -270,6 +270,9 @@
<string name="faq">Usein kysytyt kysymykset</string>
<!-- Button in the main menu -->
<string name="donate">Lahjoita</string>
<string name="already_donated">Jo lahjoitettu</string>
<string name="remind_me_later">Muistuta myöhemmin</string>
<string name="support_organic_maps">Tukea Organic Maps</string>
<!-- Button in the main Help dialog -->
<string name="how_to_support_us">Tue projektia</string>
<!-- Button in the main Help dialog -->

View file

@ -276,6 +276,9 @@
<string name="faq">Foire aux questions</string>
<!-- Button in the main menu -->
<string name="donate">Faire un don</string>
<string name="already_donated">Déjà donné</string>
<string name="remind_me_later">Rappeler plus tard</string>
<string name="support_organic_maps">Soutenir Organic Maps</string>
<!-- Button in the main Help dialog -->
<string name="how_to_support_us">Soutenir le projet</string>
<!-- Button in the main Help dialog -->

View file

@ -284,6 +284,9 @@
<string name="faq">अक्सर पूछे जाने वाले प्रश्नों</string>
<!-- Button in the main menu -->
<string name="donate">दान देना</string>
<string name="already_donated">पहले से दान</string>
<string name="remind_me_later">बाद में याद दिलाना</string>
<string name="support_organic_maps">Organic Maps का समर्थन करें</string>
<!-- Button in the main Help dialog -->
<string name="how_to_support_us">परियोजना का समर्थन करें</string>
<!-- Button in the main Help dialog -->

View file

@ -264,6 +264,9 @@
<string name="faq">Gyakran Ismételt Kérdések</string>
<!-- Button in the main menu -->
<string name="donate">Adományozás</string>
<string name="already_donated">Már adományozva</string>
<string name="remind_me_later">Emlékeztessen később</string>
<string name="support_organic_maps">Organic Maps támogatása</string>
<!-- Button in the main Help dialog -->
<string name="how_to_support_us">A projekt támogatása</string>
<!-- Button in the main Help dialog -->

View file

@ -251,6 +251,9 @@
<string name="faq">Pertanyaan dan jawaban</string>
<!-- Button in the main menu -->
<string name="donate">Menyumbangkan</string>
<string name="already_donated">Sudah disumbang</string>
<string name="remind_me_later">Ingatkan nanti</string>
<string name="support_organic_maps">Mendukung Organic Maps</string>
<!-- Button in the main Help dialog -->
<string name="how_to_support_us">Mendukung proyek</string>
<!-- Button in the main Help dialog -->

View file

@ -259,6 +259,9 @@
<string name="faq">Domande frequenti</string>
<!-- Button in the main menu -->
<string name="donate">Donare</string>
<string name="already_donated">Già donato</string>
<string name="remind_me_later">Ricorda più tardi</string>
<string name="support_organic_maps">Supportare Organic Maps</string>
<!-- Button in the main Help dialog -->
<string name="how_to_support_us">Sostieni il progetto</string>
<!-- Button in the main Help dialog -->

View file

@ -273,6 +273,9 @@
<string name="faq">שאלות ותשובות</string>
<!-- Button in the main menu -->
<string name="donate">לתרום</string>
<string name="already_donated">כבר נתרם</string>
<string name="remind_me_later">הזכר מאוחר יותר</string>
<string name="support_organic_maps">לתמוך ב-Organic Maps</string>
<!-- Button in the main Help dialog -->
<string name="how_to_support_us">תמכו בפרויקט</string>
<!-- Button in the main Help dialog -->

View file

@ -274,6 +274,9 @@
<string name="faq">よくある質問</string>
<!-- Button in the main menu -->
<string name="donate">寄付</string>
<string name="already_donated">寄付済み</string>
<string name="remind_me_later">後でリマインド</string>
<string name="support_organic_maps">Organic Maps を支援</string>
<!-- Button in the main Help dialog -->
<string name="how_to_support_us">プロジェクトを支援する</string>
<!-- Button in the main Help dialog -->

View file

@ -249,6 +249,9 @@
<string name="faq">질문과 답변</string>
<!-- Button in the main menu -->
<string name="donate">기부</string>
<string name="already_donated">기부완료</string>
<string name="remind_me_later">나중에 알림</string>
<string name="support_organic_maps">Organic Maps 지원하기</string>
<!-- Button in the main Help dialog -->
<string name="how_to_support_us">프로젝트 지원</string>
<!-- Button in the main Help dialog -->

View file

@ -273,6 +273,8 @@
<string name="faq">Biežāk uzdotie jautājumi</string>
<!-- Button in the main menu -->
<string name="donate">Ziedot</string>
<string name="remind_me_later">Atgādināt vēlāk</string>
<string name="support_organic_maps">Atbalstīt Organic Maps</string>
<!-- Button in the main Help dialog -->
<string name="how_to_support_us">Atbalstiet projektu</string>
<!-- Button in the main Help dialog -->

View file

@ -243,6 +243,9 @@
<string name="help">मदत</string>
<!-- Button in the main Help dialog -->
<string name="faq">वारंवार विचारलेले प्रश्न</string>
<string name="already_donated">आधीच दान केले</string>
<string name="remind_me_later">नंतर आठवण करून द्या</string>
<string name="support_organic_maps">Organic Maps ला समर्थन द्या</string>
<!-- Button in the main Help dialog -->
<string name="how_to_support_us">प्रकल्पाला पाठठिंबा द्या</string>
<!-- Button in the main Help dialog -->

View file

@ -271,6 +271,9 @@
<string name="faq">Spørsmål og svar</string>
<!-- Button in the main menu -->
<string name="donate">Donere</string>
<string name="already_donated">Allerede donert</string>
<string name="remind_me_later">Påminn senere</string>
<string name="support_organic_maps">Støtte Organic Maps</string>
<!-- Button in the main Help dialog -->
<string name="how_to_support_us">Støtt prosjektet</string>
<!-- Button in the main Help dialog -->

View file

@ -271,6 +271,9 @@
<string name="faq">Vragen en antwoorden</string>
<!-- Button in the main menu -->
<string name="donate">Doneer</string>
<string name="already_donated">Reeds gedoneerd</string>
<string name="remind_me_later">Herinner later</string>
<string name="support_organic_maps">Ondersteun Organic Maps</string>
<!-- Button in the main Help dialog -->
<string name="how_to_support_us">Steun het project</string>
<!-- Button in the main Help dialog -->

View file

@ -273,6 +273,9 @@
<string name="faq">Pytania i odpowiedzi</string>
<!-- Button in the main menu -->
<string name="donate">Wspomóż</string>
<string name="already_donated">Już przekazano</string>
<string name="remind_me_later">Przypomnij później</string>
<string name="support_organic_maps">Wspierać Organic Maps</string>
<!-- Button in the main Help dialog -->
<string name="how_to_support_us">Wesprzyj projekt</string>
<!-- Button in the main Help dialog -->

View file

@ -259,6 +259,9 @@
<string name="faq">Perguntas frequentes</string>
<!-- Button in the main menu -->
<string name="donate">Doar</string>
<string name="already_donated">Já doei</string>
<string name="remind_me_later">Lembre-me mais tarde</string>
<string name="support_organic_maps">Apoie o Organic Maps</string>
<!-- Button in the main Help dialog -->
<string name="how_to_support_us">Apoie o projeto</string>
<!-- Button in the main Help dialog -->

View file

@ -257,6 +257,9 @@
<string name="faq">Întrebări frecvente</string>
<!-- Button in the main menu -->
<string name="donate">Donează</string>
<string name="already_donated">Deja donat</string>
<string name="remind_me_later">Amintește mai târziu</string>
<string name="support_organic_maps">Susține Organic Maps</string>
<!-- Button in the main Help dialog -->
<string name="how_to_support_us">Susține proiectul</string>
<!-- Button in the main Help dialog -->

View file

@ -276,6 +276,9 @@
<string name="faq">Вопросы и ответы</string>
<!-- Button in the main menu -->
<string name="donate">Поддержать деньгами</string>
<string name="already_donated">Уже пожертвовано</string>
<string name="remind_me_later">Напомнить позже</string>
<string name="support_organic_maps">Поддержать Organic Maps</string>
<!-- Button in the main Help dialog -->
<string name="how_to_support_us">Помочь проекту</string>
<!-- Button in the main Help dialog -->

View file

@ -271,6 +271,9 @@
<string name="faq">Otázky a odpovede</string>
<!-- Button in the main menu -->
<string name="donate">Darovať</string>
<string name="already_donated">Už darované</string>
<string name="remind_me_later">Pripomeň neskôr</string>
<string name="support_organic_maps">Podporiť Organic Maps</string>
<!-- Button in the main Help dialog -->
<string name="how_to_support_us">Podporte projekt</string>
<!-- Button in the main Help dialog -->

View file

@ -248,6 +248,9 @@
<string name="faq">Frågor och svar</string>
<!-- Button in the main menu -->
<string name="donate">Donera</string>
<string name="already_donated">Redan donerat</string>
<string name="remind_me_later">Påminn senare</string>
<string name="support_organic_maps">Stödja Organic Maps</string>
<!-- Button in the main Help dialog -->
<string name="how_to_support_us">Stöd projektet</string>
<!-- Button in the main Help dialog -->

View file

@ -70,6 +70,9 @@
<string name="faq">Maswali na majibu</string>
<!-- Button in the main menu -->
<string name="donate">Changia</string>
<string name="already_donated">Tayari kutoa</string>
<string name="remind_me_later">Kumbusha baadaye</string>
<string name="support_organic_maps">Kuunga mkono Organic Maps</string>
<!-- Button in the main Help dialog -->
<string name="how_to_support_us">Saidia mradi</string>
<!-- Toast text when user hides UI with a long tap anywhere on the map -->

View file

@ -252,6 +252,9 @@
<string name="faq">คำถามและคำตอบ</string>
<!-- Button in the main menu -->
<string name="donate">บริจาค</string>
<string name="already_donated">บริจาคแล้ว</string>
<string name="remind_me_later">เตือนภายหลัง</string>
<string name="support_organic_maps">สนับสนุน Organic Maps</string>
<!-- Button in the main Help dialog -->
<string name="how_to_support_us">สนับสนุนโครงการ</string>
<!-- Button in the main Help dialog -->

View file

@ -273,6 +273,9 @@
<string name="faq">Sıkça Sorulan Sorular</string>
<!-- Button in the main menu -->
<string name="donate">Bağış yapın</string>
<string name="already_donated">Zaten bağış yaptım</string>
<string name="remind_me_later">Sonra hatırlat</string>
<string name="support_organic_maps">Organic Mapsi Destekleyin</string>
<!-- Button in the main Help dialog -->
<string name="how_to_support_us">Bu projeyi destekleyin</string>
<!-- Button in the main Help dialog -->

View file

@ -276,6 +276,9 @@
<string name="faq">Питання та відповіді</string>
<!-- Button in the main menu -->
<string name="donate">Підтримати грошима</string>
<string name="already_donated">Вже пожертвувано</string>
<string name="remind_me_later">Нагадати пізніше</string>
<string name="support_organic_maps">Підтримати Organic Maps</string>
<!-- Button in the main Help dialog -->
<string name="how_to_support_us">Підтримайте проект</string>
<!-- Button in the main Help dialog -->

View file

@ -250,6 +250,9 @@
<string name="faq">Câu hỏi và trả lời</string>
<!-- Button in the main menu -->
<string name="donate">Quyên tặng</string>
<string name="already_donated">Đã quyên góp</string>
<string name="remind_me_later">Nhắc sau</string>
<string name="support_organic_maps">Hỗ trợ Organic Maps</string>
<!-- Button in the main Help dialog -->
<string name="how_to_support_us">Hỗ trợ dự án</string>
<!-- Button in the main Help dialog -->

View file

@ -280,6 +280,9 @@
<string name="faq">問題和解答</string>
<!-- Button in the main menu -->
<string name="donate">捐助我們</string>
<string name="already_donated">已捐贈</string>
<string name="remind_me_later">稍後提醒</string>
<string name="support_organic_maps">支持 Organic Maps</string>
<!-- Button in the main Help dialog -->
<string name="how_to_support_us">支持本項目</string>
<!-- Button in the main Help dialog -->

View file

@ -280,6 +280,9 @@
<string name="faq">问题和解答</string>
<!-- Button in the main menu -->
<string name="donate">捐助我们</string>
<string name="already_donated">已捐赠</string>
<string name="remind_me_later">稍后提醒</string>
<string name="support_organic_maps">支持 Organic Maps</string>
<!-- Button in the main Help dialog -->
<string name="how_to_support_us">支持本项目</string>
<!-- Button in the main Help dialog -->

View file

@ -296,6 +296,9 @@
<string name="faq">Frequently Asked Questions</string>
<!-- Button in the main menu -->
<string name="donate">Donate</string>
<string name="already_donated">Already donated</string>
<string name="remind_me_later">Remind later</string>
<string name="support_organic_maps">Support Organic Maps</string>
<!-- Button in the main Help dialog -->
<string name="how_to_support_us">Support the project</string>
<!-- Button in the main Help dialog -->

View file

@ -7017,7 +7017,7 @@
zh-Hant = 捐助,以共同打造最好的地圖!
[already_donated]
tags = ios
tags = ios,android
en = Already donated
af = Reeds geskenk
ar = تم التبرع
@ -7061,7 +7061,7 @@
zh-Hant = 已捐贈
[remind_me_later]
tags = ios
tags = ios,android
en = Remind later
af = Herinner later
ar = ذكر لاحقاً
@ -7106,7 +7106,7 @@
zh-Hant = 稍後提醒
[support_organic_maps]
tags = ios
tags = ios,android
en = Support Organic Maps
af = Ondersteun Organic Maps
ar = دعم Organic Maps

View file

@ -767,6 +767,7 @@ public:
void OnPowerSchemeChanged(power_management::Scheme const actualScheme) override;
public:
bool ShouldShowProducts() const;
std::optional<products::ProductsConfig> GetProductsConfiguration() const;
enum class ProductsPopupCloseReason
@ -777,12 +778,12 @@ public:
RemindLater
};
ProductsPopupCloseReason FromString(std::string const & str) const;
void DidCloseProductsPopup(ProductsPopupCloseReason reason) const;
void DidSelectProduct(products::ProductsConfig::Product const & product) const;
private:
bool ShouldShowProducts() const;
uint32_t GetTimeoutForReason(ProductsPopupCloseReason reason) const;
std::string_view ToString(ProductsPopupCloseReason reason) const;
ProductsPopupCloseReason FromString(std::string const & str) const;
};