[android] Remove ads and tracking code

Signed-off-by: Roman Tsisyk <roman@tsisyk.com>
This commit is contained in:
Roman Tsisyk 2021-02-27 21:29:10 +03:00
parent 76de4be9e9
commit 48e2dd7085
127 changed files with 120 additions and 5943 deletions

View file

@ -5,13 +5,6 @@
xmlns:tools="http://schemas.android.com/tools"
android:installLocation="auto">
<!-- Mentioned MoPub dependencies use 16 API level as a min SDK version, which conflicts
with our version (15 API), that's why forcible use our version to resolve this conflict -->
<uses-sdk tools:overrideLibrary="com.mopub.mobileads.native_static,
com.mopub.mobileads.base,
com.moat.analytics.mobile.mpub,
com.flurry.android.analytics.sdk"/>
<uses-feature
android:glEsVersion="0x00020000"
android:required="true"/>
@ -74,18 +67,6 @@
android:name="com.google.android.gms.version"
android:value="@integer/google_play_services_version"/>
<meta-data
android:name="PW_APPID"
android:value="${PW_APPID}"/>
<meta-data
android:name="${PW_PROJECT_ID_KEY}"
android:value="@string/pw_project_id"/>
<!--meta-data
android:name="PW_LOG_LEVEL"
android:value="ERROR" /-->
<activity
android:name="com.mapswithme.maps.SplashActivity"
android:label="@string/app_name">
@ -331,14 +312,6 @@
android:configChanges="orientation|screenLayout|screenSize|keyboardHidden"
android:label="@string/authorization_button_sign_in"/>
<activity android:name="com.mopub.common.MoPubBrowser" android:configChanges="keyboardHidden|orientation|screenSize"/>
<activity
android:name=".search.FilterActivity"
android:configChanges="orientation|screenLayout|screenSize"
android:label="@string/booking_filters"/>
<activity android:name="com.mopub.common.privacy.ConsentDialogActivity"
android:configChanges="keyboardHidden|orientation|screenSize"/>
<activity
android:name="com.mapswithme.maps.gdpr.MwmOptOutActivity"
android:label="@string/subtittle_opt_out"
@ -418,13 +391,6 @@
android:permission="android.permission.BIND_JOB_SERVICE"
android:exported="false"/>
<receiver
android:name="com.appsflyer.MultipleInstallBroadcastReceiver"
android:exported="true">
<intent-filter>
<action android:name="com.android.vending.INSTALL_REFERRER" />
</intent-filter>
</receiver>
<!-- our custom receiver, that will call Aloha & other handlers -->
<receiver
android:name="com.mapswithme.util.MultipleTrackerReferrerReceiver"
@ -458,26 +424,6 @@
android:exported="false">
</service>
<!-- Took this legacy code from https://www.pushwoosh.com/docs/gcm-integration-legacy.
Remove it after Pushwoosh is removed. -->
<service
android:name="com.mapswithme.util.push.GCMListenerRouterService"
android:enabled="true"
android:exported="false" >
<intent-filter android:priority="100" >
<action android:name="com.google.android.c2dm.intent.RECEIVE" />
</intent-filter>
</service>
<service
android:name="com.mapswithme.util.push.GcmInstanceIDRouterListenerService"
android:enabled="true"
android:exported="false">
<intent-filter>
<action android:name="com.google.android.gms.iid.InstanceID"/>
</intent-filter>
</service>
<service
android:name="com.mapswithme.maps.geofence.GeofenceTransitionsIntentService"
android:permission="android.permission.BIND_JOB_SERVICE"

View file

@ -49,8 +49,6 @@ dependencies {
implementation 'com.google.android.gms:play-services-auth:17.0.0'
implementation 'com.google.android.gms:play-services-basement:17.1.1'
// statistics
implementation 'com.flurry.android:analytics:12.1.0@aar'
// crash reporting
implementation 'com.google.firebase:firebase-analytics:17.4.4'
implementation 'com.google.firebase:firebase-crashlytics:17.1.1'
@ -58,14 +56,6 @@ dependencies {
// 3-party
implementation 'com.google.code.gson:gson:2.6.1'
implementation ('com.my.target:mytarget-sdk:5.2.2') {
exclude group: 'com.google.android.exoplayer', module:'exoplayer-core'
exclude group: 'com.google.android.exoplayer', module:'exoplayer-dash'
exclude group: 'com.google.android.exoplayer', module:'exoplayer-hls'
}
implementation('com.mopub:mopub-sdk-native-static:5.10.0@aar') {
transitive = true;
}
// BottomSheet
implementation 'com.cocosw:bottomsheet:1.5.0@aar'
implementation 'com.timehop.stickyheadersrecyclerview:library:0.4.3@aar'
@ -73,8 +63,6 @@ dependencies {
implementation 'com.github.bumptech.glide:glide:3.7.0'
// Java concurrency annotations
implementation 'net.jcip:jcip-annotations:1.0'
implementation 'com.appsflyer:af-android-sdk:4.9.0'
implementation 'com.android.installreferrer:installreferrer:1.0'
implementation 'androidx.constraintlayout:constraintlayout:1.1.3'
implementation 'androidx.work:work-runtime:2.2.0'
@ -179,17 +167,6 @@ android {
buildConfigField 'String', 'REVIEW_URL', '"market://details?id=app.omaps"'
buildConfigField 'int', 'RATING_THRESHOLD', '5'
// PushWoosh keys
Properties pwProps = new Properties()
pwProps.load(new FileInputStream("${projectDir}/pushwoosh.properties"));
manifestPlaceholders += ['PW_APPID': pwProps['pwAppId']]
buildConfigField 'String', 'PW_APPID', /"${pwProps['pwAppId']}"/
def pwProjectIdKey = 'PW_PROJECT_ID'
manifestPlaceholders += [pwProjectId : pwProps['pwProjectId']]
manifestPlaceholders += ['PW_PROJECT_ID_KEY' : pwProjectIdKey]
resValue 'string', 'pw_project_id', pwProps['pwProjectId']
buildConfigField "String", 'PW_PROJECT_ID', "\"" + pwProjectIdKey + "\""
multiDexEnabled true
multiDexKeepFile file('multidex-config.txt')

View file

@ -17,9 +17,7 @@
#include "partners_api/ads/ads_engine.hpp"
#include "partners_api/ads/banner.hpp"
#include "partners_api/ads/mopub_ads.hpp"
#include "partners_api/booking_block_params.hpp"
#include "partners_api/megafon_countries.hpp"
#include "web_api/utils.hpp"
@ -2044,83 +2042,6 @@ Java_com_mapswithme_maps_Framework_nativeGetFilterRating(JNIEnv * env, jclass, j
return static_cast<jint>(place_page::rating::GetFilterRating(rawRating));
}
JNIEXPORT jstring JNICALL
Java_com_mapswithme_maps_Framework_nativeMoPubInitializationBannerId(JNIEnv * env, jclass)
{
return jni::ToJavaString(env, ads::Mopub::InitializationBannerId());
}
JNIEXPORT jobject JNICALL
Java_com_mapswithme_maps_Framework_nativeGetDownloaderPromoBanner(JNIEnv * env, jclass,
jstring mwmId)
{
static jclass const downloaderPromoBannerClass = jni::GetGlobalClassRef(env,
"com/mapswithme/maps/downloader/DownloaderPromoBanner");
// Java signature : DownloaderPromoBanner(@DownloaderPromoType int type, @NonNull String url)
static jmethodID const downloaderPromoBannerConstructor = jni::GetConstructorID(env,
downloaderPromoBannerClass, "(ILjava/lang/String;)V");
auto const pos = frm()->GetCurrentPosition();
auto const banners =
frm()->GetAdsEngine().GetDownloadOnMapBanners(jni::ToNativeString(env, mwmId), pos,
languages::GetCurrentNorm());
if (banners.empty())
return nullptr;
jni::TScopedLocalRef const url(env, jni::ToJavaString(env, banners[0].m_value));
return env->NewObject(downloaderPromoBannerClass, downloaderPromoBannerConstructor,
static_cast<jint>(banners[0].m_type), url.get());
}
JNIEXPORT jboolean JNICALL
Java_com_mapswithme_maps_Framework_nativeHasMegafonCategoryBanner(JNIEnv * env, jclass)
{
auto const & purchase = frm()->GetPurchase();
if (purchase && purchase->IsSubscriptionActive(SubscriptionType::RemoveAds))
return static_cast<jboolean>(false);
auto const position = frm()->GetCurrentPosition();
if (!position)
return static_cast<jboolean>(false);
auto const latLon = mercator::ToLatLon(*position);
return static_cast<jboolean>(ads::HasMegafonCategoryBanner(frm()->GetStorage(),
frm()->GetTopmostCountries(latLon),
languages::GetCurrentNorm()));
}
JNIEXPORT jstring JNICALL
Java_com_mapswithme_maps_Framework_nativeGetMegafonCategoryBannerUrl(JNIEnv * env, jclass)
{
return jni::ToJavaString(env, ads::GetMegafonCategoryBannerUrl());
}
JNIEXPORT jboolean JNICALL
Java_com_mapswithme_maps_Framework_nativeHasCitymobilCategoryBanner(JNIEnv * env, jclass)
{
if (GetPlatform().ConnectionStatus() == Platform::EConnectionType::CONNECTION_NONE)
return static_cast<jboolean>(false);
auto const pos = frm()->GetCurrentPosition();
auto const banners = frm()->GetAdsEngine().GetSearchCategoryBanners(pos);
return static_cast<jboolean>(!banners.empty() &&
banners.front().m_type == ads::Banner::Type::Citymobil);
}
JNIEXPORT jstring JNICALL
Java_com_mapswithme_maps_Framework_nativeGetCitymobilCategoryBannerUrl(JNIEnv * env, jclass)
{
auto const pos = frm()->GetCurrentPosition();
auto const banners = frm()->GetAdsEngine().GetSearchCategoryBanners(pos);
if (banners.empty() || banners.front().m_type != ads::Banner::Type::Citymobil)
return jni::ToJavaString(env, "");
return jni::ToJavaString(env, banners.front().m_value);
}
JNIEXPORT void JNICALL
Java_com_mapswithme_maps_Framework_nativeMakeCrash(JNIEnv *env, jclass type)
{

View file

@ -5,21 +5,13 @@
using namespace std;
void MarketingService::SendPushWooshTag(string const & tag)
{
SendPushWooshTag(tag, vector<string>{"1"});
}
{}
void MarketingService::SendPushWooshTag(string const & tag, string const & value)
{
SendPushWooshTag(tag, vector<string>{value});
}
{}
void MarketingService::SendPushWooshTag(string const & tag, vector<string> const & values)
{
android::Platform::Instance().SendPushWooshTag(tag, values);
}
{}
void MarketingService::SendMarketingEvent(string const & tag, map<string, string> const & params)
{
android::Platform::Instance().SendMarketingEvent(tag, params);
}
{}

View file

@ -179,10 +179,6 @@ void Platform::Initialize(JNIEnv * env, jobject functorProcessObject, jstring ap
{
m_functorProcessObject = env->NewGlobalRef(functorProcessObject);
jclass const functorProcessClass = env->GetObjectClass(functorProcessObject);
m_sendPushWooshTagsMethod = env->GetMethodID(functorProcessClass, "sendPushWooshTags",
"(Ljava/lang/String;[Ljava/lang/String;)V");
m_sendAppsFlyerTagsMethod = env->GetMethodID(functorProcessClass, "sendAppsFlyerTags",
"(Ljava/lang/String;[Lcom/mapswithme/util/KeyValue;)V");
m_guiThread = std::make_unique<GuiThread>(m_functorProcessObject);
@ -270,32 +266,6 @@ Platform & Platform::Instance()
return platform;
}
void Platform::SendPushWooshTag(std::string const & tag, std::vector<std::string> const & values)
{
ASSERT(m_functorProcessObject, ());
ASSERT(m_sendPushWooshTagsMethod, ());
if (values.empty())
return;
JNIEnv * env = jni::GetEnv();
env->CallVoidMethod(m_functorProcessObject, m_sendPushWooshTagsMethod,
jni::TScopedLocalRef(env, jni::ToJavaString(env, tag)).get(),
jni::TScopedLocalObjectArrayRef(env, jni::ToJavaStringArray(env, values)).get());
}
void Platform::SendMarketingEvent(std::string const & tag,
std::map<std::string, std::string> const & params)
{
JNIEnv * env = jni::GetEnv();
ASSERT(m_functorProcessObject, ());
ASSERT(m_sendAppsFlyerTagsMethod, ());
env->CallVoidMethod(m_functorProcessObject, m_sendAppsFlyerTagsMethod,
jni::TScopedLocalRef(env, jni::ToJavaString(env, tag)).get(),
jni::TScopedLocalObjectArrayRef(env, jni::ToKeyValueArray(env, params)).get());
}
void Platform::AndroidSecureStorage::Init(JNIEnv * env)
{
if (m_secureStorageClass != nullptr)

View file

@ -35,9 +35,6 @@ public:
bool HasAvailableSpaceForWriting(uint64_t size) const;
void SendPushWooshTag(std::string const & tag, std::vector<std::string> const & values);
void SendMarketingEvent(std::string const & tag, std::map<std::string, std::string> const & params);
void SetGuiThread(std::unique_ptr<base::TaskLoop> guiThread);
class AndroidSecureStorage
@ -61,8 +58,6 @@ public:
private:
jobject m_functorProcessObject = nullptr;
jmethodID m_sendPushWooshTagsMethod = nullptr;
jmethodID m_sendAppsFlyerTagsMethod = nullptr;
AndroidSecureStorage m_secureStorage;
};

View file

@ -4,31 +4,10 @@
# support library bug
-dontwarn android.support.**
# flurry
-dontwarn com.flurry.**
# parse
-dontwarn com.squareup.okhttp.**
-dontwarn okio.**
# pushwoosh
-keep class com.pushwoosh.** { *; }
-keep class com.arellomobile.** { *; }
-dontwarn com.pushwoosh.**
-dontwarn com.arellomobile.**
# appsFlyer
-keep class com.appsflyer.** { *; }
-dontwarn com.appsflyer.**
-dontwarn com.android.installreferrer
# myTarget
# Remove this dontwarn when MyTarget is updated to 4.6.15
-dontwarn com.my.target.nativeads.mediation.**
# Remove this dontwarn when MyTarget is updated to 4.6.16
-dontwarn com.my.target.core.net.cookie.**
-dontwarn com.mopub.**
-dontoptimize
-keepattributes **

View file

@ -1,3 +0,0 @@
pwAppId=XXXXX
pwProjectId=A123456789012

View file

@ -1,10 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<ripple xmlns:android="http://schemas.android.com/apk/res/android"
android:color="@color/black_8">
<item>
<shape
android:shape="rectangle">
<solid android:color="@color/search_local_ads_customer_result"/>
</shape>
</item>
</ripple>

View file

@ -1,10 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<ripple xmlns:android="http://schemas.android.com/apk/res/android"
android:color="@color/white_12">
<item>
<shape
android:shape="rectangle">
<solid android:color="@color/search_local_ads_customer_result_night"/>
</shape>
</item>
</ripple>

View file

@ -1,9 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<solid android:color="@color/black_12"/>
<corners android:radius="@dimen/cardview_default_radius"/>
<padding
android:left="@dimen/margin_eighth"
android:right="@dimen/margin_eighth"/>
</shape>

View file

@ -1,17 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_pressed="true">
<shape android:shape="rectangle">
<corners android:radius="@dimen/placepage_banner_small_action_corner" />
<solid android:color="@color/bg_banner_action_button_pressed" />
<padding android:bottom="@dimen/placepage_banner_button_margin_top" android:left="@dimen/margin_half" android:right="@dimen/margin_half" android:top="@dimen/placepage_banner_button_margin_top" />
</shape>
</item>
<item android:state_pressed="false">
<shape android:shape="rectangle">
<corners android:radius="@dimen/placepage_banner_small_action_corner" />
<solid android:color="@color/bg_banner_action_button" />
<padding android:bottom="@dimen/placepage_banner_button_margin_top" android:left="@dimen/margin_half" android:right="@dimen/margin_half" android:top="@dimen/placepage_banner_button_margin_top" />
</shape>
</item>
</selector>

View file

@ -1,17 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_pressed="true">
<shape android:shape="rectangle">
<corners android:radius="@dimen/placepage_banner_small_action_corner" />
<solid android:color="@color/bg_banner_action_button_pressed_night" />
<padding android:bottom="@dimen/placepage_banner_button_margin_top" android:left="@dimen/margin_half" android:right="@dimen/margin_half" android:top="@dimen/placepage_banner_button_margin_top" />
</shape>
</item>
<item android:state_pressed="false">
<shape android:shape="rectangle">
<corners android:radius="@dimen/placepage_banner_small_action_corner" />
<solid android:color="@color/bg_banner_action_button_night" />
<padding android:bottom="@dimen/placepage_banner_button_margin_top" android:left="@dimen/margin_half" android:right="@dimen/margin_half" android:top="@dimen/placepage_banner_button_margin_top" />
</shape>
</item>
</selector>

View file

@ -1,9 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<solid android:color="@color/white_12"/>
<corners android:radius="@dimen/cardview_default_radius"/>
<padding
android:left="@dimen/margin_eighth"
android:right="@dimen/margin_eighth"/>
</shape>

View file

@ -1,10 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<shape
xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<solid android:color="@color/bg_banner_color"/>
<corners android:radius="@dimen/cardview_default_radius"/>
<stroke
android:width="@dimen/divider_width"
android:color="@color/black_8"/>
</shape>

View file

@ -1,18 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<selector
xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_pressed="true">
<shape
android:shape="rectangle">
<solid android:color="@color/bg_banner_action_button_pressed"/>
<corners android:radius="@dimen/button_small_corner_radius"/>
</shape>
</item>
<item android:state_pressed="false">
<shape
android:shape="rectangle">
<solid android:color="@color/bg_banner_action_button"/>
<corners android:radius="@dimen/button_small_corner_radius"/>
</shape>
</item>
</selector>

View file

@ -1,18 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<selector
xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_pressed="true">
<shape
android:shape="rectangle">
<solid android:color="@color/bg_banner_action_button_pressed_night"/>
<corners android:radius="@dimen/cardview_default_radius"/>
</shape>
</item>
<item android:state_pressed="false">
<shape
android:shape="rectangle">
<solid android:color="@color/bg_banner_action_button_night"/>
<corners android:radius="@dimen/cardview_default_radius"/>
</shape>
</item>
</selector>

View file

@ -1,10 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<shape
xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<solid android:color="@color/bg_banner_color_night"/>
<corners android:radius="@dimen/cardview_default_radius"/>
<stroke
android:width="@dimen/divider_width"
android:color="@color/white_8"/>
</shape>

View file

@ -1,17 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_pressed="true">
<shape android:shape="rectangle">
<corners android:radius="@dimen/placepage_banner_small_action_corner" />
<solid android:color="@color/black_24" />
<padding android:bottom="@dimen/placepage_banner_button_margin_top" android:left="@dimen/margin_half" android:right="@dimen/margin_half" android:top="@dimen/placepage_banner_button_margin_top" />
</shape>
</item>
<item android:state_pressed="false">
<shape android:shape="rectangle">
<corners android:radius="@dimen/placepage_banner_small_action_corner" />
<solid android:color="@color/black_12" />
<padding android:bottom="@dimen/placepage_banner_button_margin_top" android:left="@dimen/margin_half" android:right="@dimen/margin_half" android:top="@dimen/placepage_banner_button_margin_top" />
</shape>
</item>
</selector>

View file

@ -1,17 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_pressed="true">
<shape android:shape="rectangle">
<corners android:radius="@dimen/placepage_banner_small_action_corner" />
<solid android:color="@color/white_12" />
<padding android:bottom="@dimen/placepage_banner_button_margin_top" android:left="@dimen/margin_half" android:right="@dimen/margin_half" android:top="@dimen/placepage_banner_button_margin_top" />
</shape>
</item>
<item android:state_pressed="false">
<shape android:shape="rectangle">
<corners android:radius="@dimen/placepage_banner_small_action_corner" />
<solid android:color="@color/white_54" />
<padding android:bottom="@dimen/placepage_banner_button_margin_top" android:left="@dimen/margin_half" android:right="@dimen/margin_half" android:top="@dimen/placepage_banner_button_margin_top" />
</shape>
</item>
</selector>

View file

@ -1,7 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<shape
xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<solid android:color="@color/bg_search_category_banner_color_night"/>
<corners android:radius="@dimen/cardview_default_radius"/>
</shape>

View file

@ -1,7 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:drawable="@color/black_8"
android:state_pressed="true"/>
<item android:drawable="@color/search_local_ads_customer_result" />
</selector>

View file

@ -1,7 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:drawable="@color/white_12"
android:state_pressed="true"/>
<item android:drawable="@color/search_local_ads_customer_result_night" />
</selector>

View file

@ -1,68 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:minHeight="@dimen/search_item_height"
android:background="?searchCategoryBannerBackground">
<ImageView
android:id="@+id/ad_choices_label"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="?adChoicesIcon"
android:layout_alignParentTop="true"
android:layout_alignParentStart="true"
android:layout_alignParentLeft="true"/>
<ImageView
android:id="@+id/promo_icon"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerVertical="true"
android:layout_marginStart="@dimen/margin_base"
android:layout_marginLeft="@dimen/margin_base"
android:layout_below="@id/ad_choices_label"/>
<TextView
android:id="@+id/promo_title"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_toRightOf="@id/promo_icon"
android:layout_toEndOf="@id/promo_icon"
android:singleLine="true"
android:textAppearance="@style/MwmTextAppearance.Body2"
android:layout_marginLeft="@dimen/margin_base"
android:layout_marginStart="@dimen/margin_base"
android:layout_centerVertical="true"
tools:text="Promo title"/>
<TextView
android:id="@+id/promo_action"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:gravity="center"
android:layout_centerVertical="true"
android:layout_alignParentRight="true"
android:layout_alignParentEnd="true"
android:layout_marginLeft="@dimen/margin_half"
android:layout_marginStart="@dimen/margin_half"
android:layout_marginRight="@dimen/margin_base"
android:layout_marginEnd="@dimen/margin_base"
android:textSize="@dimen/text_size_body_4"
android:textColor="?searchCategoryAdsActionTextColor"
android:textAllCaps="true"
android:background="?searchCategoryAdsActionBackground"
android:foreground="?clickableBackground"
android:text="@string/install_app"
tools:visibility="visible"
android:fontFamily="@string/robotoMedium"
tools:targetApi="jelly_bean"/>
<ImageButton
android:id="@+id/remove_ads"
android:layout_width="@dimen/placepage_banner_remove_button_size"
android:layout_height="@dimen/placepage_banner_remove_button_size"
android:layout_alignParentTop="true"
android:layout_alignParentRight="true"
android:layout_alignParentEnd="true"
android:scaleType="centerCrop"
android:src="@drawable/ic_clear"
android:background="@color/red_cross_background"/>
</RelativeLayout>

View file

@ -1,12 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/banner"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="?bannerBackground"
android:clipToPadding="false"
tools:layout_height="wrap_content">
<include layout="@layout/place_page_banner_content"/>
</RelativeLayout>

View file

@ -1,157 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<merge
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
tools:showIn="@layout/place_page_banner">
<TextView
android:id="@+id/tv__action_small"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:gravity="center"
android:layout_centerVertical="true"
android:layout_alignParentEnd="true"
android:layout_marginStart="@dimen/margin_half"
android:layout_marginEnd="@dimen/margin_half_plus"
android:textSize="@dimen/text_size_body_4"
android:textColor="@color/white_primary"
android:textAllCaps="true"
android:background="?adsActionBackground"
android:visibility="gone"
tools:text="Заказать"
tools:visibility="visible"
android:fontFamily="@string/robotoMedium"
tools:targetApi="jelly_bean"/>
<RelativeLayout
android:id="@+id/data_frame"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_toStartOf="@id/tv__action_small"
android:layout_marginLeft="@dimen/margin_half_plus"
android:layout_marginRight="@dimen/margin_half_plus"
android:layout_marginTop="@dimen/margin_half"
android:layout_marginBottom="@dimen/margin_half">
<ImageView
android:id="@+id/iv__banner_icon"
android:layout_width="@dimen/placepage_banner_icon_size"
android:layout_height="@dimen/placepage_banner_icon_size"
android:layout_marginEnd="@dimen/margin_half"
android:scaleType="centerCrop"
android:visibility="gone"
tools:src="@drawable/img_logo"
tools:visibility="visible"/>
<LinearLayout
android:id="@+id/banner_title"
android:orientation="horizontal"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_toEndOf="@id/iv__banner_icon"
android:gravity="center_vertical">
<ImageView
android:id="@+id/ad_choices_icon"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/ic_ads_fb"
android:layout_marginEnd="@dimen/margin_quarter"
android:visibility="gone"/>
<ImageView
android:id="@+id/ad_choices_label"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="?adChoicesIcon"
android:layout_marginEnd="@dimen/margin_quarter"
android:visibility="gone"/>
<TextView
android:id="@+id/tv__banner_title"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:maxLines="1"
android:minLines="1"
android:textAppearance="@style/MwmTextAppearance.Body4"
android:textColor="?textBannerTitle"
android:fontFamily="@string/robotoMedium"
android:textStyle="bold"
android:ellipsize="end"
tools:text="Закажи одежду в интернет-магазине Wildberries."
tools:targetApi="jelly_bean"/>
</LinearLayout>
<TextView
android:id="@+id/tv__banner_message"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textAppearance="@style/MwmTextAppearance.Body4"
android:textColor="?textBannerTitle"
android:maxLines="3"
android:ellipsize="end"
tools:text="Бесплатная курьерская доставка по России!\n\nКоллекции женской, мужской и детской одежды, обуви,
а также товары для дома и спорта. Цены."
tools:maxLines="5"
android:layout_below="@+id/banner_title"
android:layout_toEndOf="@+id/iv__banner_icon"/>
</RelativeLayout>
<LinearLayout
android:id="@+id/action_container"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:layout_marginLeft="@dimen/margin_half_plus"
android:layout_marginRight="@dimen/margin_half_plus"
android:layout_marginBottom="@dimen/margin_half"
android:layout_below="@id/data_frame">
<TextView
android:id="@+id/tv__action_remove"
android:layout_width="@dimen/dp_0"
android:layout_height="wrap_content"
android:layout_weight="1"
android:layout_marginEnd="@dimen/margin_half"
android:paddingLeft="@dimen/margin_quarter"
android:paddingStart="@dimen/margin_quarter"
android:paddingRight="@dimen/margin_quarter"
android:paddingEnd="@dimen/margin_quarter"
android:minHeight="@dimen/placepage_banner_button_height"
android:textAppearance="@style/MwmTextAppearance.Body3"
android:textColor="@color/white_primary"
android:textSize="14dp"
android:textAllCaps="true"
android:background="?bannerButtonBackground"
android:gravity="center"
android:visibility="visible"
android:text="@string/remove_ads"
android:ellipsize="end"
android:singleLine="true"
tools:visibility="visible"
android:fontFamily="@string/robotoMedium"
tools:ignore="SpUsage"/>
<TextView
android:id="@+id/tv__action_large"
android:layout_width="@dimen/dp_0"
android:layout_height="wrap_content"
android:layout_weight="1"
android:paddingLeft="@dimen/margin_quarter"
android:paddingStart="@dimen/margin_quarter"
android:paddingRight="@dimen/margin_quarter"
android:paddingEnd="@dimen/margin_quarter"
android:minHeight="@dimen/placepage_banner_button_height"
android:textAppearance="@style/MwmTextAppearance.Body3"
android:textColor="@color/white_primary"
android:textSize="14dp"
android:textAllCaps="true"
android:background="?bannerButtonBackground"
android:gravity="center"
android:visibility="visible"
android:ellipsize="end"
android:singleLine="true"
tools:text="Заказать"
tools:visibility="visible"
android:fontFamily="@string/robotoMedium"
tools:ignore="SpUsage"/>
</LinearLayout>
<ImageButton
android:id="@+id/remove_btn"
android:layout_width="@dimen/placepage_banner_remove_button_size"
android:layout_height="@dimen/placepage_banner_remove_button_size"
android:layout_alignParentTop="true"
android:layout_alignParentEnd="true"
android:scaleType="centerCrop"
android:src="@drawable/ic_clear"
android:background="@color/red_cross_background"/>
</merge>

View file

@ -1026,16 +1026,6 @@
<string name="traffic_update_app_message">لعرض البيانات المرورية، يجب تحديث التطبيق.</string>
<!-- "traffic" as in "road congestion" -->
<string name="traffic_data_unavailable">البيانات المرورية غير متاحة</string>
<string name="banner_deliveryclub_title">توصيل الطعام</string>
<string name="banner_deliveryclub_message">توصيل سريع من 4000 مطعم. اطلب من Delivery Club.</string>
<string name="banner_lamoda_title">متجر الملابس والأحذية على الإنترنت</string>
<string name="banner_lamoda_message">أكثر من 1000 علامة تجارية. خصم يصل إلى 70%. توصيل مجاني في كافة أنحاء البلاد.</string>
<string name="banner_tutu_title">تذاكر القطار على الإنترنت</string>
<string name="banner_tutu_message">تذاكر القطار إلى أي مدينة على الإنترنت - الأسعار والبحث والحجز.</string>
<string name="banner_geerbest_title">متجر إلكترونيات على الإنترنت</string>
<string name="banner_geerbest_message">بحث سريع في أكثر من 50000 صنف بأسعار منخفضة.</string>
<string name="banner_rentalcars_title">إيجار السيارات على الإنترنت</string>
<string name="banner_rentalcars_message">800 شركة تأجير سيارات في أكثر من 49000 مكان لتأجير السيارات.</string>
<!-- december -->
<string name="whatsnew_traffic">البيانات المرورية في 36 دولة</string>
<!-- december -->
@ -1312,10 +1302,8 @@
<item quantity="other">المسارات %d</item>
</plurals>
<string name="subtittle_opt_out">إعدادات التتبع</string>
<string name="opt_out_flurry">الإحصاء</string>
<string name="opt_out_mopub">الإعلان الشخصي</string>
<string name="opt_out_fabric">تقرير الحادث</string>
<string name="opt_out_fabric_description">قد نستخدم بياناتك لتحسين تجربة OMaps. سوف تكون التغييرات نافذة المفعول بعد إعادة تشغيل التطبيق.</string>
<string name="crash_reports">تقرير الحادث</string>
<string name="crash_reports_description">قد نستخدم بياناتك لتحسين تجربة OMaps. سوف تكون التغييرات نافذة المفعول بعد إعادة تشغيل التطبيق.</string>
<string name="opt_out_help_ios_1">يمكن أن يوفر جهازك الجوّال إعداد \"\"تقييد الإعلان المخصص\"\" أو \"\"تعطيل الإعلان الذي يستهدف الاهتمامات\"\".</string>
<string name="opt_out_help_ios_2">نظام تشغيل آي 9 فما فوق</string>
<string name="opt_out_help_ios_3">انتقل إلى إعداداتك ← الخصوصية ← الإعلانات ← تمكين إعداد \"\"تحديد تتبع الإعلانات\"\"</string>
@ -1323,8 +1311,6 @@
<string name="privacy_policy">سياسة الخصوصية</string>
<string name="terms_of_use">شروط الاستخدام</string>
<string name="backup_notification_failed">قد تم تعليق احتياطي المواقع المفضلة لديك. سجل الدخول لإعادة تشغيله.</string>
<string name="banner_megafon_banner_message">قل وداعا للتجوال الدولي!</string>
<string name="banner_megafon_banner_button">وداعا!</string>
<string name="button_layer_traffic">حركة مرور</string>
<string name="button_layer_subway">مترو الانفاق</string>
<string name="layers_title">طبقات الخريطة</string>

View file

@ -1022,16 +1022,6 @@
<string name="traffic_update_app_message">Ke zobrazení dat o provozu je nutné aplikaci aktualizovat.</string>
<!-- "traffic" as in "road congestion" -->
<string name="traffic_data_unavailable">Data o provozu nejsou k dispozici</string>
<string name="banner_deliveryclub_title">Rozvoz jídel</string>
<string name="banner_deliveryclub_message">Rychlé rozvoz z 4000 restaurací. Objednejte si u Delivery Club.</string>
<string name="banner_lamoda_title">Online obchod s oděvy a obuví</string>
<string name="banner_lamoda_message">Více než 1000 značek. Sleva až 70 %. Doručení zdarma po celé zemi.</string>
<string name="banner_tutu_title">Vlakové jízdenky online</string>
<string name="banner_tutu_message">Vlakové jízdenky do kteréhokoli města onlive - ceny, vyhledávání a rezervace.</string>
<string name="banner_geerbest_title">Online obchod s elektronikou</string>
<string name="banner_geerbest_message">Rychlé hledání ve více než 50 000 položkách za nízké ceny.</string>
<string name="banner_rentalcars_title">Pronájem auta online</string>
<string name="banner_rentalcars_message">800 autopůjčoven na více než 49 000 místech.</string>
<!-- december -->
<string name="whatsnew_traffic">Údaje o provozu ve 36 zemích</string>
<!-- december -->
@ -1310,10 +1300,8 @@
<item quantity="other">%d cest</item>
</plurals>
<string name="subtittle_opt_out">Natavení doprovodu</string>
<string name="opt_out_flurry">Statistika</string>
<string name="opt_out_mopub">Personalizovaná reklama</string>
<string name="opt_out_fabric">Zprávy o chybách</string>
<string name="opt_out_fabric_description">Můžeme používat vaše údaje pro vývoj a zlepšení OMaps. Změny se projeví po restartování aplikace.</string>
<string name="crash_reports">Zprávy o chybách</string>
<string name="crash_reports_description">Můžeme používat vaše údaje pro vývoj a zlepšení OMaps. Změny se projeví po restartování aplikace.</string>
<string name="opt_out_help_ios_1">Cílovou reklamu můžete vypnout v nastavení vašeho zařízení.</string>
<string name="opt_out_help_ios_2">iOS 9 nebo vyšší</string>
<string name="opt_out_help_ios_3">Otevřete Nastavení → Důvěrnost → Reklama → Zapněte „Omezení trackingu“</string>
@ -1321,8 +1309,6 @@
<string name="privacy_policy">Politika důvěrnosti</string>
<string name="terms_of_use">Podmínky užívání</string>
<string name="backup_notification_failed">Zálohování značek bylo pozastaveno. Pro zapnutí zálohování vejděte.</string>
<string name="banner_megafon_banner_message">Rozluč se s mezinárodním roamingem!</string>
<string name="banner_megafon_banner_button">Good Bye!</string>
<string name="button_layer_traffic">Zácpy</string>
<string name="button_layer_subway">Metro</string>
<string name="layers_title">Úrovně mapy</string>

View file

@ -1024,16 +1024,6 @@
<string name="traffic_update_app_message">Appen skal opdateres for at kunne vise trafikdata.</string>
<!-- "traffic" as in "road congestion" -->
<string name="traffic_data_unavailable">Trafikdata er ikke tilgængelige</string>
<string name="banner_deliveryclub_title">Udbringning af mad</string>
<string name="banner_deliveryclub_message">Hurtig levering fra 4.000 restauranter. Bestil fra Delivery Club.</string>
<string name="banner_lamoda_title">Online sko- og tøjbutik</string>
<string name="banner_lamoda_message">Mere end 1.000 mærker. Op til 70% rabat. Gratis levering over hele landet.</string>
<string name="banner_tutu_title">Togbilletter online</string>
<string name="banner_tutu_message">Køb togbilletter til enhver by online - priser, søgning og bestilling.</string>
<string name="banner_geerbest_title">Online elektronikbutik</string>
<string name="banner_geerbest_message">Hurtig søgning blandt over 50.000 varer til lave priser.</string>
<string name="banner_rentalcars_title">Udlejning biler online</string>
<string name="banner_rentalcars_message">800 biludlejningsselskaber på mere end 49.000 steder.</string>
<!-- december -->
<string name="whatsnew_traffic">Trafikdata i 36 lande</string>
<!-- december -->
@ -1311,10 +1301,8 @@
<item quantity="other">%d ruter</item>
</plurals>
<string name="subtittle_opt_out">Tracking-indstillinger</string>
<string name="opt_out_flurry">Statistik</string>
<string name="opt_out_mopub">Personaliserede reklamer</string>
<string name="opt_out_fabric">Nedbrudsrapport</string>
<string name="opt_out_fabric_description">Vi kan anvende dine data til at forbedre brugeroplevelsen på OMaps. Ændringerne træder i kraft, når du har genstartet appen.</string>
<string name="crash_reports">Nedbrudsrapport</string>
<string name="crash_reports_description">Vi kan anvende dine data til at forbedre brugeroplevelsen på OMaps. Ændringerne træder i kraft, når du har genstartet appen.</string>
<string name="opt_out_help_ios_1">Din mobilenhed kan indeholde en »Begræns reklamesporing« eller »Afmeld Tilpasset annoncering« indstiling.</string>
<string name="opt_out_help_ios_2">iOS 9 eller højere</string>
<string name="opt_out_help_ios_3">Gå til Indstillinger → Generelt → Begræsninger → Reklamer → Aktiver »Begræns reklamesporing« funktionen</string>
@ -1322,8 +1310,6 @@
<string name="privacy_policy">Privatlivspolitik</string>
<string name="terms_of_use">Vilkår for bruger</string>
<string name="backup_notification_failed">Backup af dine bogmærker er blevet suspenderet. Log ind for at slå til igen.</string>
<string name="banner_megafon_banner_message">Sig farvel til international roaming!</string>
<string name="banner_megafon_banner_button">Farvel!</string>
<string name="button_layer_traffic">Trafik</string>
<string name="button_layer_subway">Undergrundsbane</string>
<string name="layers_title">Kortlag</string>

View file

@ -1028,16 +1028,6 @@
<string name="traffic_update_app_message">Um Verkehrsdaten anzuzeigen, muss die Anwendung aktualisiert werden.</string>
<!-- "traffic" as in "road congestion" -->
<string name="traffic_data_unavailable">Verkehrsdaten sind nicht verfügbar</string>
<string name="banner_deliveryclub_title">Essensbringdienst</string>
<string name="banner_deliveryclub_message">Schnelle Lieferung von 4000 Restaurants. Bestellen mit Delivery Club.</string>
<string name="banner_lamoda_title">Onlinegeschäft für Kleidung und Schuhe</string>
<string name="banner_lamoda_message">Über 1000 Marken. Bis zu 70 % Rabatt. Kostenlose Lieferung landesweit.</string>
<string name="banner_tutu_title">Zugfahrkarten online</string>
<string name="banner_tutu_message">Zugfahrkarten in jede Stadt online Preise, Suche und Buchung.</string>
<string name="banner_geerbest_title">Online-Elektronikgeschäft</string>
<string name="banner_geerbest_message">Sofortsuche bei über 50.000 Artikeln zu günstigen Preisen.</string>
<string name="banner_rentalcars_title">Autos online mieten</string>
<string name="banner_rentalcars_message">800 Autovermietungen mit über 49.000 Mietstationen.</string>
<!-- december -->
<string name="whatsnew_traffic">Verkehrsdaten in 36 Ländern</string>
<!-- december -->
@ -1315,10 +1305,8 @@
<item quantity="other">%d Strecken</item>
</plurals>
<string name="subtittle_opt_out">Einstellungen der Begleitung</string>
<string name="opt_out_flurry">Statistiken</string>
<string name="opt_out_mopub">Personalisierte Werbung</string>
<string name="opt_out_fabric">Berichte über die Fehler</string>
<string name="opt_out_fabric_description">Wir können Ihre Daten benutzen, um OMaps zu entwickeln und zu verbessern. Die Änderungen werden nach dem Neustart der App in Kraft treten.</string>
<string name="crash_reports">Berichte über die Fehler</string>
<string name="crash_reports_description">Wir können Ihre Daten benutzen, um OMaps zu entwickeln und zu verbessern. Die Änderungen werden nach dem Neustart der App in Kraft treten.</string>
<string name="opt_out_help_ios_1">Sie können der Erhalt von gezielter Werbung in den Einstellungen des Geräts verbieten.</string>
<string name="opt_out_help_ios_2">iOS 9 oder höher</string>
<string name="opt_out_help_ios_3">Öffnen Sie die Einstellungen → Vertraulichkeit → Werbung → Schalten Sie „Tracking einschränken“ ein</string>
@ -1326,8 +1314,6 @@
<string name="privacy_policy">Datenschutzerklärung</string>
<string name="terms_of_use">Nutzungsbedingungen</string>
<string name="backup_notification_failed">Das Reservekopieren von Markierungen wurde angehalten. Loggen Sie sich ein, um das Reservekopieren einzuschalten.</string>
<string name="banner_megafon_banner_message">Sage dem internationalen Roaming goodbye!</string>
<string name="banner_megafon_banner_button">Goodbye!</string>
<string name="button_layer_traffic">Staus</string>
<string name="button_layer_subway">U-Bahn</string>
<string name="layers_title">Kartenschichten</string>

View file

@ -790,16 +790,6 @@
<string name="traffic_update_app_message">Για να εμφανιστούν πληροφορίες για την κίνηση, πρέπει να γίνει ενημέρωση της εφαρμογής.</string>
<!-- "traffic" as in "road congestion" -->
<string name="traffic_data_unavailable">Οι πληροφορίες για την κίνηση δεν είναι διαθέσιμες</string>
<string name="banner_deliveryclub_title">Παράδοση φαγητού</string>
<string name="banner_deliveryclub_message">Γρήγορη παράδοση από 4.000 εστιατόρια. Παραγγείλετε από το Delivery Club.</string>
<string name="banner_lamoda_title">Κατάστημα υποδημάτων και ρούχων online</string>
<string name="banner_lamoda_message">Περισσότερα από 1.000 επώνυμα προϊόντα. Έκπτωση έως και 70%. Δωρεάν παράδοση σε όλη τη χώρα.</string>
<string name="banner_tutu_title">Εισιτήρια τρένων online</string>
<string name="banner_tutu_message">Σιδηροδρομικά εισιτήρια για οποιαδήποτε πόλη online - τιμές, αναζήτηση και κράτηση.</string>
<string name="banner_geerbest_title">Κατάστημα ηλεκτρονικών online</string>
<string name="banner_geerbest_message">Άμεση αναζήτηση σε περισσότερα από 50.000 αντικείμενα σε χαμηλές τιμές.</string>
<string name="banner_rentalcars_title">Ενοικίαση αυτοκινήτων online</string>
<string name="banner_rentalcars_message">800 εταιρείες ενοικίασης αυτοκινήτων σε περισσότερες από 49.000 τοποθεσίες.</string>
<!-- december -->
<string name="whatsnew_traffic">Πληροφορίες για την κίνηση σε 36 χώρες</string>
<!-- december -->
@ -1077,10 +1067,8 @@
<item quantity="other">%d διαδρομές</item>
</plurals>
<string name="subtittle_opt_out">Ρυθμίσεις διαδρομών</string>
<string name="opt_out_flurry">Στατιστικές</string>
<string name="opt_out_mopub">Προσωπικές διαφημίσεις</string>
<string name="opt_out_fabric">Αναφορά σφάλματος</string>
<string name="opt_out_fabric_description">Μπορεί να χρησιμοποιήσουμε τα δεδομένα σας για να βελτιώσουμε την εμπειρία του OMaps. Οι αλλαγές θα ενεργοποιηθούν μετά την επανεκκίνηση της εφαρμογής.</string>
<string name="crash_reports">Αναφορά σφάλματος</string>
<string name="crash_reports_description">Μπορεί να χρησιμοποιήσουμε τα δεδομένα σας για να βελτιώσουμε την εμπειρία του OMaps. Οι αλλαγές θα ενεργοποιηθούν μετά την επανεκκίνηση της εφαρμογής.</string>
<string name="opt_out_help_ios_1">Η συσκευή σας μπορεί να παρέχει μια ρύθμιση «Περιορισμένη παρακολούθηση διαφημίσεων» ή «Αποκλεισμό διαφημίσεων με βάση το ενδιαφέρον».</string>
<string name="opt_out_help_ios_2">iOS 9 ή υψηλότερο</string>
<string name="opt_out_help_ios_3">Πηγαίνετε στις ρυθμίσεις → Απόρρητο → Διαφήμιση → Ενεργοποιήστε την επιλογή «Περιορισμένη παρακολούθηση διαφημίσεων»</string>
@ -1088,8 +1076,6 @@
<string name="privacy_policy">Πολιτική απορρήτου</string>
<string name="terms_of_use">Όροι χρήσης</string>
<string name="backup_notification_failed">Η αποθήκευση των σελιδοδεικτών έχει διακοπεί. Συνδεθείτε για να το ξανανοίξετε.</string>
<string name="banner_megafon_banner_message">Πείτε αντίο στη διεθνή περιπλάνηση!</string>
<string name="banner_megafon_banner_button">Αντίο!</string>
<string name="button_layer_traffic">Κίνηση</string>
<string name="button_layer_subway">Μετρό</string>
<string name="layers_title">Επίπεδα του χάρτη</string>

View file

@ -1014,16 +1014,6 @@
<string name="traffic_update_app_message">Para mostrar los datos de tráfico, debe actualizar la aplicación.</string>
<!-- "traffic" as in "road congestion" -->
<string name="traffic_data_unavailable">Los datos de tráfico no están disponibles</string>
<string name="banner_deliveryclub_title">Entrega de alimentos</string>
<string name="banner_deliveryclub_message">Entrega rápida de 4000 restaurantes. Haga el pedido en Delivery Club.</string>
<string name="banner_lamoda_title">Tienda online de ropa y calzado</string>
<string name="banner_lamoda_message">Más de 1000 marcas. Descuentos de hasta 70%. Entrega gratuita en todo el territorio nacional.</string>
<string name="banner_tutu_title">Billetes de tren en línea</string>
<string name="banner_tutu_message">Billetes de tren en línea a cualquier ciudad en línea: precios, búsqueda y reservas.</string>
<string name="banner_geerbest_title">Tienda online de electrónica</string>
<string name="banner_geerbest_message">Búsqueda instantánea de más de 50 000 artículos a precios bajos.</string>
<string name="banner_rentalcars_title">Alquiler de coches en línea</string>
<string name="banner_rentalcars_message">800 compañías de alquiler de coches en más de 49 000 localidades.</string>
<!-- december -->
<string name="whatsnew_traffic">Datos del tráfico en 36 países</string>
<!-- december -->
@ -1301,10 +1291,8 @@
<item quantity="other">%d seguimientos</item>
</plurals>
<string name="subtittle_opt_out">Configuraciones de seguimiento</string>
<string name="opt_out_flurry">Estadística</string>
<string name="opt_out_mopub">Publicidad personalizada</string>
<string name="opt_out_fabric">Informe de incidentes</string>
<string name="opt_out_fabric_description">Puede que utilicemos vuestros datos para mejorar la experiencia de OMaps. Los cambios tendrán efecto después que reinicie la aplicación.</string>
<string name="crash_reports">Informe de incidentes</string>
<string name="crash_reports_description">Puede que utilicemos vuestros datos para mejorar la experiencia de OMaps. Los cambios tendrán efecto después que reinicie la aplicación.</string>
<string name="opt_out_help_ios_1">Su dispositivo móvil puede tener una opción de «Limitar el seguimiento de anuncios» o «Excluir anuncios basados en intereses».</string>
<string name="opt_out_help_ios_2">iOS 9 o más reciente</string>
<string name="opt_out_help_ios_3">Diríjase a su Configuración → Privacidad → Publicidad → Habilite la opción «Limitar seguimiento»</string>
@ -1312,8 +1300,6 @@
<string name="privacy_policy">Política de Privacidad</string>
<string name="terms_of_use">Condiciones de uso</string>
<string name="backup_notification_failed">La copia de suguridad de sus marcadores ha sido suspendida. Inicie sesión para volverla a iniciar.</string>
<string name="banner_megafon_banner_message">¡Despídase del roaming internacional!</string>
<string name="banner_megafon_banner_button">¡Adiós!</string>
<string name="button_layer_traffic">Tráfico</string>
<string name="button_layer_subway">Metro</string>
<string name="layers_title">Capas del mapa</string>

View file

@ -968,16 +968,6 @@
<string name="traffic_update_app_message">برای نمایش ترافیک باید اپلیکیشن را بروزرسانی کنید.</string>
<!-- "traffic" as in "road congestion" -->
<string name="traffic_data_unavailable">اطلاعات ترافیکی موجود نیست</string>
<string name="banner_deliveryclub_title">ارسال غذا</string>
<string name="banner_deliveryclub_message">تحویل سریع از 4000 رستوران. سفارش از تحویل باشگاه.</string>
<string name="banner_lamoda_title">فروشگاه آنلاین پوشاک و کفش</string>
<string name="banner_lamoda_message">بیش از 1000 علامت تجاری تا 70٪ تخفیف. تحویل رایگان در سراسر کشور.</string>
<string name="banner_tutu_title">بلیط های قطار آنلاین</string>
<string name="banner_tutu_message">بلیط های قطار به هر شهر آنلاین - قیمت ها، جستجو و رزرو.</string>
<string name="banner_geerbest_title">فروشگاه الکترونیک آنلاین</string>
<string name="banner_geerbest_message">جستجوی سریع در بیش از 50،000 مورد با قیمت پایین.</string>
<string name="banner_rentalcars_title">اجاره اتومبیل ها آنلاین</string>
<string name="banner_rentalcars_message">شرکت کرایه ماشین در بیش از 49،000 مکان اجاره ماشین.</string>
<!-- december -->
<string name="whatsnew_traffic">اطلاعات ترافیکی در 36 کشور</string>
<!-- december -->
@ -1258,10 +1248,8 @@
<item quantity="other">%d رد</item>
</plurals>
<string name="subtittle_opt_out">تنظیمات ردیابی</string>
<string name="opt_out_flurry">آمار</string>
<string name="opt_out_mopub">تبلیغات شخصی‌شده</string>
<string name="opt_out_fabric">گزارش خرابی</string>
<string name="opt_out_fabric_description">ما از داده‌های شما برای بهبود OMaps استفاده می‌کنیم. تغییرات پس از راه‌اندازی مجدد برنامه به‌کار می‌افتد.</string>
<string name="crash_reports">گزارش خرابی</string>
<string name="crash_reports_description">ما از داده‌های شما برای بهبود OMaps استفاده می‌کنیم. تغییرات پس از راه‌اندازی مجدد برنامه به‌کار می‌افتد.</string>
<string name="opt_out_help_ios_1">در دستگاه همراهتان تنظیمی با نام “Limit Ad Tracking” یا “Opt out of interest-based advertising” وجود دارد.</string>
<string name="opt_out_help_ios_2">آی‌اواس ۹ یا بالاتر</string>
<string name="opt_out_help_ios_3">به تنظیمات خود بروید ← حریم خصوصی ← تبلیغات ← گزینه «محدود کردن ردیابی آگهی» را فعال کنید</string>
@ -1269,8 +1257,6 @@
<string name="privacy_policy">سیاست حریم خصوصی</string>
<string name="terms_of_use">شرایط استفاده</string>
<string name="backup_notification_failed">پشتیبانگیری از نشانکهای شما به حالت تعلیق درآمده است وارد شوید تا آن را دوباره روشن کنید</string>
<string name="banner_megafon_banner_message">خداحافظی با رومینگ بین المللی!</string>
<string name="banner_megafon_banner_button">خداحافظ!</string>
<string name="button_layer_traffic">ترافیک</string>
<string name="button_layer_subway">مترو</string>
<string name="layers_title">لایه های نقشه</string>

View file

@ -1014,16 +1014,6 @@
<string name="traffic_update_app_message">Liikennetietojen näyttämiseksi sovellus on päivitettävä.</string>
<!-- "traffic" as in "road congestion" -->
<string name="traffic_data_unavailable">Liikennetietoja ei ole saatavilla</string>
<string name="banner_deliveryclub_title">Ruoan toimitus</string>
<string name="banner_deliveryclub_message">Nopea toimitus 4 000 ravintolasta. Tilaa Delivery Clubilta.</string>
<string name="banner_lamoda_title">Vaate- ja kenkäkauppa verkossa</string>
<string name="banner_lamoda_message">Yli 1 000 merkkiä. Jopa 70 % alea. Ilmainen toimitus kaikkialle maahan.</string>
<string name="banner_tutu_title">Junaliput verkossa</string>
<string name="banner_tutu_message">Junaliput kaikkiin kaupunkeihin verkossa hinnat, haku ja varaus.</string>
<string name="banner_geerbest_title">Elektroniikkaliike verkossa</string>
<string name="banner_geerbest_message">Hae nopeasti yli 50 000 kohteesta edullisin hinnoin.</string>
<string name="banner_rentalcars_title">Autonvuokraus verkossa</string>
<string name="banner_rentalcars_message">800 autonvuokrausyritystä yli 49 000 autonvuokrauskohteessa.</string>
<!-- december -->
<string name="whatsnew_traffic">Liikennetiedot 36 maassa</string>
<!-- december -->
@ -1301,10 +1291,8 @@
<item quantity="other">%d radat</item>
</plurals>
<string name="subtittle_opt_out">Seuranta-asetukset</string>
<string name="opt_out_flurry">Tilasto</string>
<string name="opt_out_mopub">Yksilöity mainonta</string>
<string name="opt_out_fabric">Kaatumisraportti</string>
<string name="opt_out_fabric_description">Me saatamme käyttää tietojasi parantaaksemme OMaps kokemusta. Muutokset alkavat vaikuttamaan kun käynnistät sovelluksen uudestaan.</string>
<string name="crash_reports">Kaatumisraportti</string>
<string name="crash_reports_description">Me saatamme käyttää tietojasi parantaaksemme OMaps kokemusta. Muutokset alkavat vaikuttamaan kun käynnistät sovelluksen uudestaan.</string>
<string name="opt_out_help_ios_1">Mobiililaitteesi saattaa tarjota ”Rajoittettu Mainos Seuranta” tai ”Poistu internet-perusteisesta mainnonnasta” asetuksia.</string>
<string name="opt_out_help_ios_2">iOS 9 tai Korkeampi</string>
<string name="opt_out_help_ios_3">Mene Asetuksiisi → Yksityisyys → Mainonta → Salli ”Rajoita Mainos Seurantaa” asetus</string>
@ -1312,8 +1300,6 @@
<string name="privacy_policy">Yksityisyyskäytäntö</string>
<string name="terms_of_use">Käyttöehdot</string>
<string name="backup_notification_failed">Kirjanmerkkiesi varmuuskopionti on keskeytetty. Kirjaudu sisään ja laita se takaisin päälle.</string>
<string name="banner_megafon_banner_message">Sano hyvästit roaming-datalle!</string>
<string name="banner_megafon_banner_button">Hyvästi!</string>
<string name="button_layer_traffic">Liikenne</string>
<string name="button_layer_subway">Metro</string>
<string name="layers_title">Kartan tasot</string>

View file

@ -1033,16 +1033,6 @@
<string name="traffic_update_app_message">Pour afficher les données de circulation, l\'application doit être actualisée.</string>
<!-- "traffic" as in "road congestion" -->
<string name="traffic_data_unavailable">Les données de circulation ne sont pas disponibles</string>
<string name="banner_deliveryclub_title">Livraison de nourriture</string>
<string name="banner_deliveryclub_message">Livraison rapide de 4 000 restaurants. Commandez via Delivery Club.</string>
<string name="banner_lamoda_title">Boutique de chaussures et de vêtements en ligne</string>
<string name="banner_lamoda_message">Plus de 1.000 marques. Jusqu\'à 70 % de réduction. Livraison gratuite dans tout le pays.</string>
<string name="banner_tutu_title">Billets de train en ligne</string>
<string name="banner_tutu_message">Billets de train vers nimporte quelle ville en ligne - prix, recherche et réservation.</string>
<string name="banner_geerbest_title">Magasin délectronique en ligne</string>
<string name="banner_geerbest_message">Recherche instantanée parmi plus de 50.000 articles à bas prix.</string>
<string name="banner_rentalcars_title">Location de voitures en ligne</string>
<string name="banner_rentalcars_message">800 sociétés de location de voiture dans plus de 49.000 points de location de voiture.</string>
<!-- december -->
<string name="whatsnew_traffic">Données de circulation dans 36 pays</string>
<!-- december -->
@ -1321,10 +1311,8 @@
<item quantity="other">pistes %d</item>
</plurals>
<string name="subtittle_opt_out">Paramètres de suivi</string>
<string name="opt_out_flurry">Statistique</string>
<string name="opt_out_mopub">Publicité personnalisée</string>
<string name="opt_out_fabric">Rapport d\'accident</string>
<string name="opt_out_fabric_description">Nous pouvons utiliser vos données pour améliorer l\'expérience de OMaps. Les modifications prendront effet après le redémarrage de l\'application.</string>
<string name="crash_reports">Rapport d\'accident</string>
<string name="crash_reports_description">Nous pouvons utiliser vos données pour améliorer l\'expérience de OMaps. Les modifications prendront effet après le redémarrage de l\'application.</string>
<string name="opt_out_help_ios_1">Votre appareil mobile peut fournir un paramètre «Limiter le suivi des annonces» ou «Désactiver la publicité ciblée par centres d\'intérêt».</string>
<string name="opt_out_help_ios_2">iOS 9 ou plus récent</string>
<string name="opt_out_help_ios_3">Accédez à vos paramètres → Confidentialité → Publicité → Activer le paramètre «Limiter le suivi des annonces»</string>
@ -1332,8 +1320,6 @@
<string name="privacy_policy">Politique de confidentialité</string>
<string name="terms_of_use">Conditions d\'utilisation</string>
<string name="backup_notification_failed">La sauvegarde de vos favoris a été suspendue. Connectez-vous pour la réactiver.</string>
<string name="banner_megafon_banner_message">Dites adieu à l\'itinérance internationale !</string>
<string name="banner_megafon_banner_button">Au revoir !</string>
<string name="button_layer_traffic">Trafic</string>
<string name="button_layer_subway">Métro</string>
<string name="layers_title">Couches de carte</string>

View file

@ -1021,16 +1021,6 @@
<string name="traffic_update_app_message">A forgalmi adatok megjelenítéséhez frissíteni kell az alkalmazást.</string>
<!-- "traffic" as in "road congestion" -->
<string name="traffic_data_unavailable">Forgalmi adatok nem állnak rendelkezésre</string>
<string name="banner_deliveryclub_title">Ételfutár</string>
<string name="banner_deliveryclub_message">Gyors házhozszállítás 4000 étteremből. Rendelés a Delivery Club-ból.</string>
<string name="banner_lamoda_title">Online ruházati és cipő üzlet</string>
<string name="banner_lamoda_message">Több mint 1000 márka. Akár 70 % kedvezmény. Ingyenes szállítás az ország egész területén.</string>
<string name="banner_tutu_title">Vonatjegy az interneten keresztül</string>
<string name="banner_tutu_message">Vonatjegy interneten minden városba - árak, keresés és foglalás.</string>
<string name="banner_geerbest_title">Internetes elektronikai áruház</string>
<string name="banner_geerbest_message">Több mint 50.000 cikk azonnali keresése alacsony áron.</string>
<string name="banner_rentalcars_title">Autóbérlés az interneten</string>
<string name="banner_rentalcars_message">800 autókölcsönző cég több mint 49.000 autókölcsönzési helyszínen.</string>
<!-- december -->
<string name="whatsnew_traffic">Forgalmi adatok 36 országban</string>
<!-- december -->
@ -1308,10 +1298,8 @@
<item quantity="other">%d út</item>
</plurals>
<string name="subtittle_opt_out">Követési beállítások</string>
<string name="opt_out_flurry">Statisztika</string>
<string name="opt_out_mopub">Személyre szabott reklámok</string>
<string name="opt_out_fabric">Hibajelentés</string>
<string name="opt_out_fabric_description">A OMaps fejlesztéséhez felhasználhatjuk az adatait. A változtatások az alkalmazás újraindítása után lépnek életbe.</string>
<string name="crash_reports">Hibajelentés</string>
<string name="crash_reports_description">A OMaps fejlesztéséhez felhasználhatjuk az adatait. A változtatások az alkalmazás újraindítása után lépnek életbe.</string>
<string name="opt_out_help_ios_1">A mobileszköz „Reklámkövetés korlátozása” vagy „Érdeklődési kör alapú reklámozás” beállítással rendelkezhet.</string>
<string name="opt_out_help_ios_2">iOS 9 vagy újabb</string>
<string name="opt_out_help_ios_3">Nyissa meg a Beállítások → Adatvédelem→ Reklámok→ és engedélyezze a “Reklámkövetés korlátozása” beállítást</string>
@ -1319,8 +1307,6 @@
<string name="privacy_policy">Adatvédelmi irányelvek</string>
<string name="terms_of_use">Felhasználási feltételek</string>
<string name="backup_notification_failed">A könyvjelzői biztonsági mentése felfüggesztésre került. Jelentkezz be a visszakapcsoláshoz.</string>
<string name="banner_megafon_banner_message">Köszönjünk el a nemzetközi roamingdíjaktól!</string>
<string name="banner_megafon_banner_button">Viszlát!</string>
<string name="button_layer_traffic">Forgalom</string>
<string name="button_layer_subway">Metró</string>
<string name="layers_title">Térképrétegek</string>

View file

@ -1013,16 +1013,6 @@
<string name="traffic_update_app_message">Untuk menampilkan data lalu lintas, aplikasi ini harus diperbarui.</string>
<!-- "traffic" as in "road congestion" -->
<string name="traffic_data_unavailable">Data lalu lintas tidak tersedia</string>
<string name="banner_deliveryclub_title">Pengiriman makanan</string>
<string name="banner_deliveryclub_message">Pengiriman cepat dari 4.000 restoran. Pesan dari Delivery Club.</string>
<string name="banner_lamoda_title">Toko pakaian dan sepatu online</string>
<string name="banner_lamoda_message">Lebih dari 1.000 merek. Diskon hingga 70%f. Gratis pengiriman ke seluruh negeri.</string>
<string name="banner_tutu_title">Tiket kereta api online</string>
<string name="banner_tutu_message">Tiket kereta ke setiap kota online - harga, pencarian, dan pemesanan.</string>
<string name="banner_geerbest_title">Toko elektronik online</string>
<string name="banner_geerbest_message">Cari cepat di antara lebih dari 50.000 barang berharga murah.</string>
<string name="banner_rentalcars_title">Penyewaan mobil online</string>
<string name="banner_rentalcars_message">800 perusahaan penyewaan mobil di lebih dari 49.000 lokasi penyewaan mobil.</string>
<!-- december -->
<string name="whatsnew_traffic">Data Lalu Lintas di 36 Negara</string>
<!-- december -->
@ -1300,10 +1290,8 @@
<item quantity="other">trek %d</item>
</plurals>
<string name="subtittle_opt_out">Pengaturan treking</string>
<string name="opt_out_flurry">Statistik</string>
<string name="opt_out_mopub">Iklan yang telah dipersonalisasi</string>
<string name="opt_out_fabric">Laporan tabrakan</string>
<string name="opt_out_fabric_description">Kami dapat menggunakan data Anda untuk meningkatkan pengalaman OMaps. Perubahan akan berlaku setelah Anda memulai ulang aplikasi.</string>
<string name="crash_reports">Laporan tabrakan</string>
<string name="crash_reports_description">Kami dapat menggunakan data Anda untuk meningkatkan pengalaman OMaps. Perubahan akan berlaku setelah Anda memulai ulang aplikasi.</string>
<string name="opt_out_help_ios_1">Perangkat seluler Anda mungkin menyediakan pengaturan \"\"Batasi Treking Iklan\"\" atau \"\"Keluar dari iklan berbasis ketertarikan\"\".</string>
<string name="opt_out_help_ios_2">iOS 9 atau Lebih Tinggi</string>
<string name="opt_out_help_ios_3">Ke Pengaturan → Privasi → Iklan → Aktifkan pengaturan \"\"Batasi Treking Iklan\"\"</string>
@ -1311,8 +1299,6 @@
<string name="privacy_policy">Kebijakan privasi</string>
<string name="terms_of_use">Ketentuan penggunaan</string>
<string name="backup_notification_failed">Mencadangkan bookmark Anda telah dihentikan. Masuk untuk kembali mengaktifkannya.</string>
<string name="banner_megafon_banner_message">Katakan selamat tinggal pada roaming internasional!</string>
<string name="banner_megafon_banner_button">Selamat tinggal!</string>
<string name="button_layer_traffic">Lalu lintas</string>
<string name="button_layer_subway">Kereta bawah tanah</string>
<string name="layers_title">Lapisan peta</string>

View file

@ -1020,16 +1020,6 @@
<string name="traffic_update_app_message">Per visualizzare i dati sul traffico, l\'applicazione deve essere aggiornata.</string>
<!-- "traffic" as in "road congestion" -->
<string name="traffic_data_unavailable">Dati sul traffico non disponibili</string>
<string name="banner_deliveryclub_title">Cibo a domicilio</string>
<string name="banner_deliveryclub_message">Consegna rapida da 4000 ristoranti. Ordina da Delivery Club.</string>
<string name="banner_lamoda_title">Store di abbigliamento e scarpe online</string>
<string name="banner_lamoda_message">Più di 1000 brand. Fino al 70% di sconto. Spedizione gratuita in tutto il Paese.</string>
<string name="banner_tutu_title">Biglietti ferroviari online</string>
<string name="banner_tutu_message">Biglietti ferroviari per qualsiasi città online: prezzi, ricerca e prenotazione.</string>
<string name="banner_geerbest_title">Store di elettronica online</string>
<string name="banner_geerbest_message">Ricerca istantanea fra oltre 50.000 articoli a prezzo scontato.</string>
<string name="banner_rentalcars_title">Autonoleggio online</string>
<string name="banner_rentalcars_message">800 società di autonoleggio in oltre 49.000 località.</string>
<!-- december -->
<string name="whatsnew_traffic">Dati sul traffico in 36 Paesi</string>
<!-- december -->
@ -1307,10 +1297,8 @@
<item quantity="other">%d tracce</item>
</plurals>
<string name="subtittle_opt_out">Impostazioni di tracciamento</string>
<string name="opt_out_flurry">Statistica</string>
<string name="opt_out_mopub">Pubblicità personalizzata</string>
<string name="opt_out_fabric">Rapporto incidenti</string>
<string name="opt_out_fabric_description">Potremmo utilizzare i tuoi dati per migliorare l\'esperienza OMaps. Le modifiche avranno effetto dopo il riavvio dell\'applicazione.</string>
<string name="crash_reports">Rapporto incidenti</string>
<string name="crash_reports_description">Potremmo utilizzare i tuoi dati per migliorare l\'esperienza OMaps. Le modifiche avranno effetto dopo il riavvio dell\'applicazione.</string>
<string name="opt_out_help_ios_1">Il tuo dispositivo mobile potrebbe fornire un\'impostazione «Limita monitoraggio annunci» o «Disattiva la pubblicità mirata».</string>
<string name="opt_out_help_ios_2">iOS 9 o versioni successive</string>
<string name="opt_out_help_ios_3">Vai a Impostazioni → Privacy → Pubblicità → Abilita l\'impostazione «Limita monitoraggio degli annunci»</string>
@ -1318,8 +1306,6 @@
<string name="privacy_policy">Politica sulla riservatezza</string>
<string name="terms_of_use">Condizioni d\'uso</string>
<string name="backup_notification_failed">Il backup dei segnalibri è stato sospeso. Accedi per riaccenderlo.</string>
<string name="banner_megafon_banner_message">Dì addio al roaming internazionale!</string>
<string name="banner_megafon_banner_button">Addio!</string>
<string name="button_layer_traffic">Traffico</string>
<string name="button_layer_subway">Metropolitana</string>
<string name="layers_title">Livelli mappa</string>

View file

@ -1014,16 +1014,6 @@
<string name="traffic_update_app_message">交通データを表示するには、アプリケーションをアップデートする必要があります。</string>
<!-- "traffic" as in "road congestion" -->
<string name="traffic_data_unavailable">交通データは利用できません</string>
<string name="banner_deliveryclub_title">出前・宅配</string>
<string name="banner_deliveryclub_message">4,000 軒のレストランから迅速にお届けします。Delivery Club からご注文ください。</string>
<string name="banner_lamoda_title">衣料品と靴のオンライン店舗</string>
<string name="banner_lamoda_message">1,000 件を超えるブランド。最大 70% オフ。全国無料配送。</string>
<string name="banner_tutu_title">オンライン鉄道チケット</string>
<string name="banner_tutu_message">どんな都市への鉄道チケットもオンラインで。価格を検索して、予約しましょう。</string>
<string name="banner_geerbest_title">オンライン家電量販店</string>
<string name="banner_geerbest_message">低価格で 50,000 件を超えるアイテムを素早く検索。</string>
<string name="banner_rentalcars_title">オンラインでレンタカーを予約</string>
<string name="banner_rentalcars_message">800 社のレンタカー会社による 49,000 カ所を超えるレンタカー店舗をご利用いただけます。</string>
<!-- december -->
<string name="whatsnew_traffic">36か国の交通データ</string>
<!-- december -->
@ -1300,10 +1290,8 @@
<item quantity="other">%dの追跡</item>
</plurals>
<string name="subtittle_opt_out">追跡の設定</string>
<string name="opt_out_flurry">統計</string>
<string name="opt_out_mopub">パーソナライズされた広告</string>
<string name="opt_out_fabric">クラッシュレポート</string>
<string name="opt_out_fabric_description">OMaps体験を向上させるため、お客様のデータを使用する可能性があります。変更は、アプリを再起動した後に、反映されます。</string>
<string name="crash_reports">クラッシュレポート</string>
<string name="crash_reports_description">OMaps体験を向上させるため、お客様のデータを使用する可能性があります。変更は、アプリを再起動した後に、反映されます。</string>
<string name="opt_out_help_ios_1">お使いの携帯端末には、「追跡型広告を制限」または「関心に基づく広告を非表示」の設定があるかもしれません。</string>
<string name="opt_out_help_ios_2">iOS 9以降</string>
<string name="opt_out_help_ios_3">設定→プライバシー→広告に進み、「追跡型広告を制限」を有効にします</string>
@ -1311,8 +1299,6 @@
<string name="privacy_policy">個人情報保護方針</string>
<string name="terms_of_use">ご利用規約</string>
<string name="backup_notification_failed">ブックマークのバックアップが中断されました。ログインして、元に戻します。</string>
<string name="banner_megafon_banner_message">もう国際ローミングにさようなら!</string>
<string name="banner_megafon_banner_button">さようなら!</string>
<string name="button_layer_traffic">交通状況</string>
<string name="button_layer_subway">地下鉄</string>
<string name="layers_title">マップレイヤー</string>

View file

@ -1016,16 +1016,6 @@
<string name="traffic_update_app_message">교통 데이터를 표시하려면 응용 프로그램을 업데이트해야 합니다.</string>
<!-- "traffic" as in "road congestion" -->
<string name="traffic_data_unavailable">교통 데이터를 사용할 수 없습니다</string>
<string name="banner_deliveryclub_title">음식 배달</string>
<string name="banner_deliveryclub_message">4,000곳의 레스토랑에서 신속하게 배달합니다. Delivery Club에서 주문하세요.</string>
<string name="banner_lamoda_title">온라인 의류 및 신발 스토어</string>
<string name="banner_lamoda_message">1,000개 이상의 브랜드. 최대 70% 할인. 전국 무료 배송.</string>
<string name="banner_tutu_title">온라인 기차표</string>
<string name="banner_tutu_message">온라인으로 이용하는 모든 도시행 기차표 - 가격, 검색 및 예약.</string>
<string name="banner_geerbest_title">온라인 전자 기기 스토어</string>
<string name="banner_geerbest_message">저렴한 가격의 50,000개 이상 품목에서 즉시 검색.</string>
<string name="banner_rentalcars_title">온라인 자동차 렌트</string>
<string name="banner_rentalcars_message">800개의 자동차 렌트 회사와 49,000곳 이상의 자동차 렌트 지점</string>
<!-- december -->
<string name="whatsnew_traffic">36개국의 교통 데이터</string>
<!-- december -->
@ -1302,10 +1292,8 @@
<item quantity="other">%d 추적</item>
</plurals>
<string name="subtittle_opt_out">추적 설정</string>
<string name="opt_out_flurry">통계</string>
<string name="opt_out_mopub">개별 광고</string>
<string name="opt_out_fabric">오류 보고서</string>
<string name="opt_out_fabric_description">당사는 OMaps 경험을 개선하기 위해 귀하의 데이터를 활용할 수 있습니다. 앱을 다시 시작한 후 변경사항이 적용됩니다.</string>
<string name="crash_reports">오류 보고서</string>
<string name="crash_reports_description">당사는 OMaps 경험을 개선하기 위해 귀하의 데이터를 활용할 수 있습니다. 앱을 다시 시작한 후 변경사항이 적용됩니다.</string>
<string name="opt_out_help_ios_1">귀하의 모바일 장치는 \"\"광고 추적 제한\"\" 혹은 \"\"관심 기반의 광고의 옵트아웃\"\" 설정을 제공할 수 있습니다.</string>
<string name="opt_out_help_ios_2">iOS 9 혹은 이상</string>
<string name="opt_out_help_ios_3">설정 → 개인정보 → 광고 → “광고 추적 제한” 설정을 활성화합니다.</string>
@ -1313,8 +1301,6 @@
<string name="privacy_policy">개인정보 보호 방침</string>
<string name="terms_of_use">사용 약관</string>
<string name="backup_notification_failed">북마크의 백업이 중단되었습니다. 다시 작동시키려면 로그인하세요.</string>
<string name="banner_megafon_banner_message">국제 로밍이 더 이상 필요 없습니다!</string>
<string name="banner_megafon_banner_button">안녕!</string>
<string name="button_layer_traffic">트래픽</string>
<string name="button_layer_subway">지하철</string>
<string name="layers_title">맵 레이어</string>

View file

@ -1012,16 +1012,6 @@
<string name="traffic_update_app_message">Du må oppdatere applikasjonen for å kunne se trafikkdata.</string>
<!-- "traffic" as in "road congestion" -->
<string name="traffic_data_unavailable">Trafikkdata er ikke tilgjengelig</string>
<string name="banner_deliveryclub_title">Matleveranse</string>
<string name="banner_deliveryclub_message">Hurtig leveranse fra 4000 restauranter. Bestill fra Delivery Club.</string>
<string name="banner_lamoda_title">Kles- og skobutikk online</string>
<string name="banner_lamoda_message">Flere enn 1000 ulike merker. Opptil 70 % rabatt. Gratis frakt over hele landet.</string>
<string name="banner_tutu_title">Togbilletter online</string>
<string name="banner_tutu_message">Togbilletter til alle byer priser, søk og bestilling.</string>
<string name="banner_geerbest_title">Elektronikkbutikk online</string>
<string name="banner_geerbest_message">Hurtigsøk blant over 50 000 varer til lave priser.</string>
<string name="banner_rentalcars_title">Leie av bil online</string>
<string name="banner_rentalcars_message">800 leiebilfirmaer på over 49 000 steder.</string>
<!-- december -->
<string name="whatsnew_traffic">Trafikkdata i 36 land</string>
<!-- december -->

View file

@ -1021,16 +1021,6 @@
<string name="traffic_update_app_message">Om de verkeersgegevens weer te geven, moet de applicatie bijgewerkt worden.</string>
<!-- "traffic" as in "road congestion" -->
<string name="traffic_data_unavailable">Verkeersgegevens zijn niet beschikbaar</string>
<string name="banner_deliveryclub_title">Levering maaltijden</string>
<string name="banner_deliveryclub_message">Snelle levering van 4.000 restaurants. Bestel via Delivery Club.</string>
<string name="banner_lamoda_title">Online kleding- en schoenenwinkel</string>
<string name="banner_lamoda_message">Meer dan 1.000 merken. Tot 70% korting. Gratis levering over het hele land.</string>
<string name="banner_tutu_title">Treintickets online</string>
<string name="banner_tutu_message">Treintickets naar elke staf online - prijzen, zoeken en reserveren.</string>
<string name="banner_geerbest_title">Online elektronicawinkel</string>
<string name="banner_geerbest_message">Onmiddellijk zoeken tussen meer dan 50.000 artikelen aan lage prijzen.</string>
<string name="banner_rentalcars_title">Online auto\'s huren</string>
<string name="banner_rentalcars_message">800 autoverhuurbedrijven in meer dan 49.000 locaties voor autoverhuur.</string>
<!-- december -->
<string name="whatsnew_traffic">Verkeersgegevens in 36 Landen</string>
<!-- december -->
@ -1308,10 +1298,8 @@
<item quantity="other">%d routes</item>
</plurals>
<string name="subtittle_opt_out">Tracking-instellingen</string>
<string name="opt_out_flurry">Statistieken</string>
<string name="opt_out_mopub">Gepersonaliseerde reclame</string>
<string name="opt_out_fabric">Crash rapport</string>
<string name="opt_out_fabric_description">Wij kunnen uw gegevens gebruiken om OMaps te verbeteren. Wijzigingen treden in werking na het opnieuw opstarten van de app.</string>
<string name="crash_reports">Crash rapport</string>
<string name="crash_reports_description">Wij kunnen uw gegevens gebruiken om OMaps te verbeteren. Wijzigingen treden in werking na het opnieuw opstarten van de app.</string>
<string name="opt_out_help_ios_1">Uw mobiele apparaat kan voorzien zijn van een instelling voor „Gelimiteerde advertentie-tracking” of „afmelden voor op interesses gebaseerd adverteren”.</string>
<string name="opt_out_help_ios_2">iOS 9 of hoger</string>
<string name="opt_out_help_ios_3">Ga naar uw Instellingen → Privacy → Advertenties → Inschakelen van de „Gelimiteerde advertentie-tracking” - instelling</string>
@ -1319,8 +1307,6 @@
<string name="privacy_policy">Privacy beleid</string>
<string name="terms_of_use">Gebruiksvoorwaarden</string>
<string name="backup_notification_failed">Een back-up van uw bladwijzers werd opgeschort. Log in om weer op te starten.</string>
<string name="banner_megafon_banner_message">Zeg vaarwel tegen internationale roaming!</string>
<string name="banner_megafon_banner_button">Vaarwel!</string>
<string name="button_layer_traffic">Verkeer</string>
<string name="button_layer_subway">Metro</string>
<string name="layers_title">Map layers</string>

View file

@ -1030,16 +1030,6 @@
<string name="traffic_update_app_message">Aby wyświetlić dane o ruchu, należy zaktualizować aplikację.</string>
<!-- "traffic" as in "road congestion" -->
<string name="traffic_data_unavailable">Dane o ruchu są niedostępne</string>
<string name="banner_deliveryclub_title">Dostawa jedzenia</string>
<string name="banner_deliveryclub_message">Szybka dostawa z 4000 restauracji. Zamawiaj z Delivery Club.</string>
<string name="banner_lamoda_title">Sklep internetowy z odzieżą i obuwiem</string>
<string name="banner_lamoda_message">Ponad 1000 marek. Zniżki do 70%. Bezpłatna dostawa w całym kraju.</string>
<string name="banner_tutu_title">Bilety kolejowe online</string>
<string name="banner_tutu_message">Bilety kolejowe do każdego miasta online - ceny, wyszukiwanie i rezerwacja.</string>
<string name="banner_geerbest_title">Sklep z elektroniką online</string>
<string name="banner_geerbest_message">Natychmiastowe wyszukiwanie ponad 50.000 towarów w niskich cenach.</string>
<string name="banner_rentalcars_title">Wynajem samochodów online</string>
<string name="banner_rentalcars_message">800 wypożyczalni samochodów w ponad 49.000 miejscowościach.</string>
<!-- december -->
<string name="whatsnew_traffic">Dane o ruchu w 36 krajach</string>
<!-- december -->
@ -1318,10 +1308,8 @@
<item quantity="other">%d tras</item>
</plurals>
<string name="subtittle_opt_out">Ustawienia śledzenia</string>
<string name="opt_out_flurry">Statystyka</string>
<string name="opt_out_mopub">Spersonalizowane reklamy</string>
<string name="opt_out_fabric">Raport o błędzie</string>
<string name="opt_out_fabric_description">Możemy używać Twoich danych do usprawnienia działania OMaps. Zmiany zostaną zastosowane po ponownym uruchomieniu aplikacji.</string>
<string name="crash_reports">Raport o błędzie</string>
<string name="crash_reports_description">Możemy używać Twoich danych do usprawnienia działania OMaps. Zmiany zostaną zastosowane po ponownym uruchomieniu aplikacji.</string>
<string name="opt_out_help_ios_1">W Twoim urządzeniu mobilnym może być dostępne ustawienie „Limit Ad Tracking” lub „Opt out of interest-based advertising”.</string>
<string name="opt_out_help_ios_2">iOS 9 lub nowszy</string>
<string name="opt_out_help_ios_3">Przejdź do Ustawień → Prywatność→ Reklamy→ Włącz ustawienie „Limit Ad Tracking”</string>
@ -1329,8 +1317,6 @@
<string name="privacy_policy">Polityka prywatności</string>
<string name="terms_of_use">Warunki użytkowania</string>
<string name="backup_notification_failed">Tworzenie kopii zapasowych Twoich zakładek zostało zawieszone. Zaloguj się, aby włączyć je ponownie.</string>
<string name="banner_megafon_banner_message">Pożegnaj się z międzynarodowym roamingiem!</string>
<string name="banner_megafon_banner_button">Do widzenia!</string>
<string name="button_layer_traffic">Ruch drogowy</string>
<string name="button_layer_subway">Metro</string>
<string name="layers_title">Warstwy map</string>

View file

@ -1024,16 +1024,6 @@
<string name="traffic_update_app_message">Para mostrar os dados de tráfego, a aplicação deve ser atualizada.</string>
<!-- "traffic" as in "road congestion" -->
<string name="traffic_data_unavailable">Não existem dados de tráfego</string>
<string name="banner_deliveryclub_title">Entrega de alimentos</string>
<string name="banner_deliveryclub_message">Entrega rápida de 4.000 restaurantes. Encomente ao Delivery Club.</string>
<string name="banner_lamoda_title">Loja online de vestuário e calçado</string>
<string name="banner_lamoda_message">Mais de 1.000 marcas. Até 70% de desconto. Entrega gratuita em todo o país.</string>
<string name="banner_tutu_title">Bilhetes de comboio online</string>
<string name="banner_tutu_message">Bilhetes de comboio online para qualquer cidade - preços, pesquisa e reserva.</string>
<string name="banner_geerbest_title">Loja de eletrônica online</string>
<string name="banner_geerbest_message">Pesquisa instantânea em mais de 50.000 itens a preços baixos.</string>
<string name="banner_rentalcars_title">Aluguer de carros online</string>
<string name="banner_rentalcars_message">800 empresas de aluguer de automóveis em mais de 49.000 locais de aluguer de automóveis.</string>
<!-- december -->
<string name="whatsnew_traffic">Dados de tráfego em 36 países</string>
<!-- december -->
@ -1311,10 +1301,8 @@
<item quantity="other">%d rastreamentos</item>
</plurals>
<string name="subtittle_opt_out">Configurações de rastreamento</string>
<string name="opt_out_flurry">Estatísticas</string>
<string name="opt_out_mopub">Propaganda personalizada</string>
<string name="opt_out_fabric">Relatório de erros</string>
<string name="opt_out_fabric_description">Podemos utilizar seus dados para melhorar a experiência no OMaps. As mudanças entrarão em vigor após você reiniciar o aplicativo.</string>
<string name="crash_reports">Relatório de erros</string>
<string name="crash_reports_description">Podemos utilizar seus dados para melhorar a experiência no OMaps. As mudanças entrarão em vigor após você reiniciar o aplicativo.</string>
<string name="opt_out_help_ios_1">O seu dispositivo móvel pode fornecer as opções de «Limitar rastreamento de anúncios» ou «Desativar publicidade baseada em interesse».</string>
<string name="opt_out_help_ios_2">iOS 9 ou Superior</string>
<string name="opt_out_help_ios_3">Vá para: Configurações → Privacidade → Anúncios → Habilitar «Limitar Rastreamento de Anúncios»</string>
@ -1322,8 +1310,6 @@
<string name="privacy_policy">Política de privacidade</string>
<string name="terms_of_use">Termos de uso</string>
<string name="backup_notification_failed">O back-up dos seus favoritos foi suspenso. É preciso logar para ligá-lo de volta.</string>
<string name="banner_megafon_banner_message">Diga adeus ao roaming internacional!</string>
<string name="banner_megafon_banner_button">Adeus!</string>
<string name="button_layer_traffic">Tráfego</string>
<string name="button_layer_subway">Metrô</string>
<string name="layers_title">Map Layers</string>

View file

@ -1010,16 +1010,6 @@
<string name="traffic_update_app_message">Pentru a afişa datele privind traficul, aplicația trebuie actualizată.</string>
<!-- "traffic" as in "road congestion" -->
<string name="traffic_data_unavailable">Datele privind traficul nu sunt disponibile</string>
<string name="banner_deliveryclub_title">Livrare mâncare</string>
<string name="banner_deliveryclub_message">Livrare rapidă din 4.000 de restaurante. Comandați de la Delivery Club.</string>
<string name="banner_lamoda_title">Îmbrăcăminte și magazin de pantofi online</string>
<string name="banner_lamoda_message">Peste 1.000 de branduri. Până la 70% reducere. Livrare gratuită în toată țara.</string>
<string name="banner_tutu_title">Bilete de tren online</string>
<string name="banner_tutu_message">Bilete de tren către orice oraș online - prețuri, căutare şi rezervare.</string>
<string name="banner_geerbest_title">Magazin de produse electronice online</string>
<string name="banner_geerbest_message">Căutare instantanee printre peste 50.000 de articole la prețuri mici.</string>
<string name="banner_rentalcars_title">Închiriere mașini online</string>
<string name="banner_rentalcars_message">800 de firme care închiriază mașini în peste 49.000 de locații de închiriere mașini.</string>
<!-- december -->
<string name="whatsnew_traffic">Date privind traficul în 36 de țări</string>
<!-- december -->
@ -1297,10 +1287,8 @@
<item quantity="other">%d bande</item>
</plurals>
<string name="subtittle_opt_out">Setări de servire</string>
<string name="opt_out_flurry">Statisticile</string>
<string name="opt_out_mopub">Publicitate personalizată</string>
<string name="opt_out_fabric">Rapoarte de eroare</string>
<string name="opt_out_fabric_description">Putem folosi datele dvs. pentru a dezvolta și de a îmbunătăți OMaps. Modificările vor intra în vigoare după repornirea aplicației.</string>
<string name="crash_reports">Rapoarte de eroare</string>
<string name="crash_reports_description">Putem folosi datele dvs. pentru a dezvolta și de a îmbunătăți OMaps. Modificările vor intra în vigoare după repornirea aplicației.</string>
<string name="opt_out_help_ios_1">Puteți renunța la primirea de publicitate țintă în setările aparatului.</string>
<string name="opt_out_help_ios_2">iOS 9 sau mai sus</string>
<string name="opt_out_help_ios_3">Deschideți Setări → Confidențialitate → Publicitate → „Activați Limitarea trackking”</string>
@ -1308,8 +1296,6 @@
<string name="privacy_policy">Politica de confidențialitate</string>
<string name="terms_of_use">Termeni de utilizare</string>
<string name="backup_notification_failed">Copierea de rezervă a tag-uri lor a fost suspendată. Conectați-vă pentru a activa copierea de rezervă.</string>
<string name="banner_megafon_banner_message">Spune roamingului internațional hood bai!</string>
<string name="banner_megafon_banner_button">Hood bai!</string>
<string name="button_layer_traffic">Dopuri</string>
<string name="button_layer_subway">Metrou</string>
<string name="layers_title">Straturile hărții</string>

View file

@ -1035,16 +1035,6 @@
<string name="traffic_update_app_message">Для отображения пробок необходимо обновить приложение.</string>
<!-- "traffic" as in "road congestion" -->
<string name="traffic_data_unavailable">Данные о пробках недоступны</string>
<string name="banner_deliveryclub_title">Доставка еды</string>
<string name="banner_deliveryclub_message">Быстрая доставка еды из 4 тысяч ресторанов. Закажите на Delivery Club.</string>
<string name="banner_lamoda_title">Интернет-магазин одежды и обуви</string>
<string name="banner_lamoda_message">Более тысячи брендов. Скидки до 70%. Доставка по всей стране бесплатно.</string>
<string name="banner_tutu_title">Ж/д билеты онлайн</string>
<string name="banner_tutu_message">Ж/д билеты в любой город онлайн цены, поиск и бронирование.</string>
<string name="banner_geerbest_title">Интернет-магазин электроники</string>
<string name="banner_geerbest_message">Мгновенный поиск по более чем 50 тысячам товаров по низким ценам.</string>
<string name="banner_rentalcars_title">Прокат автомобилей онлайн</string>
<string name="banner_rentalcars_message">800 прокатных компаний в более чем 49 тысячах пунктах проката.</string>
<!-- december -->
<string name="whatsnew_traffic">Пробки в 36 странах мира</string>
<!-- december -->
@ -1346,10 +1336,8 @@
<item quantity="other">%d треков</item>
</plurals>
<string name="subtittle_opt_out">Настройки сопровождения</string>
<string name="opt_out_flurry">Статистика</string>
<string name="opt_out_mopub">Персонализированная реклама</string>
<string name="opt_out_fabric">Отчеты об ошибках</string>
<string name="opt_out_fabric_description">Мы можем использовать ваши данные, чтобы развивать и улучшать OMaps. Изменения вступят в силу после перезапуска приложения.</string>
<string name="crash_reports">Отчеты об ошибках</string>
<string name="crash_reports_description">Мы можем использовать ваши данные, чтобы развивать и улучшать OMaps. Изменения вступят в силу после перезапуска приложения.</string>
<string name="opt_out_help_ios_1">Вы можете отказаться от получения целевой рекламы в настройках устройства.</string>
<string name="opt_out_help_ios_2">iOS 9 или выше</string>
<string name="opt_out_help_ios_3">Откройте Настройки → Конфиденциальность → Реклама → Включите «Ограничение трекинга»</string>
@ -1357,8 +1345,6 @@
<string name="privacy_policy">Политика конфиденциальности</string>
<string name="terms_of_use">Условия использования</string>
<string name="backup_notification_failed">Резервное копирование меток было приостановлено. Войдите, чтобы включить резервное копирование.</string>
<string name="banner_megafon_banner_message">Скажи международному роумингу гудбай!</string>
<string name="banner_megafon_banner_button">Гудбай!</string>
<string name="button_layer_traffic">Пробки</string>
<string name="button_layer_subway">Метро</string>
<string name="layers_title">Слои карты</string>

View file

@ -1018,16 +1018,6 @@
<string name="traffic_update_app_message">Ak chcete zobraziť dopravné informácie, musíte si aktualizovať aplikáciu.</string>
<!-- "traffic" as in "road congestion" -->
<string name="traffic_data_unavailable">Dopravné informácie nie sú k dispozícii</string>
<string name="banner_deliveryclub_title">Donáška jedla</string>
<string name="banner_deliveryclub_message">Rýchle dodanie zo 4 000 reštaurácií. Objednávky od spoločnosti Delivery Club.</string>
<string name="banner_lamoda_title">Online obchod s odevmi a obuvou</string>
<string name="banner_lamoda_message">Viac ako 1 000 značiek. Zľavy až 70%. Doručenie zdarma po celej krajine.</string>
<string name="banner_tutu_title">Lístky na vlak online</string>
<string name="banner_tutu_message">Lístky vlak do ktoréhokoľvek mesta online - ceny, vyhľadávanie a rezervácia.</string>
<string name="banner_geerbest_title">Online predajňa elektroniky</string>
<string name="banner_geerbest_message">Okamžité vyhľadávanie vo viac ako 50 000 druhoch tovaru za nízke ceny.</string>
<string name="banner_rentalcars_title">Prenájom auta online</string>
<string name="banner_rentalcars_message">800 spoločností prenajímajúcich vozidlá vo viac ako 49 000 prevádzkach.</string>
<!-- december -->
<string name="whatsnew_traffic">Dopravné informácie v 36 krajinách</string>
<!-- december -->
@ -1306,10 +1296,8 @@
<item quantity="other">%d sledovania</item>
</plurals>
<string name="subtittle_opt_out">Nastavenie sledovania</string>
<string name="opt_out_flurry">Štatistika</string>
<string name="opt_out_mopub">Personalizovaná reklama</string>
<string name="opt_out_fabric">Hlásenie chýb</string>
<string name="opt_out_fabric_description">Vaše údaje môžeme použiť na zlepšenie skúseností s programom OMaps. Zmeny sa prejavia po reštartovaní aplikácie.</string>
<string name="crash_reports">Hlásenie chýb</string>
<string name="crash_reports_description">Vaše údaje môžeme použiť na zlepšenie skúseností s programom OMaps. Zmeny sa prejavia po reštartovaní aplikácie.</string>
<string name="opt_out_help_ios_1">Vaše mobilné zariadenie môže poskytnúť nastavenie „Obmedziť reklamné sledovanie“ alebo „Zrušiť inzerciu založenú na záujmoch“.</string>
<string name="opt_out_help_ios_2">iOS 9 alebo vyšší</string>
<string name="opt_out_help_ios_3">Prejdite do nastavenia → Ochrana osobných údajov → Reklama → Povolenie nastavenia „Obmedziť reklamné sledovanie“</string>
@ -1317,8 +1305,6 @@
<string name="privacy_policy">Zásady ochrany osobných údajov</string>
<string name="terms_of_use">Podmienky používania</string>
<string name="backup_notification_failed">Zálohovanie záložiek bolo pozastavené. Pre opätovné zapnutie sa prihláste.</string>
<string name="banner_megafon_banner_message">Rozlúčte sa s medzinárodným roamingom!</string>
<string name="banner_megafon_banner_button">Zbohom!</string>
<string name="button_layer_traffic">Vyťaženie</string>
<string name="button_layer_subway">Metro</string>
<string name="layers_title">Vrstvy mapy</string>

View file

@ -1020,16 +1020,6 @@
<string name="traffic_update_app_message">Applikationen måste uppdateras för att trafikdata ska kunna visas.</string>
<!-- "traffic" as in "road congestion" -->
<string name="traffic_data_unavailable">Trafikdata är inte tillgänglig</string>
<string name="banner_deliveryclub_title">Matleverans</string>
<string name="banner_deliveryclub_message">Snabbleverans från 4000 restauranger. Beställ från Delivery Club.</string>
<string name="banner_lamoda_title">Kläd- och skobutik online</string>
<string name="banner_lamoda_message">Över 1000 varumärken. Upp till 70 % i rabatt. Gratis leverans över hela landet.</string>
<string name="banner_tutu_title">Tågbiljetter online</string>
<string name="banner_tutu_message">Tågbiljetter till vilken stad som helst online - priser, sökning och bokning.</string>
<string name="banner_geerbest_title">Elektronisk onlinebutik</string>
<string name="banner_geerbest_message">Snabbsökning i över 50000 föremål till låga priser.</string>
<string name="banner_rentalcars_title">Biluthyrning online</string>
<string name="banner_rentalcars_message">800 biluthyrningsföretag på mer än 49000 biluthyrningsplatser.</string>
<!-- december -->
<string name="whatsnew_traffic">Trafikdata i 36 länder</string>
<!-- december -->
@ -1307,10 +1297,8 @@
<item quantity="other">%d spår</item>
</plurals>
<string name="subtittle_opt_out">Spårningsinställningar</string>
<string name="opt_out_flurry">Statistik</string>
<string name="opt_out_mopub">Personlig annonsering</string>
<string name="opt_out_fabric">Olycksrapport</string>
<string name="opt_out_fabric_description">Vi kan komma att använda din data för att förbättra OMaps upplevelsen. Ändringarna kommer träda i kraft när du startar om appen.</string>
<string name="crash_reports">Olycksrapport</string>
<string name="crash_reports_description">Vi kan komma att använda din data för att förbättra OMaps upplevelsen. Ändringarna kommer träda i kraft när du startar om appen.</string>
<string name="opt_out_help_ios_1">Din mobila enhet kan tillhandahålla en ”Begränsad annonsspårning” eller ”Välj bort intressebaserad annonsering” inställning.</string>
<string name="opt_out_help_ios_2">iOS 9 eller nyare</string>
<string name="opt_out_help_ios_3">Gå till Inställningar → Integritet → Annonsering → Tillåt inställningen ”Begränsad annonsspårning”</string>
@ -1318,8 +1306,6 @@
<string name="privacy_policy">Integritetspolicy</string>
<string name="terms_of_use">Allmänna villkor</string>
<string name="backup_notification_failed">Säkerhetskopiering av dina bokmärken har avbrutits. Logga in för att starta det igen.</string>
<string name="banner_megafon_banner_message">Säg farväl till internationell roaming!</string>
<string name="banner_megafon_banner_button">Hej då!</string>
<string name="button_layer_traffic">Trafik</string>
<string name="button_layer_subway">Tunnelbana</string>
<string name="layers_title">Kartlager</string>

View file

@ -1026,16 +1026,6 @@
<string name="traffic_update_app_message">ในการแสดงข้อมูลการจราจร แอปพลิเคชั่นจะต้องอัปเดตก่อน</string>
<!-- "traffic" as in "road congestion" -->
<string name="traffic_data_unavailable">ไม่มีข้อมูลการจราจร</string>
<string name="banner_deliveryclub_title">อาหารส่งถึงที่</string>
<string name="banner_deliveryclub_message">อาหารส่งถึงที่จาก 4,000 ร้าน สั่งจาก Delivery Club.</string>
<string name="banner_lamoda_title">ร้านค้าเสื้อผ้าและรองเท้าออนไลน์</string>
<string name="banner_lamoda_message">กว่า 1,000 ยี่ห้อ ลดถึง 70% จัดส่งฟรีทั่วประเทศ</string>
<string name="banner_tutu_title">ตั๋วรถไฟออนไลน์</string>
<string name="banner_tutu_message">ตั๋วรถไฟออนไลน์ไปทุกเมือง - ราคา การค้นหา และการจอง</string>
<string name="banner_geerbest_title">ร้านอุปกรณ์อิเล็กทรอนิกส์ออนไลน์</string>
<string name="banner_geerbest_message">การค้นหาทันทีในกว่า 50,000 รายการในราคาที่ต่ำ</string>
<string name="banner_rentalcars_title">การเช่ารถออนไลน์</string>
<string name="banner_rentalcars_message">800 บริษัทเช่ารถในสถานเช่ารถมากกว่า 49,000 แห่ง</string>
<!-- december -->
<string name="whatsnew_traffic">ข้อมูลการจราจรใน 36 ประเทศ</string>
<!-- december -->
@ -1312,10 +1302,8 @@
<item quantity="other">%d ติดตามต่าง ๆ</item>
</plurals>
<string name="subtittle_opt_out">การตั้งค่าการติดตาม</string>
<string name="opt_out_flurry">สถิติ</string>
<string name="opt_out_mopub">การโฆษณาในแบบของคุณ</string>
<string name="opt_out_fabric">รายงานข้อขัดข้อง</string>
<string name="opt_out_fabric_description">เราอาจใช้ข้อมูลของคุณเพื่อพัฒนาประสบการณ์ของ OMaps การเปลี่ยนแปลงจะมีผลหลังจากที่คุณเปิดแอพฯ ขึ้นใหม่</string>
<string name="crash_reports">รายงานข้อขัดข้อง</string>
<string name="crash_reports_description">เราอาจใช้ข้อมูลของคุณเพื่อพัฒนาประสบการณ์ของ OMaps การเปลี่ยนแปลงจะมีผลหลังจากที่คุณเปิดแอพฯ ขึ้นใหม่</string>
<string name="opt_out_help_ios_1">อุปกรณ์มือถือของคุณอาจมีการตั้งค่า \"\"จำกัดการติดตามโฆษณา\"\" หรือ \"\"เลือกไม่ใช้การโฆษณาตามความสนใจ\"\"</string>
<string name="opt_out_help_ios_2">iOS 9 หรือสูงกว่า</string>
<string name="opt_out_help_ios_3">ไปที่การตั้งค่าของคุณ → ความเป็นส่วนตัว → การโฆษณา → เปิดใช้งานการตั้งค่า “จำกัดการติดตามโฆษณา”</string>
@ -1323,8 +1311,6 @@
<string name="privacy_policy">นโยบายความเป็นส่วนตัว</string>
<string name="terms_of_use">ข้อกำหนดในการใช้งาน</string>
<string name="backup_notification_failed">การเก็บสำรองบุ๊กมาร์กของคุณได้ถูกระงับ เข้าสู่ระบบเพื่อเปิดใช้งานอีกครั้ง</string>
<string name="banner_megafon_banner_message">บอกลาบริการโรมมิ่งระหว่างประเทศ!</string>
<string name="banner_megafon_banner_button">ลาก่อน!</string>
<string name="button_layer_traffic">การจราจร</string>
<string name="button_layer_subway">รถไฟใต้ดิน</string>
<string name="layers_title">ชั้นแผนที่</string>

View file

@ -1026,16 +1026,6 @@
<string name="traffic_update_app_message">Trafik verilerini görüntülemek için uygulamanın güncellenmesi gerekiyor.</string>
<!-- "traffic" as in "road congestion" -->
<string name="traffic_data_unavailable">Trafik verileri kullanılamıyor</string>
<string name="banner_deliveryclub_title">Gıda teslimatı</string>
<string name="banner_deliveryclub_message">4.000\'den fazla restorandan hızlı teslimat. Siparişinizi Delivery Club ile verin.</string>
<string name="banner_lamoda_title">Çevrimiçi giyim ve ayakkabı mağazası</string>
<string name="banner_lamoda_message">1.000\'den fazla marka. %70\'e varan indirimler. Ülkenin her yerine ücretsiz teslimat.</string>
<string name="banner_tutu_title">Çevrimiçi tren biletleri</string>
<string name="banner_tutu_message">Tüm şehirler için çevrimiçi tren biletleri - fiyat bilgileri, arama yapma ve rezervasyon.</string>
<string name="banner_geerbest_title">Çevrimiçi elektronik mağazası</string>
<string name="banner_geerbest_message">En uygun fiyatlarla 50.000\'den fazla ürün için hızlı arama yapın.</string>
<string name="banner_rentalcars_title">Çevrimiçi araba kiralama</string>
<string name="banner_rentalcars_message">49.000\'den fazla araç kiralama bölgesinde yer alan 800 araç kiralama şirketi.</string>
<!-- december -->
<string name="whatsnew_traffic">36 Ülkeden Trafik Verileri</string>
<!-- december -->
@ -1312,10 +1302,8 @@
<item quantity="other">%d izleme</item>
</plurals>
<string name="subtittle_opt_out">İzleme ayarları</string>
<string name="opt_out_flurry">İstatistik</string>
<string name="opt_out_mopub">Kişiye özel reklamcılık</string>
<string name="opt_out_fabric">Kilitlenme raporu</string>
<string name="opt_out_fabric_description">OMaps deneyimini geliştirmek için verilerinizi kullanabiliriz. Değişiklikler, uygulama yeniden başlatıldıktan sonra geçerli olur.</string>
<string name="crash_reports">Kilitlenme raporu</string>
<string name="crash_reports_description">OMaps deneyimini geliştirmek için verilerinizi kullanabiliriz. Değişiklikler, uygulama yeniden başlatıldıktan sonra geçerli olur.</string>
<string name="opt_out_help_ios_1">Mobil cihazınız, “Reklam İzlemeyi Sınırla” veya “İlgiye dayalı reklamcılığı devre dışı bırak” ayarı sunar.</string>
<string name="opt_out_help_ios_2">iOS 9 veya Üstü</string>
<string name="opt_out_help_ios_3">Ayarlar → Gizlilik → Reklamcılık\'a gidin ve “Reklam İzlemeyi Sınırla” ayarını etkinleştirin</string>
@ -1323,8 +1311,6 @@
<string name="privacy_policy">Gizlilik politikası</string>
<string name="terms_of_use">Kullanım koşulları</string>
<string name="backup_notification_failed">Yer imlerinizin yedeklenmesi işlemi askıya alındı. İşlemi devam ettirmek için oturum açın.</string>
<string name="banner_megafon_banner_message">Uluslararası dolaşıma güle güle deyin!</string>
<string name="banner_megafon_banner_button">Güle güle!</string>
<string name="button_layer_traffic">Trafik</string>
<string name="button_layer_subway">Metro</string>
<string name="layers_title">Harita katmanları</string>

View file

@ -1025,16 +1025,6 @@
<string name="traffic_update_app_message">Для відображення даних про трафік оновіть додаток.</string>
<!-- "traffic" as in "road congestion" -->
<string name="traffic_data_unavailable">Дані про трафік недоступні</string>
<string name="banner_deliveryclub_title">Доставка їжі</string>
<string name="banner_deliveryclub_message">Швидка доставка з 4000 ресторанів. Замовляйте з Delivery Club.</string>
<string name="banner_lamoda_title">Онлайн-магазини одягу та взуття</string>
<string name="banner_lamoda_message">Понад 1000 брендів. Знижки до 70%. Безкоштовна доставка по всій країні.</string>
<string name="banner_tutu_title">Онлайн-замовлення залізничних квитків</string>
<string name="banner_tutu_message">Онлайн-пошук і замовлення квитків на поїзд до будь-якого міста.</string>
<string name="banner_geerbest_title">Онлайн-магазин електроніки</string>
<string name="banner_geerbest_message">Миттєвий пошук по більш ніж 50 000 виробів за зниженими цінами.</string>
<string name="banner_rentalcars_title">Онлайн-оренда автомобілів</string>
<string name="banner_rentalcars_message">800 компаній з прокату автомобілів та понад 49 000 агентів.</string>
<!-- december -->
<string name="whatsnew_traffic">Дані про трафік у 36 країнах</string>
<!-- december -->
@ -1313,10 +1303,8 @@
<item quantity="other">%d треків</item>
</plurals>
<string name="subtittle_opt_out">Налаштування супроводу</string>
<string name="opt_out_flurry">Статистика</string>
<string name="opt_out_mopub">Персоналізована реклама</string>
<string name="opt_out_fabric">Звіти про помилки</string>
<string name="opt_out_fabric_description">Ми можемо використовувати ваші дані, щоб розвивати та покращувати OMaps. Зміни вступлять у силу після перезапуску програми</string>
<string name="crash_reports">Звіти про помилки</string>
<string name="crash_reports_description">Ми можемо використовувати ваші дані, щоб розвивати та покращувати OMaps. Зміни вступлять у силу після перезапуску програми</string>
<string name="opt_out_help_ios_1">Ви можете відмовитися від отримання цільової реклами в налаштуваннях пристрою.</string>
<string name="opt_out_help_ios_2">iOS 9 або вище</string>
<string name="opt_out_help_ios_3">Відкрийте Налаштування → Конфіденційність → Реклама → Увімкніть «Обмеження трекінгу»</string>
@ -1324,8 +1312,6 @@
<string name="privacy_policy">Політика конфіденційності</string>
<string name="terms_of_use">Умови використання</string>
<string name="backup_notification_failed">Резервне копіювання позначок було призупинено. Увійдіть, щоб увімкнути резервне копіювання.</string>
<string name="banner_megafon_banner_message">Скажи міжнародному роумінгу гудбай!</string>
<string name="banner_megafon_banner_button">Гудбай!</string>
<string name="button_layer_traffic">Затор</string>
<string name="button_layer_subway">Метрополітен</string>
<string name="layers_title">Зображення карти</string>

View file

@ -1014,16 +1014,6 @@
<string name="traffic_update_app_message">Để hiển thị dữ liệu giao thông, ứng dụng cần phải được cập nhật.</string>
<!-- "traffic" as in "road congestion" -->
<string name="traffic_data_unavailable">Dữ liệu giao thông không khả dụng</string>
<string name="banner_deliveryclub_title">Giao thực phẩm</string>
<string name="banner_deliveryclub_message">Giao hàng nhanh từ 4.000 nhà hàng. Đặt hàng từ Delivery Club.</string>
<string name="banner_lamoda_title">Cửa hàng quần áo và giầy dép trực tuyến</string>
<string name="banner_lamoda_message">Hơn 1.000 nhãn hiệu. Giảm đến 70%. Giao hàng miễn phí toàn quốc.</string>
<string name="banner_tutu_title">Vé tàu trực tuyến</string>
<string name="banner_tutu_message">Mua vé tàu trực tuyến đến bất kỳ thành phố nào - giá cả, tìm kiếm và đặt vé.</string>
<string name="banner_geerbest_title">Cửa hàng điện tử trực tuyến</string>
<string name="banner_geerbest_message">Tìm kiếm nhanh hơn 50.000 sản phẩm ở mức giá thấp.</string>
<string name="banner_rentalcars_title">Thuê ô tô trực tuyến</string>
<string name="banner_rentalcars_message">800 công ty thuê ô tô ở hơn 49.000 địa điểm thuê ô tô.</string>
<!-- december -->
<string name="whatsnew_traffic">Dữ liệu Giao thông tại 36 Quốc gia</string>
<!-- december -->
@ -1297,10 +1287,8 @@
<item quantity="other">%d các chặn đường</item>
</plurals>
<string name="subtittle_opt_out">Thiết lập theo dõi</string>
<string name="opt_out_flurry">Thống kê</string>
<string name="opt_out_mopub">Quảng cáo được cá nhân hóa</string>
<string name="opt_out_fabric">Báo cáo sự cố</string>
<string name="opt_out_fabric_description">Chúng tôi có thể sử dụng dữ liệu của bạn để cải thiện trải nghiệm trên OMaps. Thay đổi sẽ có hiệu lực sau khi bạn khởi động lại ứng dụng.</string>
<string name="crash_reports">Báo cáo sự cố</string>
<string name="crash_reports_description">Chúng tôi có thể sử dụng dữ liệu của bạn để cải thiện trải nghiệm trên OMaps. Thay đổi sẽ có hiệu lực sau khi bạn khởi động lại ứng dụng.</string>
<string name="opt_out_help_ios_1">Thiết bị di động của bạn có thể cung cấp cài đặt \"\"Giới hạn theo dõi quảng cáo\"\" hoặc \"\"Chọn không tham gia quảng cáo dựa trên sở thích\"\".</string>
<string name="opt_out_help_ios_2">iOS 9 hoặc lớn hơn</string>
<string name="opt_out_help_ios_3">Đến Cài đặt → Bảo mật → Quảng cáo → Bật cài đặt \"\"Giới hạn theo dõi quảng cáo\"\"</string>
@ -1308,8 +1296,6 @@
<string name="privacy_policy">Chính sách bảo mật</string>
<string name="terms_of_use">Điều khoảng sử dụng</string>
<string name="backup_notification_failed">Sao lưu dấu trang của bạn đã bị tạm ngưng. Đăng nhập để bật lại.</string>
<string name="banner_megafon_banner_message">Nói lời tạm biệt với chuyển vùng quốc tế!</string>
<string name="banner_megafon_banner_button">Tạm biệt!</string>
<string name="button_layer_traffic">Giao thông</string>
<string name="button_layer_subway">Xe điện ngầm</string>
<string name="layers_title">Các lớp bản đồ</string>

View file

@ -1024,16 +1024,6 @@
<string name="traffic_update_app_message">若要顯示交通資訊,必須更新應用程式。</string>
<!-- "traffic" as in "road congestion" -->
<string name="traffic_data_unavailable">無法使用交通資訊</string>
<string name="banner_deliveryclub_title">送餐</string>
<string name="banner_deliveryclub_message">4,000 家餐廳的快速外送。向 Delivery Club 訂餐。</string>
<string name="banner_lamoda_title">線上服飾與鞋店</string>
<string name="banner_lamoda_message">超過 1,000 個品牌。最低三折起。全國免運費。</string>
<string name="banner_tutu_title">線上火車票</string>
<string name="banner_tutu_message">線上訂購前往任何城市的火車票 - 瞭解價格、搜尋並預訂。</string>
<string name="banner_geerbest_title">線上電器行</string>
<string name="banner_geerbest_message">立即搜尋超過 50,000 樣低價品項。</string>
<string name="banner_rentalcars_title">線上租車</string>
<string name="banner_rentalcars_message">營運 49,000 多個租車地點的 800 家租車公司。</string>
<!-- december -->
<string name="whatsnew_traffic">36 個國家的交通資料</string>
<!-- december -->
@ -1309,10 +1299,8 @@
<item quantity="other">%d 軌跡</item>
</plurals>
<string name="subtittle_opt_out">跟蹤設置</string>
<string name="opt_out_flurry">統計</string>
<string name="opt_out_mopub">個性化廣告</string>
<string name="opt_out_fabric">錯誤報告</string>
<string name="opt_out_fabric_description">我們可以使用您的數據來開發和改進OMaps。更改將再重新啟動應用程序后生效。</string>
<string name="crash_reports">錯誤報告</string>
<string name="crash_reports_description">我們可以使用您的數據來開發和改進OMaps。更改將再重新啟動應用程序后生效。</string>
<string name="opt_out_help_ios_1">您可以選擇停止在設備設置中接受定向廣告。</string>
<string name="opt_out_help_ios_2">iOS 9或更高版本</string>
<string name="opt_out_help_ios_3">請打開設置 → 隱私 → 廣告 → 啟用“跟蹤限制”</string>
@ -1320,8 +1308,6 @@
<string name="privacy_policy">隱私政策</string>
<string name="terms_of_use">使用條款</string>
<string name="backup_notification_failed">標籤的備份已暫停。請登錄以啟用設備。</string>
<string name="banner_megafon_banner_message">請向國際漫遊說再見!</string>
<string name="banner_megafon_banner_button">Goodbye</string>
<string name="button_layer_traffic">堵塞</string>
<string name="button_layer_subway">地鐵</string>
<string name="layers_title">地圖圖層</string>

View file

@ -1020,16 +1020,6 @@
<string name="traffic_update_app_message">要显示交通数据,必须更新应用。</string>
<!-- "traffic" as in "road congestion" -->
<string name="traffic_data_unavailable">交通数据不可用</string>
<string name="banner_deliveryclub_title">送餐</string>
<string name="banner_deliveryclub_message">4,000 家餐厅的快速送餐。从 Delivery Club 订餐。</string>
<string name="banner_lamoda_title">在线服装和鞋店</string>
<string name="banner_lamoda_message">超过 1,000 个品牌。最低三折起。全国免费派送。</string>
<string name="banner_tutu_title">在线火车票</string>
<string name="banner_tutu_message">在线购买前往任何城市的火车票 - 价格、搜索和预订。</string>
<string name="banner_geerbest_title">在线电子产品商店</string>
<string name="banner_geerbest_message">立即搜索价格超低的 50,000 余种商品。</string>
<string name="banner_rentalcars_title">在线租车</string>
<string name="banner_rentalcars_message">800 家租车公司,超过 49,000 个租车网点。</string>
<!-- december -->
<string name="whatsnew_traffic">36 个国家/地区的交通数据</string>
<!-- december -->
@ -1305,10 +1295,8 @@
<item quantity="other">%d 跟踪</item>
</plurals>
<string name="subtittle_opt_out">支持设置</string>
<string name="opt_out_flurry">统计</string>
<string name="opt_out_mopub">个性化广告</string>
<string name="opt_out_fabric">错误报告</string>
<string name="opt_out_fabric_description">我们可以使用您的数据来开发和改进OMaps.更改将在重新启动应用程序后生效。</string>
<string name="crash_reports">错误报告</string>
<string name="crash_reports_description">我们可以使用您的数据来开发和改进OMaps.更改将在重新启动应用程序后生效。</string>
<string name="opt_out_help_ios_1">您可以选择停止在设备设置中接收定位广告。</string>
<string name="opt_out_help_ios_2">iOS 9或更高版本</string>
<string name="opt_out_help_ios_3">打开设置→隐私→广告→启用“跟踪限制”</string>
@ -1316,8 +1304,6 @@
<string name="privacy_policy">隐私政策</string>
<string name="terms_of_use">使用条款</string>
<string name="backup_notification_failed">标签备份已暂停。登录以启用备份。</string>
<string name="banner_megafon_banner_message">请对Goodbye国际漫游说</string>
<string name="banner_megafon_banner_button">Goodbye</string>
<string name="button_layer_traffic">堵塞</string>
<string name="button_layer_subway">地铁</string>
<string name="layers_title">地图图层</string>

View file

@ -153,8 +153,6 @@
<!-- Search -->
<color name="search_star_dimmed">#1F000000</color>
<color name="search_local_ads_customer_result">@color/bg_banner_color</color>
<color name="search_local_ads_customer_result_night">@color/bg_banner_color_night</color>
<!-- What's new -->
<color name="news_marker_active">#8A000000</color>
@ -180,23 +178,6 @@
<color name="tint_brand_lonely_planet">#004990</color>
<color name="tint_brand_lonely_planet_night">#B3FFFFFF</color>
<!-- Banner colors -->
<color name="bg_banner_color">#F2F5D4</color>
<color name="bg_banner_color_night">#A5A6A8</color>
<color name="bg_search_category_banner_color_night">#525252</color>
<color name="text_banner_color">#28000000</color>
<color name="text_banner_color_night">#28FFFFFF</color>
<color name="text_ads_color">#FFFFFBF2</color>
<color name="text_ads_color_night">#FFFFFBF2</color>
<color name="text_search_category_ad_color_night">#383C40</color>
<color name="megafon_button">@color/bg_brand_partner19</color>
<color name="megafon_button_pressed">@color/bg_brand_partner19_pressed</color>
<color name="red_cross_background">#FFE53935</color>
<color name="bg_banner_action_button">#73AC6A</color>
<color name="bg_banner_action_button_pressed">#54814D</color>
<color name="bg_banner_action_button_night">#597380</color>
<color name="bg_banner_action_button_pressed_night">#36505C</color>
<!-- Rating colors -->
<color name="rating_excellent">#43A047</color>
<color name="rating_good">#7CB342</color>

View file

@ -200,18 +200,6 @@
<!-- Facilities-->
<dimen name="placepage_facilities_item">32dp</dimen>
<!-- Banner-->
<dimen name="placepage_banner_small_height">66dp</dimen>
<dimen name="placepage_banner_large_height">108dp</dimen>
<dimen name="placepage_banner_icon_size">40dp</dimen>
<dimen name="placepage_banner_button_height">@dimen/primary_button_min_height</dimen>
<dimen name="placepage_banner_button_margin_top">5dp</dimen>
<dimen name="placepage_banner_small_action_corner">20dp</dimen>
<dimen name="placepage_banner_remove_button_size">14dp</dimen>
<dimen name="placepage_banner_open_touch_slop">50dp</dimen>
<dimen name="downloader_partner_button_min_height">28dp</dimen>
<dimen name="downloader_partner_button_corner_radius">@dimen/downloader_partner_button_min_height</dimen>
<!-- Place page taxi-->
<dimen name="placepage_taxi_button_min_width">96dp</dimen>
<dimen name="placepage_taxi_padding_vert">14dp</dimen>

View file

@ -79,10 +79,8 @@
<string name="search_hotel_filter" translatable="false">search_hotel_filter_%s</string>
<string name="pref_subtittle_opt_out" translatable="false">pref_subtittle_opt_out</string>
<string name="pref_opt_out_fabric" translatable="false">pref_opt_out_fabric</string>
<string name="pref_opt_out_fabric_activated" translatable="false">pref_opt_out_fabric_activated</string>
<string name="pref_opt_out_flurry" translatable="false">pref_opt_out_flurry</string>
<string name="pref_subtittle_opt_out" translatable="false">pref_opt_out</string>
<string name="pref_crash_reports" translatable="false">pref_crash_reports</string>
<string name="never_enum_value" translatable="false">NEVER</string>
<string name="always_enum_value" translatable="false">ALWAYS</string>
<string name="auto_enum_value" translatable="false">AUTO</string>

View file

@ -1040,16 +1040,6 @@
<string name="traffic_update_app_message">To display traffic data, the application must be updated.</string>
<!-- "traffic" as in "road congestion" -->
<string name="traffic_data_unavailable">Traffic data is not available</string>
<string name="banner_deliveryclub_title">Food delivery</string>
<string name="banner_deliveryclub_message">Fast delivery from 4,000 restaurants. Order from Delivery Club.</string>
<string name="banner_lamoda_title">Online clothing and shoe store</string>
<string name="banner_lamoda_message">More than 1,000 brands. Up to 70% off. Free delivery all over the country.</string>
<string name="banner_tutu_title">Train tickets online</string>
<string name="banner_tutu_message">Train tickets to any city online - prices, search, and booking.</string>
<string name="banner_geerbest_title">Online electronics store</string>
<string name="banner_geerbest_message">Instant search in over 50,000 items at low prices.</string>
<string name="banner_rentalcars_title">Renting cars online</string>
<string name="banner_rentalcars_message">800 car rental companies in more than 49,000 car rental locations.</string>
<!-- december -->
<string name="whatsnew_traffic">Traffic Data in 36 Countries</string>
<!-- december -->
@ -1348,12 +1338,8 @@
<item quantity="other">%d tracks</item>
</plurals>
<string name="subtittle_opt_out">Tracking settings</string>
<string name="opt_out_flurry">Statistic</string>
<string name="opt_out_mopub">Personalised advertising</string>
<string name="opt_out_fabric">Crash report</string>
<string name="opt_out_fabric_description">We may use your data to improve OMaps experience. Changes will take effect after you restart the app.</string>
<string name="opt_out_pushwoosh">Pushwoosh</string>
<string name="opt_out_appsflyer">Appsflyer</string>
<string name="crash_reports">Crash report</string>
<string name="crash_reports_description">We may use your data to improve OMaps experience. Changes will take effect after you restart the app.</string>
<string name="opt_out_help_ios_1">Your mobile device may provide a “Limit Ad Tracking” or “Opt out of interest-based advertising” setting.</string>
<string name="opt_out_help_ios_2">iOS 9 or Higher</string>
<string name="opt_out_help_ios_3">Go to your Settings → Privacy → Advertising → Enable the “Limit Ad Tracking” setting</string>
@ -1361,8 +1347,6 @@
<string name="privacy_policy">Privacy policy</string>
<string name="terms_of_use">Terms of use</string>
<string name="backup_notification_failed">Backing up your bookmarks has been suspended. Log in to turn it back on.</string>
<string name="banner_megafon_banner_message">Say goodbye to international roaming!</string>
<string name="banner_megafon_banner_button">Goodbye!</string>
<string name="button_layer_traffic">Traffic</string>
<string name="button_layer_subway">Subway</string>
<string name="layers_title">Map layers</string>

View file

@ -184,12 +184,6 @@
<item name="android:textSize">@dimen/text_size_body_3</item>
</style>
<style name="MwmTextAppearance.Banner" parent="MwmTextAppearance.Body4">
<item name="android:textSize">@dimen/text_size_banner</item>
<item name="android:textAllCaps">true</item>
<item name="android:textColor">?bannerText</item>
</style>
<style name="MwmTextAppearance.Tab" parent="MwmTextAppearance.Body3">
<item name="android:textAllCaps">true</item>
<item name="android:textColor">@color/white_secondary</item>

View file

@ -53,23 +53,11 @@
<attr name="routingButtonHint" format="color" />
<attr name="routingButtonPressedHint" format="color" />
<attr name="routingButtonActivatedHint" format="color" />
<attr name="bannerText" format="color" />
<attr name="bannerBackground" format="reference" />
<attr name="searchCategoryBannerBackground" format="reference" />
<attr name="bannerButtonBackground" format="reference" />
<attr name="bannerButtonBackgroundColor" format="color" />
<attr name="adsBackground" format="reference" />
<attr name="adsText" format="color" />
<attr name="adsActionBackground" format="reference" />
<attr name="searchCategoryAdsActionBackground" format="reference" />
<attr name="searchCategoryAdsActionTextColor" format="reference" />
<attr name="textBannerTitle" format="color" />
<attr name="steadyIconTint" format="color" />
<attr name="steadyIconBackground" format="reference" />
<attr name="activeIconTint" format="color" />
<attr name="activeIconBackground" format="reference" />
<attr name="warmGray" format="color" />
<attr name="localAdSearchResBackground" format="color" />
<attr name="tagBackground" format="reference" />
<attr name="sponsoredGalleryMore" format="reference" />
<attr name="luggageLogo" format="reference" />

View file

@ -92,18 +92,6 @@
<item name="ppPositive">@drawable/ic_positive_review</item>
<item name="ppNegative">@drawable/ic_negative_review</item>
<item name="bannerText">@color/text_banner_color</item>
<item name="bannerBackground">@drawable/bg_pp_banner</item>
<item name="searchCategoryBannerBackground">@drawable/bg_pp_banner</item>
<item name="bannerButtonBackground">@drawable/bg_pp_banner_large_button</item>
<item name="bannerButtonBackgroundColor">@color/black_12</item>
<item name="adsBackground">@drawable/bg_ads</item>
<item name="adsText">@color/text_ads_color</item>
<item name="adsActionBackground">@drawable/bg_ads_action</item>
<item name="searchCategoryAdsActionBackground">@drawable/bg_search_category_ad_action</item>
<item name="searchCategoryAdsActionTextColor">@color/black_50</item>
<item name="textBannerTitle">@color/black_secondary</item>
<item name="steadyIconTint">@color/black_secondary</item>
<item name="steadyIconBackground">@drawable/bg_steady_icon</item>
<item name="activeIconTint">@color/bg_cards</item>
@ -111,7 +99,6 @@
<item name="warmGray">@color/warm_gray</item>
<item name="localAdSearchResBackground">@color/search_local_ads_customer_result</item>
<item name="preferenceTheme">@style/PreferenceThemeOverlay.v14.Material</item>
<item name="tagBackground">@drawable/bg_tag</item>
@ -305,18 +292,6 @@
<item name="ppPositive">@drawable/ic_positive_review_night</item>
<item name="ppNegative">@drawable/ic_negative_review_night</item>
<item name="bannerText">@color/text_banner_color_night</item>
<item name="bannerBackground">@drawable/bg_pp_banner_night</item>
<item name="searchCategoryBannerBackground">@drawable/bg_search_category_banner_night</item>
<item name="bannerButtonBackground">@drawable/bg_pp_banner_large_button_night</item>
<item name="bannerButtonBackgroundColor">@color/white_12</item>
<item name="adsBackground">@drawable/bg_ads_night</item>
<item name="adsText">@color/text_ads_color_night</item>
<item name="adsActionBackground">@drawable/bg_ads_action_night</item>
<item name="searchCategoryAdsActionBackground">@drawable/bg_search_category_ad_action_night</item>
<item name="searchCategoryAdsActionTextColor">@color/text_search_category_ad_color_night</item>
<item name="textBannerTitle">@color/bg_primary_night</item>
<item name="steadyIconTint">@color/white_secondary</item>
<item name="steadyIconBackground">@drawable/bg_steady_icon_night</item>
<item name="activeIconTint">@color/bg_cards_night</item>
@ -324,8 +299,6 @@
<item name="warmGray">@color/warm_gray_night</item>
<item name="localAdSearchResBackground">@color/search_local_ads_customer_result_night</item>
<item name="tagBackground">@drawable/bg_tag_night</item>
<item name="sponsoredGalleryMore">@drawable/ic_sponsored_gallery_more_night</item>

View file

@ -72,17 +72,6 @@
android:title="@string/maps_storage"
android:summary="@string/maps_storage_summary"
android:order="8"/>
<SwitchPreferenceCompat
android:key="@string/pref_send_statistics"
android:title="@string/allow_statistics"
android:summary="@string/allow_statistics_hint"
android:order="9"/>
<SwitchPreferenceCompat
android:key="@string/pref_play_services"
android:title="Google Play Services"
android:summary="@string/pref_use_google_play"
android:defaultValue="true"
android:order="10"/>
<SwitchPreferenceCompat
android:key="@string/pref_enable_logging"
android:title="@string/enable_logging"
@ -173,10 +162,33 @@
</intent>
</PreferenceScreen>
</androidx.preference.PreferenceCategory>
<androidx.preference.PreferenceCategory
android:key="@string/pref_subtittle_opt_out"
android:title="@string/subtittle_opt_out"
android:order="6">
<SwitchPreferenceCompat
android:key="@string/pref_play_services"
android:title="Google Play Services"
android:summary="@string/pref_use_google_play"
android:defaultValue="true"
android:order="1"/>
<SwitchPreferenceCompat
android:key="@string/pref_crash_reports"
android:defaultValue="true"
android:title="@string/crash_reports"
android:summary="@string/crash_reports_description"
android:order="2">
</SwitchPreferenceCompat>
<SwitchPreferenceCompat
android:key="@string/pref_send_statistics"
android:title="@string/allow_statistics"
android:summary="@string/allow_statistics_hint"
android:order="3"/>
</androidx.preference.PreferenceCategory>
<androidx.preference.PreferenceCategory
android:key="@string/pref_information"
android:title="@string/prefs_group_information"
android:order="6">
android:order="7">
<Preference
android:key="@string/pref_help"
android:title="@string/help"
@ -188,15 +200,4 @@
android:fragment="com.mapswithme.maps.settings.AboutFragment"
android:order="2"/>
</androidx.preference.PreferenceCategory>
<androidx.preference.PreferenceCategory
android:key="@string/pref_subtittle_opt_out"
android:title="@string/subtittle_opt_out"
android:order="7">
<SwitchPreferenceCompat
android:key="@string/pref_opt_out_fabric_activated"
android:defaultValue="true"
android:title="@string/opt_out_fabric"
android:summary="@string/opt_out_fabric_description">
</SwitchPreferenceCompat>
</androidx.preference.PreferenceCategory>
</androidx.preference.PreferenceScreen>

View file

@ -10,8 +10,6 @@ import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.annotation.Size;
import androidx.annotation.UiThread;
import com.mapswithme.maps.ads.Banner;
import com.mapswithme.maps.ads.LocalAdInfo;
import com.mapswithme.maps.api.ParsedRoutingData;
import com.mapswithme.maps.api.ParsedSearchRequest;
import com.mapswithme.maps.api.ParsedUrlMwmRequest;
@ -21,7 +19,6 @@ import com.mapswithme.maps.background.NotificationCandidate;
import com.mapswithme.maps.bookmarks.data.DistanceAndAzimut;
import com.mapswithme.maps.bookmarks.data.FeatureId;
import com.mapswithme.maps.bookmarks.data.MapObject;
import com.mapswithme.maps.downloader.DownloaderPromoBanner;
import com.mapswithme.maps.gdpr.UserBindingListener;
import com.mapswithme.maps.location.LocationHelper;
import com.mapswithme.maps.routing.RouteMarkData;
@ -203,20 +200,6 @@ public class Framework
return Bitmap.createBitmap(altitudeChartBits, width, height, Bitmap.Config.ARGB_8888);
}
public static void logLocalAdsEvent(@NonNull LocalAdsEventType type,
@NonNull MapObject mapObject)
{
LocalAdInfo info = mapObject.getLocalAdInfo();
if (info == null || (!info.isCustomer() && !info.isHidden()))
return;
Location location = LocationHelper.INSTANCE.getLastKnownLocation();
double lat = location != null ? location.getLatitude() : 0;
double lon = location != null ? location.getLongitude() : 0;
int accuracy = location != null ? (int) location.getAccuracy() : 0;
nativeLogLocalAdsEvent(type.ordinal(), lat, lon, accuracy);
}
@FilterUtils.RatingDef
public static int getFilterRating(@Nullable String ratingString)
{
@ -236,11 +219,6 @@ public class Framework
return FilterUtils.RATING_ANY;
}
public static void disableAdProvider(@NonNull Banner.Type type)
{
nativeDisableAdProvider(type.ordinal(), Banner.Place.DEFAULT.ordinal());
}
public static void setSpeedCamerasMode(@NonNull SettingsPrefsFragment.SpeedCameraMode mode)
{
nativeSetSpeedCamManagerMode(mode.ordinal());
@ -483,8 +461,6 @@ public class Framework
public static native void nativeSaveRoutePoints();
public static native void nativeDeleteSavedRoutePoints();
public static native Banner[] nativeGetSearchBanners();
public static native void nativeAuthenticateUser(@NonNull String socialToken,
@AuthTokenType int socialTokenType,
boolean privacyAccepted,
@ -506,22 +482,6 @@ public class Framework
private static native int nativeGetFilterRating(float rawRating);
@NonNull
public static native String nativeMoPubInitializationBannerId();
@Nullable
public static native DownloaderPromoBanner nativeGetDownloaderPromoBanner(@NonNull String mwmId);
public static native boolean nativeHasMegafonCategoryBanner();
@NonNull
public static native String nativeGetMegafonCategoryBannerUrl();
public static native boolean nativeHasCitymobilCategoryBanner();
@NonNull
public static native String nativeGetCitymobilCategoryBannerUrl();
public static native void nativeMakeCrash();
public static native void nativeStartPurchaseTransaction(@NonNull String serverId,

View file

@ -570,7 +570,7 @@ public class MwmActivity extends BaseMwmFragmentActivity
setContentView(R.layout.activity_map);
mPlacePageController = PlacePageFactory.createCompositePlacePageController(
this, this, this, this);
this, this, this);
mPlacePageController.initialize(this);
mPlacePageController.onActivityCreated(this, savedInstanceState);

View file

@ -9,7 +9,6 @@ import android.webkit.WebView;
import androidx.annotation.NonNull;
import androidx.multidex.MultiDex;
import com.appsflyer.AppsFlyerLib;
import com.mapswithme.maps.analytics.ExternalLibrariesMediator;
import com.mapswithme.maps.background.AppBackgroundTracker;
import com.mapswithme.maps.background.NotificationChannelFactory;
@ -154,8 +153,6 @@ public class MwmApplication extends Application implements AppBackgroundTracker.
getLogger().d(TAG, "Application is created");
mMainLoopHandler = new Handler(getMainLooper());
mMediator = new ExternalLibrariesMediator(this);
mMediator.initSensitiveDataToleranceLibraries();
mMediator.initSensitiveDataStrictLibrariesAsync();
Statistics.INSTANCE.initialize(this);
ConnectionState.INSTANCE.initialize(this);
CrashlyticsUtils.INSTANCE.initialize(this);
@ -205,8 +202,6 @@ public class MwmApplication extends Application implements AppBackgroundTracker.
if (mPlatformInitialized)
return;
final boolean isInstallationIdFound = mMediator.setInstallationIdToCrashlytics();
final String settingsPath = StorageUtils.getSettingsPath();
getLogger().d(TAG, "onCreate(), setting path = " + settingsPath);
final String filesPath = StorageUtils.getFilesPath(this);
@ -229,9 +224,6 @@ public class MwmApplication extends Application implements AppBackgroundTracker.
Config.setStatisticsEnabled(SharedPropertiesUtils.isStatisticsEnabled(this));
if (!isInstallationIdFound)
mMediator.setInstallationIdToCrashlytics();
mBackgroundTracker.addListener(mBackgroundListener);
Editor.init(this);
UGC.init(this);
@ -304,20 +296,6 @@ public class MwmApplication extends Application implements AppBackgroundTracker.
System.loadLibrary("mapswithme");
}
@SuppressWarnings("unused")
void sendAppsFlyerTags(@NonNull String tag, @NonNull KeyValue[] params)
{
HashMap<String, Object> paramsMap = new HashMap<>();
for (KeyValue p : params)
paramsMap.put(p.getKey(), p.getValue());
AppsFlyerLib.getInstance().trackEvent(this, tag, paramsMap);
}
public void sendPushWooshTags(String tag, String[] values)
{
getMediator().getEventLogger().sendTags(tag, values);
}
@NonNull
public ExternalLibrariesMediator getMediator()
{

View file

@ -13,7 +13,6 @@ import androidx.appcompat.app.AlertDialog;
import androidx.appcompat.app.AppCompatActivity;
import androidx.fragment.app.DialogFragment;
import androidx.fragment.app.FragmentManager;
import com.mapswithme.maps.ads.Banner;
import com.mapswithme.maps.analytics.AdvertisingObserver;
import com.mapswithme.maps.analytics.ExternalLibrariesMediator;
import com.mapswithme.maps.base.BaseActivity;
@ -24,7 +23,6 @@ import com.mapswithme.maps.editor.ViralFragment;
import com.mapswithme.maps.location.LocationHelper;
import com.mapswithme.maps.news.OnboardingStep;
import com.mapswithme.maps.onboarding.BaseNewsFragment;
import com.mapswithme.maps.onboarding.NewsFragment;
import com.mapswithme.maps.onboarding.WelcomeDialogFragment;
import com.mapswithme.maps.permissions.PermissionsDialogFragment;
import com.mapswithme.maps.permissions.StoragePermissionsDialogFragment;
@ -57,7 +55,6 @@ public class SplashActivity extends AppCompatActivity
private boolean mPermissionsGranted;
private boolean mNeedStoragePermission;
private boolean mCanceled;
private boolean mWaitForAdvertisingInfo;
@NonNull
private final Runnable mUserAgreementDelayedTask = new Runnable()
@ -109,33 +106,9 @@ public class SplashActivity extends AppCompatActivity
return;
}
ExternalLibrariesMediator mediator = MwmApplication.from(getApplicationContext()).getMediator();
if (!mediator.isAdvertisingInfoObtained())
{
LOGGER.i(TAG, "Advertising info not obtained yet, wait...");
mWaitForAdvertisingInfo = true;
return;
}
mWaitForAdvertisingInfo = false;
if (!mediator.isLimitAdTrackingEnabled())
{
LOGGER.i(TAG, "Limit ad tracking disabled, sensitive tracking initialized");
mediator.initSensitiveData();
}
else
{
LOGGER.i(TAG, "Limit ad tracking enabled, sensitive tracking not initialized");
}
init();
LOGGER.i(TAG, "Core initialized: " + app.arePlatformAndCoreInitialized());
if (app.arePlatformAndCoreInitialized() && mediator.isLimitAdTrackingEnabled())
{
LOGGER.i(TAG, "Limit ad tracking enabled, rb banners disabled.");
mediator.disableAdProvider(Banner.Type.TYPE_RB);
}
// Run delayed task because resumeDialogs() must see the actual value of mCanceled flag,
// since onPause() callback can be blocked because of UI thread is busy with framework
@ -157,8 +130,6 @@ public class SplashActivity extends AppCompatActivity
@NonNull
private final BaseActivityDelegate mBaseDelegate = new BaseActivityDelegate(this);
@NonNull
private final AdvertisingInfoObserver mAdvertisingObserver = new AdvertisingInfoObserver();
@Nullable
private OnboardingStep mCurrentOnboardingStep;
@ -247,10 +218,6 @@ public class SplashActivity extends AppCompatActivity
{
super.onStart();
mBaseDelegate.onStart();
mAdvertisingObserver.attach(this);
ExternalLibrariesMediator mediator = MwmApplication.from(this).getMediator();
LOGGER.d(TAG, "Add advertising observer");
mediator.addAdvertisingObserver(mAdvertisingObserver);
}
@Override
@ -354,10 +321,7 @@ public class SplashActivity extends AppCompatActivity
{
super.onStop();
mBaseDelegate.onStop();
mAdvertisingObserver.detach();
ExternalLibrariesMediator mediator = MwmApplication.from(this).getMediator();
LOGGER.d(TAG, "Remove advertising observer");
mediator.removeAdvertisingObserver(mAdvertisingObserver);
}
@Override
@ -548,44 +512,4 @@ public class SplashActivity extends AppCompatActivity
throw new IllegalArgumentException("Attempt to apply unsupported theme: " + theme);
}
boolean isWaitForAdvertisingInfo()
{
return mWaitForAdvertisingInfo;
}
private static class AdvertisingInfoObserver implements AdvertisingObserver,
Detachable<SplashActivity>
{
@Nullable
private SplashActivity mActivity;
@Override
public void onAdvertisingInfoObtained()
{
LOGGER.i(TAG, "Advertising info obtained");
if (mActivity == null)
return;
if (!mActivity.isWaitForAdvertisingInfo())
{
LOGGER.i(TAG, "Advertising info not waited");
return;
}
mActivity.runInitCoreTask();
}
@Override
public void attach(@NonNull SplashActivity object)
{
mActivity = object;
}
@Override
public void detach()
{
mActivity = null;
}
}
}

View file

@ -1,87 +0,0 @@
package com.mapswithme.maps.ads;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import com.mopub.nativeads.BaseNativeAd;
import com.mopub.nativeads.StaticNativeAd;
public abstract class AdDataAdapter<T extends BaseNativeAd>
{
@NonNull
private final T mAd;
protected AdDataAdapter(@NonNull T ad)
{
mAd = ad;
}
@NonNull
protected T getAd()
{
return mAd;
}
@Nullable
public abstract String getTitle();
@Nullable
public abstract String getText();
@Nullable
public abstract String getIconImageUrl();
@Nullable
public abstract String getCallToAction();
@Nullable
public abstract String getPrivacyInfoUrl();
@NonNull
public abstract NetworkType getType();
public static class StaticAd extends AdDataAdapter<StaticNativeAd>
{
public StaticAd(@NonNull StaticNativeAd ad)
{
super(ad);
}
@Nullable
@Override
public String getTitle()
{
return getAd().getTitle();
}
@Nullable
@Override
public String getText()
{
return getAd().getText();
}
@Nullable
@Override
public String getIconImageUrl()
{
return getAd().getIconImageUrl();
}
@Nullable
@Override
public String getCallToAction()
{
return getAd().getCallToAction();
}
@Nullable
@Override
public String getPrivacyInfoUrl()
{
return getAd().getPrivacyInformationIconClickThroughUrl();
}
@NonNull
@Override
public NetworkType getType()
{
return NetworkType.MOPUB;
}
}
}

View file

@ -1,12 +0,0 @@
package com.mapswithme.maps.ads;
import androidx.annotation.NonNull;
import android.view.View;
import com.mopub.nativeads.BaseNativeAd;
public interface AdRegistrator
{
void registerView(@NonNull BaseNativeAd ad, @NonNull View view);
void unregisterView(@NonNull BaseNativeAd ad, @NonNull View view);
}

View file

@ -1,16 +0,0 @@
package com.mapswithme.maps.ads;
import androidx.annotation.NonNull;
/**
* Represents a interface to track an ad visibility on the screen.
* As result, object of this class can conclude whether a tracked ad has a good impression indicator,
* i.e. has been shown enough time for user, or not.
*/
public interface AdTracker
{
void onViewShown(@NonNull String provider, @NonNull String bannerId);
void onViewHidden(@NonNull String provider, @NonNull String bannerId);
void onContentObtained(@NonNull String provider, @NonNull String bannerId);
boolean isImpressionGood(@NonNull String provider, @NonNull String bannerId);
}

View file

@ -48,12 +48,6 @@ public final class Banner implements Parcelable
{
switch (Type.values()[mType])
{
case TYPE_RB:
return Providers.MY_TARGET;
case TYPE_MOPUB:
return Providers.MOPUB;
case TYPE_GOOGLE:
return Providers.GOOGLE;
default:
throw new AssertionError("Unsupported banner type: " + mType);
}
@ -108,10 +102,7 @@ public final class Banner implements Parcelable
public enum Type
{
TYPE_NONE,
TYPE_RB,
TYPE_MOPUB,
TYPE_GOOGLE
TYPE_NONE
}
public enum Place

View file

@ -1,63 +0,0 @@
package com.mapswithme.maps.ads;
import androidx.annotation.NonNull;
import android.view.View;
import com.mapswithme.maps.R;
import com.mapswithme.util.UiUtils;
import com.mapswithme.util.log.Logger;
import com.mapswithme.util.log.LoggerFactory;
abstract class BaseMwmNativeAd implements MwmNativeAd
{
private static final Logger LOGGER = LoggerFactory.INSTANCE.getLogger(LoggerFactory.Type.MISC);
private static final String TAG = BaseMwmNativeAd.class.getSimpleName();
@Override
public void registerView(@NonNull View view)
{
View largeAction = view.findViewById(R.id.tv__action_large);
if (UiUtils.isVisible(largeAction))
{
LOGGER.d(TAG, "Register the large action button for '" + getBannerId() + "'");
register(largeAction);
return;
}
View smallAction = view.findViewById(R.id.tv__action_small);
if (UiUtils.isVisible(smallAction))
{
LOGGER.d(TAG, "Register the small action button for '" + getBannerId() + "'");
register(smallAction);
}
}
@Override
public void unregisterView(@NonNull View bannerView)
{
View largeAction = bannerView.findViewById(R.id.tv__action_large);
if (UiUtils.isVisible(largeAction))
{
LOGGER.d(TAG, "Unregister the large action button for '" + getBannerId() + "'");
unregister(largeAction);
return;
}
View smallAction = bannerView.findViewById(R.id.tv__action_small);
if (UiUtils.isVisible(smallAction))
{
LOGGER.d(TAG, "Unregister the small action button for '" + getBannerId() + "'");
unregister(smallAction);
}
}
abstract void register(@NonNull View view);
abstract void unregister(@NonNull View view);
@Override
public String toString()
{
return "Ad title: " + getTitle();
}
}

View file

@ -1,29 +0,0 @@
package com.mapswithme.maps.ads;
import androidx.annotation.CallSuper;
import androidx.annotation.Nullable;
abstract class BaseNativeAdLoader implements NativeAdLoader
{
@Nullable
private NativeAdListener mAdListener;
@Override
public void setAdListener(@Nullable NativeAdListener adListener)
{
mAdListener = adListener;
}
@Nullable
NativeAdListener getAdListener()
{
return mAdListener;
}
@CallSuper
@Override
public void cancel()
{
setAdListener(null);
}
}

View file

@ -1,22 +0,0 @@
package com.mapswithme.maps.ads;
import androidx.annotation.NonNull;
public abstract class CachedMwmNativeAd extends BaseMwmNativeAd
{
private final long mLoadedTime;
CachedMwmNativeAd(long loadedTime)
{
mLoadedTime = loadedTime;
}
long getLoadedTime()
{
return mLoadedTime;
}
abstract void detachAdListener();
abstract void attachAdListener(@NonNull Object listener);
}

View file

@ -1,202 +0,0 @@
package com.mapswithme.maps.ads;
import android.content.Context;
import android.os.SystemClock;
import androidx.annotation.CallSuper;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import com.mapswithme.util.log.Logger;
import com.mapswithme.util.log.LoggerFactory;
import net.jcip.annotations.NotThreadSafe;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;
@NotThreadSafe
abstract class CachingNativeAdLoader extends BaseNativeAdLoader
{
private static final Logger LOGGER = LoggerFactory.INSTANCE.getLogger(LoggerFactory.Type.MISC);
private static final String TAG = CachingNativeAdLoader.class.getSimpleName();
private static final long REQUEST_INTERVAL_MS = 5 * 1000;
private static final Map<BannerKey, CachedMwmNativeAd> CACHE = new HashMap<>();
private static final Set<BannerKey> PENDING_REQUESTS = new HashSet<>();
@Nullable
private final AdTracker mTracker;
@Nullable
private final OnAdCacheModifiedListener mCacheListener;
CachingNativeAdLoader(@Nullable AdTracker tracker, @Nullable OnAdCacheModifiedListener listener)
{
mTracker = tracker;
mCacheListener = listener;
}
/**
* Loads an ad for a specified banner id. If there is a cached ad, the caller will be notified
* immediately through {@link NativeAdListener#onAdLoaded(MwmNativeAd)}.
* Otherwise, the caller will be notified once an ad is loaded through the mentioned method.
*
* <br><br><b>Important note: </b> if there is a cached ad for the requested banner id, and that ad
* has a good impression indicator, and there is at least {@link #REQUEST_INTERVAL_MS} between the
* first time that ad was requested and the current time the new ad will be loaded.
*
*/
@Override
@CallSuper
public void loadAd(@NonNull Context context, @NonNull String bannerId)
{
LOGGER.d(TAG, "Load the ad for a banner id '" + bannerId + "'");
final BannerKey key = new BannerKey(getProvider(), bannerId);
CachedMwmNativeAd cachedAd = getAdByIdFromCache(key);
if (cachedAd == null)
{
LOGGER.d(TAG, "There is no an ad in a cache");
loadAdInternally(context, bannerId);
return;
}
if (isImpressionGood(cachedAd) && canBeReloaded(cachedAd))
{
LOGGER.d(TAG, "A new ad will be loaded because the previous one has a good impression");
loadAdInternally(context, bannerId);
}
if (getAdListener() != null)
{
LOGGER.d(TAG, "A cached ad '" + cachedAd.getTitle() + "' is set immediately");
getAdListener().onAdLoaded(cachedAd);
}
}
@CallSuper
@Override
public void cancel()
{
super.cancel();
PENDING_REQUESTS.clear();
}
private boolean isImpressionGood(@NonNull CachedMwmNativeAd ad)
{
return mTracker != null && mTracker.isImpressionGood(ad.getProvider(), ad.getBannerId());
}
private static boolean canBeReloaded(@NonNull CachedMwmNativeAd ad)
{
return SystemClock.elapsedRealtime() - ad.getLoadedTime() >= REQUEST_INTERVAL_MS;
}
private void loadAdInternally(@NonNull Context context, @NonNull String bannerId)
{
if (isAdLoading(bannerId))
{
LOGGER.d(TAG, "The ad request for banner id '" + bannerId + "' hasn't been completed yet.");
return;
}
loadAdFromProvider(context, bannerId);
PENDING_REQUESTS.add(new BannerKey(getProvider(), bannerId));
}
abstract void loadAdFromProvider(@NonNull Context context, @NonNull String bannerId);
/**
* Returns a provider name for this ad.
*/
@NonNull
abstract String getProvider();
void onError(@NonNull String bannerId, @NonNull String provider, @NonNull NativeAdError error)
{
PENDING_REQUESTS.remove(new BannerKey(getProvider(), bannerId));
if (getAdListener() != null)
getAdListener().onError(bannerId, provider, error);
}
void onAdLoaded(@NonNull String bannerId, @NonNull CachedMwmNativeAd ad)
{
BannerKey key = new BannerKey(getProvider(), bannerId);
LOGGER.d(TAG, "A new ad for id '" + key + "' is loaded, title = " + ad.getTitle());
PENDING_REQUESTS.remove(key);
boolean isCacheWasEmpty = isCacheEmptyForId(key);
LOGGER.d(TAG, "Put the ad '" + ad.getTitle() + "' to cache, isCacheWasEmpty = " + isCacheWasEmpty);
putInCache(key, ad);
if (isCacheWasEmpty && getAdListener() != null)
getAdListener().onAdLoaded(ad);
}
void onAdClicked(@NonNull String bannerId)
{
if (getAdListener() != null)
{
MwmNativeAd nativeAd = getAdByIdFromCache(new BannerKey(getProvider(), bannerId));
if (nativeAd == null)
throw new AssertionError("A native ad must be presented in a cache when it's clicked!");
getAdListener().onClick(nativeAd);
}
}
/**
* Indicates whether the ad is loading right now or not.
*
* @param bannerId A banner id that an ad is loading for.
* @return true if an ad is loading, otherwise - false.
*/
public boolean isAdLoading(@NonNull String bannerId)
{
return PENDING_REQUESTS.contains(new BannerKey(getProvider(), bannerId));
}
private void putInCache(@NonNull BannerKey key, @NonNull CachedMwmNativeAd value)
{
CACHE.put(key, value);
if (mCacheListener != null)
mCacheListener.onPut(key);
}
private void removeFromCache(@NonNull BannerKey key, @NonNull CachedMwmNativeAd value)
{
CACHE.remove(key);
if (mCacheListener != null)
mCacheListener.onRemoved(key);
}
@Nullable
private CachedMwmNativeAd getAdByIdFromCache(@NonNull BannerKey key)
{
return CACHE.get(key);
}
private boolean isCacheEmptyForId(@NonNull BannerKey key)
{
return getAdByIdFromCache(key) == null;
}
@CallSuper
@Override
public void detach()
{
for (CachedMwmNativeAd ad : CACHE.values())
ad.detachAdListener();
}
@CallSuper
@Override
public void attach()
{
for (CachedMwmNativeAd ad : CACHE.values())
{
if (ad.getProvider().equals(getProvider()))
ad.attachAdListener(this);
}
}
}

View file

@ -1,224 +0,0 @@
package com.mapswithme.maps.ads;
import android.annotation.SuppressLint;
import android.content.Context;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import android.text.TextUtils;
import com.mapswithme.util.concurrency.UiThread;
import com.mapswithme.util.log.Logger;
import com.mapswithme.util.log.LoggerFactory;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
/**
* Represents a native loader that provides interface to load a few banners simultaneously, i.e.
* concurrently. This loader makes a decision about which native ad should be posted to the listener
* based on obtained results. If all native ads for requested banners are obtained, the native ad
* with the highest priority will be post. Now, MyTarget banner has a high priority. If there is no
* MyTarget banner in the requested banner list, the first obtained native ad will be posted
* immediately. Otherwise, this loader will try to obtain/wait for MyTarget native ad even if another
* provider already give theirs ads.
*
*/
public class CompoundNativeAdLoader extends BaseNativeAdLoader implements NativeAdListener
{
private static final Logger LOGGER = LoggerFactory.INSTANCE.getLogger(LoggerFactory.Type.MISC);
private static final String TAG = CompoundNativeAdLoader.class.getSimpleName();
private static final int TIMEOUT_MS = 5000;
@NonNull
private final List<NativeAdLoader> mLoaders = new ArrayList<>();
@Nullable
private final OnAdCacheModifiedListener mCacheListener;
@Nullable
private final AdTracker mAdTracker;
@NonNull
private final Set<String> mFailedProviders = new HashSet<>();
@Nullable
private Runnable mDelayedNotification;
/**
* Indicates about whether the composite loading can be considered as completed or not.
*/
private boolean mLoadingCompleted;
CompoundNativeAdLoader(@Nullable OnAdCacheModifiedListener cacheListener,
@Nullable AdTracker adTracker)
{
mCacheListener = cacheListener;
mAdTracker = adTracker;
}
@androidx.annotation.UiThread
public void loadAd(@NonNull Context context, @NonNull List<Banner> banners)
{
LOGGER.i(TAG, "Load ads for " + banners);
detach();
cancel();
mLoadingCompleted = false;
mFailedProviders.clear();
if (banners.size() == 0)
return;
for (Banner banner : banners)
{
if (TextUtils.isEmpty(banner.getId()))
throw new AssertionError("A banner id mustn't be empty!");
NativeAdLoader loader = Factory.createLoaderForBanner(banner, mCacheListener, mAdTracker);
mLoaders.add(loader);
attach();
loader.setAdListener(this);
// TODO: this workaround is need to avoid memory leak of activity context in MyTarget SDK.
// The fix of myTarged sdk will be done in this issue https://jira.mail.ru/browse/MOBADS-207.
// After the mentioned issued is fixed, this workaround should be removed. Also, we can't use
// the application context for all providers, because some of them (e.g. Mopub) requires an
// activity context and can't work with application context correctly.
if (loader instanceof MyTargetAdsLoader)
loader.loadAd(context.getApplicationContext(), banner.getId());
else
loader.loadAd(context, banner.getId());
}
}
@Override
public void loadAd(@NonNull Context context, @NonNull String bannerId)
{
throw new UnsupportedOperationException("A compound loader doesn't support this operation!");
}
@Override
public boolean isAdLoading(@NonNull String bannerId)
{
throw new UnsupportedOperationException("A compound loader doesn't support this operation!");
}
@SuppressLint("MissingSuperCall")
// Don't need to call super here, because we don't need to null the mAdListener from the
// CompoundNativeAdLoader
@Override
public void cancel()
{
for (NativeAdLoader loader : mLoaders)
loader.cancel();
mLoaders.clear();
}
@Override
public void detach()
{
for (NativeAdLoader loader : mLoaders)
loader.detach();
}
@Override
public void attach()
{
for (NativeAdLoader loader : mLoaders)
loader.attach();
}
public boolean isAdLoading()
{
return !mLoadingCompleted;
}
@Override
public void onAdLoaded(@NonNull MwmNativeAd ad)
{
if (mDelayedNotification != null)
{
UiThread.cancelDelayedTasks(mDelayedNotification);
mDelayedNotification = null;
}
if (mLoadingCompleted)
return;
// If only one banner is requested and obtained, it will be posted immediately to the listener.
if (mLoaders.size() == 1)
{
onAdLoadingCompleted(ad);
return;
}
String provider = ad.getProvider();
// MyTarget ad has the highest priority, so we notify the listener as soon as that ad is obtained.
if (Providers.MY_TARGET.equals(provider))
{
onAdLoadingCompleted(ad);
return;
}
// If MyTarget ad is failed, the ad from another provider should be posted to the listener.
if (mFailedProviders.contains(Providers.MY_TARGET))
{
onAdLoadingCompleted(ad);
return;
}
// Otherwise, we must wait a TIMEOUT_MS for the high priority ad.
// If the high priority ad is not obtained in TIMEOUT_MS, the last obtained ad will be posted
// to the listener.
mDelayedNotification = new DelayedNotification(ad);
UiThread.runLater(mDelayedNotification, TIMEOUT_MS);
}
@Override
public void onError(@NonNull String bannerId, @NonNull String provider, @NonNull NativeAdError error)
{
mFailedProviders.add(provider);
// If all providers give nothing, the listener will be notified about the error.
if (mFailedProviders.size() == mLoaders.size())
{
if (getAdListener() != null)
getAdListener().onError(bannerId, provider, error);
return;
}
// If the high priority ad is just failed, the timer should be forced if it's started.
if (Providers.MY_TARGET.equals(provider) && mDelayedNotification != null)
{
mDelayedNotification.run();
UiThread.cancelDelayedTasks(mDelayedNotification);
mDelayedNotification = null;
mLoadingCompleted = true;
}
}
@Override
public void onClick(@NonNull MwmNativeAd ad)
{
if (getAdListener() != null)
getAdListener().onClick(ad);
}
private void onAdLoadingCompleted(@NonNull MwmNativeAd ad)
{
if (getAdListener() != null)
getAdListener().onAdLoaded(ad);
mLoadingCompleted = true;
}
private class DelayedNotification implements Runnable
{
@NonNull
private final MwmNativeAd mAd;
private DelayedNotification(@NonNull MwmNativeAd ad)
{
mAd = ad;
}
@Override
public void run()
{
onAdLoadingCompleted(mAd);
}
}
}

View file

@ -1,166 +0,0 @@
package com.mapswithme.maps.ads;
import android.os.SystemClock;
import androidx.annotation.NonNull;
import com.mapswithme.util.log.Logger;
import com.mapswithme.util.log.LoggerFactory;
import java.util.HashMap;
import java.util.Map;
public class DefaultAdTracker implements AdTracker, OnAdCacheModifiedListener
{
private final static Logger LOGGER = LoggerFactory.INSTANCE.getLogger(LoggerFactory.Type.MISC);
private final static String TAG = DefaultAdTracker.class.getSimpleName();
private final static int IMPRESSION_TIME_MS = 2500;
private final static Map<BannerKey, TrackInfo> TRACKS = new HashMap<>();
@Override
public void onViewShown(@NonNull String provider, @NonNull String bannerId)
{
BannerKey key = new BannerKey(provider, bannerId);
LOGGER.d(TAG, "onViewShown bannerId = " + key);
TrackInfo info = TRACKS.get(key);
if (info == null)
{
info = new TrackInfo();
TRACKS.put(key, info);
}
info.setVisible(true);
}
@Override
public void onViewHidden(@NonNull String provider, @NonNull String bannerId)
{
BannerKey key = new BannerKey(provider, bannerId);
LOGGER.d(TAG, "onViewHidden bannerId = " + key);
TrackInfo info = TRACKS.get(key);
if (info != null)
info.setVisible(false);
}
@Override
public void onContentObtained(@NonNull String provider, @NonNull String bannerId)
{
BannerKey key = new BannerKey(provider, bannerId);
LOGGER.d(TAG, "onContentObtained bannerId = " + key);
TrackInfo info = TRACKS.get(key);
if (info == null)
throw new AssertionError("A track info must be put in a cache before a content is obtained");
info.fill();
}
@Override
public boolean isImpressionGood(@NonNull String provider, @NonNull String bannerId)
{
BannerKey key = new BannerKey(provider, bannerId);
TrackInfo info = TRACKS.get(key);
return info != null && info.getShowTime() > IMPRESSION_TIME_MS;
}
@Override
public void onRemoved(@NonNull BannerKey key)
{
TRACKS.remove(key);
}
@Override
public void onPut(@NonNull BannerKey key)
{
TrackInfo info = TRACKS.get(key);
if (info == null)
{
TRACKS.put(key, new TrackInfo());
return;
}
if (info.getShowTime() != 0)
info.setLastShow(true);
}
private static class TrackInfo
{
/**
* A timestamp to track ad visibility
*/
private long mTimestamp;
/**
* Accumulates amount of time that ad is already shown.
*/
private long mShowTime;
/**
* Indicates whether the ad view is visible or not.
*/
private boolean mVisible;
/**
* Indicates whether the ad content is obtained or not.
*/
private boolean mFilled;
/**
* Indicates whether it's the last time when an ad was shown or not.
*/
private boolean mLastShow;
void setVisible(boolean visible)
{
boolean wasVisible = mVisible;
mVisible = visible;
// No need tracking if the ad is not filled with a content
if (!mFilled)
return;
// If ad becomes visible, and it's filled with a content the timestamp must be stored.
if (visible && !wasVisible)
{
mTimestamp = SystemClock.elapsedRealtime();
}
// If ad is hidden the show time must be accumulated.
else if (!visible && wasVisible)
{
if (mLastShow)
{
mShowTime = 0;
mTimestamp = 0;
mLastShow = false;
LOGGER.d(TAG, "it's a last time for this ad");
return;
}
if (mTimestamp == 0)
throw new AssertionError("A timestamp mustn't be 0 when ad is hidden!");
mShowTime += SystemClock.elapsedRealtime() - mTimestamp;
LOGGER.d(TAG, "A show time = " + mShowTime);
mTimestamp = 0;
}
}
boolean isVisible()
{
return mVisible;
}
public void fill()
{
// If the visible ad is filled with the content the timestamp must be stored
if (mVisible)
mTimestamp = SystemClock.elapsedRealtime();
mFilled = true;
}
long getShowTime()
{
return mShowTime;
}
void setLastShow(boolean lastShow)
{
mLastShow = lastShow;
}
}
}

View file

@ -1,33 +0,0 @@
package com.mapswithme.maps.ads;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
public class Factory
{
@NonNull
static NativeAdLoader createLoaderForBanner(@NonNull Banner banner,
@Nullable OnAdCacheModifiedListener cacheListener,
@Nullable AdTracker tracker)
{
String provider = banner.getProvider();
switch (provider)
{
case Providers.MY_TARGET:
return new MyTargetAdsLoader(cacheListener, tracker);
case Providers.MOPUB:
return new MopubNativeDownloader(cacheListener, tracker);
case Providers.GOOGLE:
throw new AssertionError("Not implemented yet");
default:
throw new AssertionError("Unknown ads provider: " + provider);
}
}
@NonNull
public static CompoundNativeAdLoader createCompoundLoader(
@Nullable OnAdCacheModifiedListener cacheListener, @Nullable AdTracker tracker)
{
return new CompoundNativeAdLoader(cacheListener, tracker);
}
}

View file

@ -1,27 +0,0 @@
package com.mapswithme.maps.ads;
import androidx.annotation.Nullable;
class MopubAdError implements NativeAdError
{
@Nullable
private final String mMessage;
MopubAdError(@Nullable String message)
{
mMessage = message;
}
@Nullable
@Override
public String getMessage()
{
return mMessage;
}
@Override
public int getCode()
{
return 0;
}
}

View file

@ -1,136 +0,0 @@
package com.mapswithme.maps.ads;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import android.text.TextUtils;
import android.view.View;
import android.widget.ImageView;
import com.mopub.nativeads.NativeAd;
import com.mopub.nativeads.NativeImageHelper;
public class MopubNativeAd extends CachedMwmNativeAd
{
@NonNull
private final NativeAd mNativeAd;
@NonNull
private final AdDataAdapter mDataAdapter;
@Nullable
private final AdRegistrator mAdRegistrator;
public MopubNativeAd(@NonNull NativeAd ad, @NonNull AdDataAdapter adData,
@Nullable AdRegistrator registrator, long timestamp)
{
super(timestamp);
mNativeAd = ad;
mDataAdapter = adData;
mAdRegistrator = registrator;
}
@NonNull
@Override
public String getBannerId()
{
return mNativeAd.getAdUnitId();
}
@NonNull
@Override
public String getTitle()
{
return TextUtils.isEmpty(mDataAdapter.getTitle()) ? "" : mDataAdapter.getTitle();
}
@NonNull
@Override
public String getDescription()
{
return TextUtils.isEmpty(mDataAdapter.getText()) ? "" : mDataAdapter.getText();
}
@NonNull
@Override
public String getAction()
{
return TextUtils.isEmpty(mDataAdapter.getCallToAction()) ? "" : mDataAdapter.getCallToAction();
}
@Override
public void loadIcon(@NonNull View view)
{
NativeImageHelper.loadImageView(mDataAdapter.getIconImageUrl(), (ImageView) view);
}
@Override
void register(@NonNull View view)
{
mNativeAd.prepare(view);
}
@Override
public void unregister(@NonNull View view)
{
mNativeAd.clear(view);
}
@Override
public void registerView(@NonNull View view)
{
super.registerView(view);
if (mAdRegistrator != null)
mAdRegistrator.registerView(mNativeAd.getBaseNativeAd(), view);
}
@Override
public void unregisterView(@NonNull View view)
{
super.unregisterView(view);
if (mAdRegistrator != null)
mAdRegistrator.unregisterView(mNativeAd.getBaseNativeAd(), view);
}
@NonNull
@Override
public String getProvider()
{
return Providers.MOPUB;
}
@Nullable
@Override
public String getPrivacyInfoUrl()
{
return mDataAdapter.getPrivacyInfoUrl();
}
@Override
void detachAdListener()
{
mNativeAd.setMoPubNativeEventListener(null);
}
@Override
void attachAdListener(@NonNull Object listener)
{
if (!(listener instanceof NativeAd.MoPubNativeEventListener))
throw new AssertionError("A listener for MoPub ad must be instance of " +
"NativeAd.MoPubNativeEventListener class! Not '"
+ listener.getClass() + "'!");
mNativeAd.setMoPubNativeEventListener((NativeAd.MoPubNativeEventListener) listener);
}
@NonNull
@Override
public NetworkType getNetworkType()
{
return mDataAdapter.getType();
}
@Override
public String toString()
{
return super.toString() + ", mediated ad: " + mNativeAd.getBaseNativeAd();
}
}

View file

@ -1,137 +0,0 @@
package com.mapswithme.maps.ads;
import android.content.Context;
import android.location.Location;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import android.text.TextUtils;
import android.view.View;
import android.view.ViewGroup;
import com.mapswithme.maps.location.LocationHelper;
import com.mapswithme.util.Language;
import com.mapswithme.util.log.Logger;
import com.mapswithme.util.log.LoggerFactory;
import com.mopub.nativeads.BaseNativeAd;
import com.mopub.nativeads.MoPubAdRenderer;
import com.mopub.nativeads.MoPubNative;
import com.mopub.nativeads.MopubNativeAdFactory;
import com.mopub.nativeads.NativeAd;
import com.mopub.nativeads.NativeErrorCode;
import com.mopub.nativeads.RequestParameters;
import com.mopub.nativeads.StaticNativeAd;
import java.util.EnumSet;
class MopubNativeDownloader extends CachingNativeAdLoader
implements MoPubNative.MoPubNativeNetworkListener, NativeAd.MoPubNativeEventListener
{
private final static Logger LOGGER = LoggerFactory.INSTANCE.getLogger(LoggerFactory.Type.MISC);
private final static String TAG = MopubNativeDownloader.class.getSimpleName();
@Nullable
private String mBannerId;
MopubNativeDownloader(@Nullable OnAdCacheModifiedListener listener, @Nullable AdTracker tracker)
{
super(tracker, listener);
}
@Override
public void loadAd(@NonNull Context context, @NonNull String bannerId)
{
mBannerId = bannerId;
super.loadAd(context, bannerId);
}
@Override
void loadAdFromProvider(@NonNull Context context, @NonNull String bannerId)
{
MoPubNative nativeAd = new MoPubNative(context, bannerId, this);
nativeAd.registerAdRenderer(new DummyRenderer());
RequestParameters.Builder requestParameters = new RequestParameters.Builder();
EnumSet<RequestParameters.NativeAdAsset> assetsSet =
EnumSet.of(RequestParameters.NativeAdAsset.TITLE,
RequestParameters.NativeAdAsset.TEXT,
RequestParameters.NativeAdAsset.CALL_TO_ACTION_TEXT,
RequestParameters.NativeAdAsset.ICON_IMAGE);
requestParameters.desiredAssets(assetsSet);
Location l = LocationHelper.INSTANCE.getSavedLocation();
if (l != null)
requestParameters.location(l);
String locale = Language.nativeNormalize(Language.getDefaultLocale());
requestParameters.keywords("user_lang:" + locale);
nativeAd.makeRequest(requestParameters.build());
}
@NonNull
@Override
String getProvider()
{
return Providers.MOPUB;
}
@Override
public void onNativeLoad(final NativeAd nativeAd)
{
nativeAd.setMoPubNativeEventListener(this);
LOGGER.d(TAG, "onNativeLoad nativeAd = " + nativeAd);
CachedMwmNativeAd ad = MopubNativeAdFactory.createNativeAd(nativeAd);
if (ad != null)
onAdLoaded(nativeAd.getAdUnitId(), ad);
}
@Override
public void onNativeFail(NativeErrorCode errorCode)
{
LOGGER.w(TAG, "onNativeFail " + errorCode.toString());
if (mBannerId == null)
throw new AssertionError("A banner id must be non-null if a error is occurred");
onError(mBannerId, getProvider(), new MopubAdError(errorCode.toString()));
}
@Override
public void onImpression(View view)
{
LOGGER.d(TAG, "on MoPub Ad impressed");
}
@Override
public void onClick(View view)
{
if (!TextUtils.isEmpty(mBannerId))
onAdClicked(mBannerId);
}
private static class DummyRenderer implements MoPubAdRenderer<StaticNativeAd>
{
@NonNull
@Override
public View createAdView(@NonNull Context context, @Nullable ViewGroup parent)
{
// This method is never called, don't worry about nullness warning.
// noinspection ConstantConditions
return null;
}
@Override
public void renderAdView(@NonNull View view, @NonNull StaticNativeAd ad)
{
// No op.
}
@Override
public boolean supports(@NonNull BaseNativeAd nativeAd)
{
return true;
}
}
}

View file

@ -1,61 +0,0 @@
package com.mapswithme.maps.ads;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import android.view.View;
/**
* Represents a native ad object which can be obtained from any providers such as Facebook,
* MyTarget, etc.
*/
public interface MwmNativeAd
{
@NonNull
String getBannerId();
@NonNull
String getTitle();
@NonNull
String getDescription();
@NonNull
String getAction();
/**
*
* @param view A view which the loaded icon should be placed into.
*/
void loadIcon(@NonNull View view);
/**
* Registers the specified banner view in third-party sdk to track the native ad internally.
* @param bannerView A view which holds all native ad information.
*/
void registerView(@NonNull View bannerView);
/**
* Unregisters the view attached to the current ad.
* @param bannerView A view which holds all native ad information.
*/
void unregisterView(@NonNull View bannerView);
/**
* Returns a provider name for this ad.
*/
@NonNull
String getProvider();
/**
* Returns a privacy information url, or <code>null</code> if not set.
*/
@Nullable
String getPrivacyInfoUrl();
/**
* Returns a network type which the native ad belongs to.
*/
@NonNull
NetworkType getNetworkType();
}

View file

@ -1,28 +0,0 @@
package com.mapswithme.maps.ads;
import androidx.annotation.Nullable;
class MyTargetAdError implements NativeAdError
{
@Nullable
private final String mMessage;
MyTargetAdError(@Nullable String message)
{
mMessage = message;
}
@Nullable
@Override
public String getMessage()
{
return mMessage;
}
@Override
public int getCode()
{
return 0;
}
}

View file

@ -1,91 +0,0 @@
package com.mapswithme.maps.ads;
import android.content.Context;
import android.os.SystemClock;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import com.mapswithme.maps.PrivateVariables;
import com.mapswithme.util.log.Logger;
import com.mapswithme.util.log.LoggerFactory;
import com.my.target.common.CustomParams;
import com.my.target.nativeads.NativeAd;
import net.jcip.annotations.NotThreadSafe;
@NotThreadSafe
class MyTargetAdsLoader extends CachingNativeAdLoader implements NativeAd.NativeAdListener
{
private static final Logger LOGGER = LoggerFactory.INSTANCE.getLogger(LoggerFactory.Type.MISC);
private static final String TAG = MyTargetAdsLoader.class.getSimpleName();
private static final int SLOT = PrivateVariables.myTargetRbSlot();
static final String ZONE_KEY_PARAMETER = "_SITEZONE";
MyTargetAdsLoader(@Nullable OnAdCacheModifiedListener listener, @Nullable AdTracker tracker)
{
super(tracker, listener);
}
@Override
void loadAdFromProvider(@NonNull Context context, @NonNull String bannerId)
{
NativeAd ad = new NativeAd(SLOT, context);
ad.setListener(this);
ad.getCustomParams().setCustomParam(ZONE_KEY_PARAMETER, bannerId);
ad.load();
}
@Override
public void onLoad(NativeAd nativeAd)
{
CachedMwmNativeAd ad = new MyTargetNativeAd(nativeAd, SystemClock.elapsedRealtime());
onAdLoaded(ad.getBannerId(), ad);
}
@Override
public void onNoAd(String s, NativeAd nativeAd)
{
LOGGER.w(TAG, "onNoAd s = " + s);
CustomParams params = nativeAd.getCustomParams();
String bannerId = params.getCustomParam(ZONE_KEY_PARAMETER);
onError(bannerId, getProvider(), new MyTargetAdError(s));
}
@Override
public void onClick(NativeAd nativeAd)
{
CustomParams params = nativeAd.getCustomParams();
String bannerId = params.getData().get(ZONE_KEY_PARAMETER);
onAdClicked(bannerId);
}
@Override
public void onShow(NativeAd nativeAd)
{
// No op.
}
@Override
public void onVideoPlay(@NonNull NativeAd nativeAd)
{
/* Do nothing */
}
@Override
public void onVideoPause(@NonNull NativeAd nativeAd)
{
/* Do nothing */
}
@Override
public void onVideoComplete(@NonNull NativeAd nativeAd)
{
/* Do nothing */
}
@NonNull
@Override
String getProvider()
{
return Providers.MY_TARGET;
}
}

View file

@ -1,115 +0,0 @@
package com.mapswithme.maps.ads;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import android.view.View;
import android.widget.ImageView;
import com.my.target.common.CustomParams;
import com.my.target.common.models.ImageData;
import com.my.target.nativeads.NativeAd;
import com.my.target.nativeads.banners.NativePromoBanner;
import java.util.Map;
class MyTargetNativeAd extends CachedMwmNativeAd
{
@NonNull
private final NativeAd mAd;
@NonNull
private final String mBannerId;
MyTargetNativeAd(@NonNull NativeAd ad, long timestamp)
{
super(timestamp);
mAd = ad;
CustomParams params = mAd.getCustomParams();
Map<String, String> data = params.getData();
mBannerId = data.get(MyTargetAdsLoader.ZONE_KEY_PARAMETER);
}
@NonNull
@Override
public String getBannerId()
{
return mBannerId;
}
@NonNull
@Override
public String getTitle()
{
return mAd.getBanner().getTitle();
}
@NonNull
@Override
public String getDescription()
{
return mAd.getBanner().getDescription();
}
@NonNull
@Override
public String getAction()
{
return mAd.getBanner().getCtaText();
}
@Override
public void loadIcon(@NonNull View view)
{
NativePromoBanner banner = mAd.getBanner();
ImageData icon = banner.getIcon();
if (icon != null)
NativeAd.loadImageToView(icon, (ImageView) view);
}
@Override
public void unregister(@NonNull View view)
{
mAd.unregisterView();
}
@Override
void register(@NonNull View view)
{
mAd.registerView(view);
}
@NonNull
@Override
public String getProvider()
{
return Providers.MY_TARGET;
}
@Nullable
@Override
public String getPrivacyInfoUrl()
{
return null;
}
@Override
void detachAdListener()
{
mAd.setListener(null);
}
@Override
void attachAdListener(@NonNull Object listener)
{
if (!(listener instanceof NativeAd.NativeAdListener))
throw new AssertionError("A listener for myTarget ad must be instance of " +
"NativeAd.NativeAdListener class! Not '" + listener.getClass() + "'!");
mAd.setListener((NativeAd.NativeAdListener) listener);
}
@NonNull
@Override
public NetworkType getNetworkType()
{
return NetworkType.MYTARGET;
}
}

View file

@ -1,11 +0,0 @@
package com.mapswithme.maps.ads;
import androidx.annotation.Nullable;
public interface NativeAdError
{
@Nullable
String getMessage();
int getCode();
}

View file

@ -1,21 +0,0 @@
package com.mapswithme.maps.ads;
import androidx.annotation.NonNull;
import androidx.annotation.UiThread;
public interface NativeAdListener
{
@UiThread
void onAdLoaded(@NonNull MwmNativeAd ad);
/**
* Notifies about a error occurred while loading the ad for the specified banner id from the
* specified ads provider.
*
*/
@UiThread
void onError(@NonNull String bannerId, @NonNull String provider, @NonNull NativeAdError error);
@UiThread
void onClick(@NonNull MwmNativeAd ad);
}

View file

@ -1,49 +0,0 @@
package com.mapswithme.maps.ads;
import android.content.Context;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
interface NativeAdLoader
{
/**
* Loads an ad for the specified banner id. A caller will be notified about loading through
* {@link NativeAdListener} interface.
*
* @param context An activity context.
* @param bannerId A banner id that ad will be loaded for.
*/
void loadAd(@NonNull Context context, @NonNull String bannerId);
/**
* Caller should set this listener to be informed about status of an ad loading.
*
* @see NativeAdListener
*/
void setAdListener(@Nullable NativeAdListener adListener);
/**
* Indicated whether the ad for the specified banner is loading right now or not.
*
* @param bannerId A specified banner id.
* @return <code>true</code> if loading is in a progress, otherwise - <code>false</code>.
*/
boolean isAdLoading(@NonNull String bannerId);
/**
* Cancels the loading process.
*
*/
void cancel();
/**
* Detaches this loader from UI context. Must be called every time when current UI context is going
* to be destroyed. Otherwise, memory leaks are possible.
*/
void detach();
/**
* Attaches this loader to UI context.
*/
void attach();
}

View file

@ -1,9 +0,0 @@
package com.mapswithme.maps.ads;
public enum NetworkType
{
GOOGLE,
MOPUB,
MOPUB_GOOGLE,
MYTARGET;
}

View file

@ -1,12 +0,0 @@
package com.mapswithme.maps.ads;
import androidx.annotation.NonNull;
/**
* A common listener to make all interested observers be able to watch for ads cache modifications.
*/
interface OnAdCacheModifiedListener
{
void onRemoved(@NonNull BannerKey key);
void onPut(@NonNull BannerKey key);
}

View file

@ -1,9 +0,0 @@
package com.mapswithme.maps.ads;
class Providers
{
static final String MY_TARGET = "MY_TARGET";
static final String MOPUB = "MOPUB";
static final String GOOGLE = "GOOGLE";
}

View file

@ -1,26 +0,0 @@
package com.mapswithme.maps.analytics;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import java.util.Map;
class AppsFlyerUtils
{
private AppsFlyerUtils()
{
// Utility class.
}
static boolean isFirstLaunch(@NonNull Map<String, String> conversionData)
{
String isFirstLaunch = conversionData.get("is_first_launch");
return Boolean.parseBoolean(isFirstLaunch);
}
@Nullable
static String getDeepLink(@NonNull Map<String, String> conversionData)
{
return conversionData.get("af_dp");
}
}

View file

@ -1,67 +0,0 @@
package com.mapswithme.maps.analytics;
import android.app.Activity;
import android.app.Application;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import java.util.HashMap;
import java.util.Map;
class EventLoggerAggregator extends ContextDependentEventLogger
{
@NonNull
private final Map<Class<? extends EventLogger>, EventLogger> mLoggers;
EventLoggerAggregator(@NonNull Application application)
{
super(application);
mLoggers = new HashMap<>();
mLoggers.put(FlurryEventLogger.class, new FlurryEventLogger(application));
}
@Override
public void initialize()
{
for (Map.Entry<Class<? extends EventLogger>, ? extends EventLogger> each : mLoggers.entrySet())
{
each.getValue().initialize();
}
}
@Override
public void sendTags(@NonNull String tag, @Nullable String[] params)
{
for (Map.Entry<Class<? extends EventLogger>, ? extends EventLogger> each : mLoggers.entrySet())
{
each.getValue().sendTags(tag, params);
}
}
@Override
public void logEvent(@NonNull String event, @NonNull Map<String, String> params)
{
for (Map.Entry<Class<? extends EventLogger>, ? extends EventLogger> each : mLoggers.entrySet())
{
each.getValue().logEvent(event, params);
}
}
@Override
public void startActivity(@NonNull Activity context)
{
for (Map.Entry<Class<? extends EventLogger>, ? extends EventLogger> each : mLoggers.entrySet())
{
each.getValue().startActivity(context);
}
}
@Override
public void stopActivity(@NonNull Activity context)
{
for (Map.Entry<Class<? extends EventLogger>, ? extends EventLogger> each : mLoggers.entrySet())
{
each.getValue().stopActivity(context);
}
}
}

View file

@ -1,40 +1,15 @@
package com.mapswithme.maps.analytics;
import android.app.Application;
import android.os.AsyncTask;
import android.os.CountDownTimer;
import android.text.TextUtils;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.annotation.UiThread;
import com.appsflyer.AppsFlyerConversionListener;
import com.appsflyer.AppsFlyerLib;
import com.google.android.gms.ads.identifier.AdvertisingIdClient;
import com.google.android.gms.common.GooglePlayServicesNotAvailableException;
import com.google.android.gms.common.GooglePlayServicesRepairableException;
import com.google.firebase.crashlytics.FirebaseCrashlytics;
import com.mapswithme.maps.BuildConfig;
import com.mapswithme.maps.Framework;
import com.mapswithme.maps.MwmApplication;
import com.mapswithme.maps.PrivateVariables;
import com.mapswithme.maps.R;
import com.mapswithme.maps.ads.Banner;
import com.mapswithme.util.CrashlyticsUtils;
import com.mapswithme.util.PermissionsUtils;
import com.mapswithme.util.Utils;
import com.mapswithme.util.log.Logger;
import com.mapswithme.util.log.LoggerFactory;
import com.mopub.common.MoPub;
import com.mopub.common.SdkConfiguration;
import com.mopub.common.privacy.PersonalInfoManager;
import com.my.target.common.MyTargetPrivacy;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.concurrent.TimeoutException;
public class ExternalLibrariesMediator
{
@ -45,13 +20,6 @@ public class ExternalLibrariesMediator
private final Application mApplication;
@NonNull
private volatile EventLogger mEventLogger;
private boolean mEventLoggerInitialized;
@Nullable
private AdvertisingInfo mAdvertisingInfo;
@Nullable
private String mFirstLaunchDeepLink;
@NonNull
private List<AdvertisingObserver> mAdvertisingObservers = new ArrayList<>();
public ExternalLibrariesMediator(@NonNull Application application)
{
@ -59,42 +27,9 @@ public class ExternalLibrariesMediator
mEventLogger = new DefaultEventLogger(application);
}
public void initSensitiveDataToleranceLibraries()
{
initMoPub();
initAppsFlyer();
}
public void initSensitiveDataStrictLibrariesAsync()
{
GetAdInfoTask getAdInfoTask = new GetAdInfoTask(this);
getAdInfoTask.execute();
}
private void initSensitiveEventLogger()
{
if (!com.mapswithme.util.concurrency.UiThread.isUiThread())
throw new IllegalStateException("Must be call from Ui thread");
if (mEventLoggerInitialized)
return;
mEventLogger = new EventLoggerAggregator(mApplication);
mEventLogger.initialize();
mEventLoggerInitialized = true;
}
private void initAppsFlyer()
{
AppsFlyerLib.getInstance().init(PrivateVariables.appsFlyerKey(), new FirstLaunchDeeplinkListener());
AppsFlyerLib.getInstance().setDebugLog(BuildConfig.DEBUG);
AppsFlyerLib.getInstance().setResolveDeepLinkURLs();
AppsFlyerLib.getInstance().startTracking(mApplication);
}
public boolean isCrashlyticsEnabled()
{
String prefKey = mApplication.getResources().getString(R.string.pref_opt_out_fabric_activated);
String prefKey = mApplication.getResources().getString(R.string.pref_crash_reports);
return MwmApplication.prefs(mApplication).getBoolean(prefKey, true);
}
@ -104,271 +39,10 @@ public class ExternalLibrariesMediator
return mEventLogger;
}
public boolean setInstallationIdToCrashlytics()
{
if (!isCrashlyticsEnabled())
return false;
final String installationId = Utils.getInstallationId(mApplication);
// If installation id is not found this means id was not
// generated by alohalytics yet and it is a first run.
if (TextUtils.isEmpty(installationId))
return false;
FirebaseCrashlytics.getInstance().setCustomKey("AlohalyticsInstallationId", installationId);
FirebaseCrashlytics.getInstance().setUserId(installationId);
return true;
}
private void initMoPub()
{
SdkConfiguration sdkConfiguration = new SdkConfiguration
.Builder(Framework.nativeMoPubInitializationBannerId())
.build();
MoPub.initializeSdk(mApplication, sdkConfiguration, null);
PersonalInfoManager manager = MoPub.getPersonalInformationManager();
if (manager != null)
manager.grantConsent();
}
@UiThread
private void setAdvertisingInfo(@NonNull AdvertisingInfo info)
{
mAdvertisingInfo = info;
}
@UiThread
private void notifyObservers()
{
for (AdvertisingObserver observer : mAdvertisingObservers)
observer.onAdvertisingInfoObtained();
}
@UiThread
public boolean isAdvertisingInfoObtained()
{
return mAdvertisingInfo != null;
}
@UiThread
public boolean isLimitAdTrackingEnabled()
{
if (mAdvertisingInfo == null)
throw new IllegalStateException("Advertising info must be obtained first!");
return mAdvertisingInfo.isLimitAdTrackingEnabled();
}
@Nullable
public String getAdvertisingId()
{
return mAdvertisingInfo != null ? mAdvertisingInfo.getID() : null;
}
public void disableAdProvider(@NonNull Banner.Type type)
{
Framework.disableAdProvider(type);
MyTargetPrivacy.setUserConsent(false);
}
@NonNull
Application getApplication()
{
return mApplication;
}
@UiThread
public void initSensitiveData()
{
initSensitiveEventLogger();
if (PermissionsUtils.isLocationGranted(getApplication()))
return;
MyTargetPrivacy.setUserConsent(false);
}
@Nullable
public String retrieveFirstLaunchDeeplink()
{
String firstLaunchDeepLink = mFirstLaunchDeepLink;
mFirstLaunchDeepLink = null;
return firstLaunchDeepLink;
}
public void addAdvertisingObserver(@NonNull AdvertisingObserver observer)
{
mAdvertisingObservers.add(observer);
}
public void removeAdvertisingObserver(@NonNull AdvertisingObserver observer)
{
mAdvertisingObservers.remove(observer);
}
private class FirstLaunchDeeplinkListener implements AppsFlyerConversionListener
{
@Override
public void onInstallConversionDataLoaded(Map<String, String> conversionData)
{
if (conversionData == null || conversionData.isEmpty())
return;
for (String attrName : conversionData.keySet())
{
LOGGER.d(TAG, "onInstallConversion attribute: " + attrName + " = "
+ conversionData.get(attrName));
}
if (!AppsFlyerUtils.isFirstLaunch(conversionData))
return;
mFirstLaunchDeepLink = AppsFlyerUtils.getDeepLink(conversionData);
}
@Override
public void onInstallConversionFailure(String errorMessage)
{
LOGGER.e(TAG, "onInstallConversionFailure: " + errorMessage);
}
@Override
public void onAppOpenAttribution(Map<String, String> conversionData)
{
if (conversionData == null || conversionData.isEmpty())
return;
for (String attrName : conversionData.keySet())
{
LOGGER.d(TAG, "onAppOpenAttribution attribute: " + attrName + " = "
+ conversionData.get(attrName));
}
}
@Override
public void onAttributionFailure(String errorMessage)
{
LOGGER.d(TAG, "onAttributionFailure: " + errorMessage);
}
}
private static class GetAdInfoTask extends AsyncTask<Void, Void, AdvertisingInfo>
{
private final static long ADS_INFO_GETTING_TIMEOUT_MS = 4000;
private final static long ADS_INFO_GETTING_CHECK_INTERVAL_MS = 500;
@NonNull
private final ExternalLibrariesMediator mMediator;
@NonNull
private final CountDownTimer mTimer = new CountDownTimer(ADS_INFO_GETTING_TIMEOUT_MS,
ADS_INFO_GETTING_CHECK_INTERVAL_MS)
{
@Override
public void onTick(long millisUntilFinished)
{
if (getStatus() == Status.FINISHED)
{
LOGGER.i(TAG, "Timer could be cancelled, advertising id already obtained");
cancel();
}
}
@Override
public void onFinish()
{
if (getStatus() == Status.FINISHED)
return;
LOGGER.w(TAG, "Cancel getting advertising id request, timeout exceeded.");
GetAdInfoTask.this.cancel(true);
mMediator.setAdvertisingInfo(new AdvertisingInfo(null));
mMediator.notifyObservers();
}
};
private GetAdInfoTask(@NonNull ExternalLibrariesMediator mediator)
{
mMediator = mediator;
}
@Override
protected void onPreExecute()
{
super.onPreExecute();
mTimer.start();
}
@Override
protected AdvertisingInfo doInBackground(Void... voids)
{
try
{
Application application = mMediator.getApplication();
LOGGER.i(TAG, "Start of getting advertising info");
AdvertisingIdClient.Info info = AdvertisingIdClient.getAdvertisingIdInfo(application);
if (isCancelled())
{
String msg = "Advertising id wasn't obtained within " + ADS_INFO_GETTING_TIMEOUT_MS + " ms";
LOGGER.w(TAG, msg);
throw new TimeoutException(msg);
}
LOGGER.i(TAG, "End of getting advertising info");
return new AdvertisingInfo(info);
}
catch (GooglePlayServicesNotAvailableException | IOException
| GooglePlayServicesRepairableException | TimeoutException e)
{
LOGGER.e(TAG, "Failed to obtain advertising id: ", e);
CrashlyticsUtils.INSTANCE.logException(e);
return new AdvertisingInfo(null);
}
}
@Override
protected void onPostExecute(@NonNull AdvertisingInfo info)
{
LOGGER.i(TAG, "onPostExecute, info: " + info);
super.onPostExecute(info);
mMediator.setAdvertisingInfo(info);
mMediator.notifyObservers();
}
@Override
protected void onCancelled()
{
LOGGER.i(TAG, "onCancelled");
super.onCancelled();
}
}
private static class AdvertisingInfo
{
@Nullable
private final AdvertisingIdClient.Info mInfo;
private AdvertisingInfo(@Nullable AdvertisingIdClient.Info info)
{
mInfo = info;
}
@UiThread
boolean isLimitAdTrackingEnabled()
{
return mInfo != null && mInfo.isLimitAdTrackingEnabled();
}
@Override
public String toString()
{
return "AdvertisingInfo{" +
"mInfo=" + mInfo +
'}';
}
@Nullable
String getID()
{
return mInfo != null ? mInfo.getId() : null;
}
return null;
}
@UiThread

View file

@ -1,56 +0,0 @@
package com.mapswithme.maps.analytics;
import android.app.Activity;
import android.app.Application;
import androidx.annotation.NonNull;
import android.util.Log;
import com.flurry.android.FlurryAgent;
import com.mapswithme.maps.BuildConfig;
import com.mapswithme.maps.PrivateVariables;
import java.util.Map;
class FlurryEventLogger extends DefaultEventLogger
{
FlurryEventLogger(@NonNull Application application)
{
super(application);
}
@Override
public void initialize()
{
//noinspection ConstantConditions
FlurryAgent.setVersionName(BuildConfig.VERSION_NAME);
FlurryAgent.setDataSaleOptOut(true);
new FlurryAgent
.Builder()
.withLogEnabled(true)
.withLogLevel(BuildConfig.DEBUG ? Log.DEBUG : Log.ERROR)
.withCaptureUncaughtExceptions(false)
.withDataSaleOptOut(true)
.build(getApplication(), PrivateVariables.flurryKey());
}
@Override
public void logEvent(@NonNull String event, @NonNull Map<String, String> params)
{
super.logEvent(event, params);
FlurryAgent.logEvent(event, params);
}
@Override
public void startActivity(@NonNull Activity context)
{
super.startActivity(context);
FlurryAgent.onStartSession(context.getApplicationContext());
}
@Override
public void stopActivity(@NonNull Activity context)
{
super.stopActivity(context);
FlurryAgent.onEndSession(context.getApplicationContext());
}
}

View file

@ -1,54 +0,0 @@
package com.mapswithme.maps.analytics;
import android.app.Application;
import androidx.annotation.ColorInt;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import com.mapswithme.maps.BuildConfig;
import com.mapswithme.util.UiUtils;
import com.mapswithme.util.log.Logger;
import com.mapswithme.util.log.LoggerFactory;
import com.mapswithme.util.statistics.PushwooshHelper;
class PushWooshEventLogger extends DefaultEventLogger
{
private static final Logger LOGGER = LoggerFactory.INSTANCE.getLogger(LoggerFactory.Type.MISC);
private static final String PW_EMPTY_APP_ID = "XXXXX";
@Nullable
private PushwooshHelper mPushwooshHelper;
PushWooshEventLogger(@NonNull Application application)
{
super(application);
}
@Override
public void initialize()
{
try
{
if (BuildConfig.PW_APPID.equals(PW_EMPTY_APP_ID))
return;
@ColorInt
int color = UiUtils.getNotificationColor(getApplication());
mPushwooshHelper = new PushwooshHelper();
}
catch(Exception e)
{
LOGGER.e("Pushwoosh", "Failed to init Pushwoosh", e);
}
}
@Override
public void sendTags(@NonNull String tag, @Nullable String[] params)
{
super.sendTags(tag, params);
if (mPushwooshHelper != null)
mPushwooshHelper.sendTags(tag, params);
}
}

View file

@ -13,7 +13,6 @@ import android.util.SparseArray;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.TextView;
import androidx.annotation.DrawableRes;
@ -25,7 +24,6 @@ import androidx.appcompat.app.AlertDialog;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import com.cocosw.bottomsheet.BottomSheet;
import com.mapswithme.maps.Framework;
import com.mapswithme.maps.MwmActivity;
import com.mapswithme.maps.R;
import com.mapswithme.maps.intent.Factory;
@ -33,11 +31,8 @@ import com.mapswithme.maps.location.LocationHelper;
import com.mapswithme.maps.routing.RoutingController;
import com.mapswithme.util.BottomSheetHelper;
import com.mapswithme.util.StringUtils;
import com.mapswithme.util.ThemeUtils;
import com.mapswithme.util.UiUtils;
import com.mapswithme.util.statistics.MytargetHelper;
import com.mapswithme.util.statistics.Statistics;
import com.my.target.nativeads.banners.NativeAppwallBanner;
import com.timehop.stickyheadersrecyclerview.StickyRecyclerHeadersAdapter;
import com.timehop.stickyheadersrecyclerview.StickyRecyclerHeadersDecoration;
@ -52,12 +47,10 @@ import java.util.Stack;
class DownloaderAdapter extends RecyclerView.Adapter<DownloaderAdapter.ViewHolderWrapper>
implements StickyRecyclerHeadersAdapter<DownloaderAdapter.HeaderViewHolder>
{
private static final String HEADER_ADVERTISMENT_TITLE = "OMAPS.APP";
private static final int HEADER_ADVERTISMENT_ID = CountryItem.CATEGORY__LAST + 1;
private static final int HEADER_ADS_OFFSET = 10;
private static final int TYPE_COUNTRY = 0;
private static final int TYPE_ADVERTISMENT = 1;
private final RecyclerView mRecycler;
private final Activity mActivity;
@ -65,23 +58,17 @@ class DownloaderAdapter extends RecyclerView.Adapter<DownloaderAdapter.ViewHolde
private final StickyRecyclerHeadersDecoration mHeadersDecoration;
private boolean mMyMapsMode = true;
private boolean mAdsLoaded;
private boolean mAdsLoading;
private boolean mShowAds;
private boolean mSearchResultsMode;
private String mSearchQuery;
private final List<CountryItem> mItems = new ArrayList<>();
private final Map<String, CountryItem> mCountryIndex = new HashMap<>(); // Country.id -> Country
private final List<NativeAppwallBanner> mAds = new ArrayList<>();
private final SparseArray<String> mHeaders = new SparseArray<>();
private final Stack<PathEntry> mPath = new Stack<>(); // Holds navigation history. The last element is the current level.
private int mNearMeCount;
private int mListenerSlot;
@Nullable
private MytargetHelper mMytargetHelper;
private enum MenuItem
{
@ -315,8 +302,7 @@ class DownloaderAdapter extends RecyclerView.Adapter<DownloaderAdapter.ViewHolde
private View createViewHolderFrame(ViewGroup parent, int kind)
{
return inflate(parent, (kind == TYPE_ADVERTISMENT ? R.layout.downloader_item_ad
: R.layout.downloader_item));
return inflate(parent, R.layout.downloader_item);
}
class ViewHolderWrapper extends RecyclerView.ViewHolder
@ -330,23 +316,12 @@ class DownloaderAdapter extends RecyclerView.Adapter<DownloaderAdapter.ViewHolde
super(createViewHolderFrame(parent, kind));
mKind = kind;
mHolder = (kind == TYPE_ADVERTISMENT) ? new AdViewHolder(itemView)
: new ItemViewHolder(itemView);
mHolder = new ItemViewHolder(itemView);
}
@SuppressWarnings("unchecked")
void bind(int position)
{
int kind = DownloaderAdapter.this.getItemViewType(position);
if (kind == TYPE_ADVERTISMENT)
{
mHolder.bind(mAds.get(position - mNearMeCount));
return;
}
if (position > mNearMeCount)
position -= getAdsCount();
mHolder.bind(mItems.get(position));
}
}
@ -631,58 +606,8 @@ class DownloaderAdapter extends RecyclerView.Adapter<DownloaderAdapter.ViewHolde
void bind(int position)
{
if (position >= mNearMeCount && position < mNearMeCount + getAdsCount())
{
mTitle.setText(HEADER_ADVERTISMENT_TITLE);
}
else
{
if (position > mNearMeCount)
position -= getAdsCount();
CountryItem ci = mItems.get(position);
mTitle.setText(mHeaders.get(ci.headerId));
}
}
}
private class AdViewHolder extends BaseInnerViewHolder<NativeAppwallBanner>
{
private final ImageView mIcon;
private final TextView mTitle;
private final TextView mSubtitle;
private NativeAppwallBanner mData;
@NonNull
private final View.OnClickListener mClickListener = new View.OnClickListener()
{
@Override
public void onClick(View v)
{
if (mData != null)
if (mMytargetHelper != null)
mMytargetHelper.onBannerClick(mData);
}
};
AdViewHolder(View frame)
{
mIcon = frame.findViewById(R.id.downloader_ad_icon);
mTitle = frame.findViewById(R.id.downloader_ad_title);
mSubtitle = frame.findViewById(R.id.downloader_ad_subtitle);
frame.setOnClickListener(mClickListener);
}
@Override
void bind(NativeAppwallBanner item)
{
mData = item;
super.bind(item);
mIcon.setImageBitmap(item.getIcon().getBitmap());
mTitle.setText(item.getTitle());
mSubtitle.setText(item.getDescription());
}
}
@ -755,7 +680,6 @@ class DownloaderAdapter extends RecyclerView.Adapter<DownloaderAdapter.ViewHolde
MapManager.nativeListItems(parent, lat, lon, hasLocation, mMyMapsMode, mItems);
processData();
loadAds();
}
void setSearchResultsMode(@NonNull Collection<CountryItem> results, String query)
@ -768,18 +692,6 @@ class DownloaderAdapter extends RecyclerView.Adapter<DownloaderAdapter.ViewHolde
processData();
}
void clearAdsAndCancelMyTarget()
{
if (mAds.isEmpty())
return;
if (mMytargetHelper != null)
mMytargetHelper.cancel();
clearAdsInternal();
mAdsLoaded = false;
}
void resetSearchResultsMode()
{
mSearchResultsMode = false;
@ -825,12 +737,6 @@ class DownloaderAdapter extends RecyclerView.Adapter<DownloaderAdapter.ViewHolde
@Override
public int getItemViewType(int position)
{
if (position < mNearMeCount)
return TYPE_COUNTRY;
if (position < mNearMeCount + getAdsCount())
return TYPE_ADVERTISMENT;
return TYPE_COUNTRY;
}
@ -863,24 +769,17 @@ class DownloaderAdapter extends RecyclerView.Adapter<DownloaderAdapter.ViewHolde
{
if (position >= mNearMeCount)
{
if (position < mNearMeCount + getAdsCount())
if (position < mNearMeCount)
return HEADER_ADVERTISMENT_ID;
position -= getAdsCount();
}
return mItems.get(position).headerId;
}
private int getAdsCount()
{
return (mShowAds ? mAds.size() : 0);
}
@Override
public int getItemCount()
{
return mItems.size() + getAdsCount();
return mItems.size();
}
private void goDeeper(CountryItem child, boolean refresh)
@ -966,120 +865,6 @@ class DownloaderAdapter extends RecyclerView.Adapter<DownloaderAdapter.ViewHolde
return mMyMapsMode;
}
/**
* Loads banner if:
* <ul>
* <li>There is not active ads removal subscription</li>
* <li>Not in `my maps` mode;</li>
* <li>Currently at root level;</li>
* <li>Day mode is active;</li>
* <li>There is at least one map downloaded.</li>
* </ul>
*/
private void loadAds()
{
mShowAds = false;
if (Framework.nativeHasActiveSubscription(Framework.SUBSCRIPTION_TYPE_REMOVE_ADS))
return;
if (mAdsLoading)
return;
if (mMyMapsMode || !CountryItem.isRoot(getCurrentRootId()))
return;
if (!ThemeUtils.isDefaultTheme(mActivity.getApplicationContext()))
return;
if (MapManager.nativeGetDownloadedCount() < 1)
return;
mShowAds = true;
if (mAdsLoaded)
{
mHeadersDecoration.invalidateHeaders();
notifyItemRangeInserted(mNearMeCount, mAds.size());
return;
}
mAdsLoading = true;
if (mMytargetHelper == null)
initMytargetHelper();
}
private void handleBannersShow(@NonNull List<NativeAppwallBanner> ads)
{
if (mMytargetHelper != null)
mMytargetHelper.handleBannersShow(ads);
}
private void initMytargetHelper()
{
mMytargetHelper = new MytargetHelper(new MytargetHelper.Listener<Void>()
{
private void onNoAdsInternal()
{
mAdsLoading = false;
mAdsLoaded = true;
clearAdsInternal();
}
@Override
public void onNoAds()
{
onNoAdsInternal();
}
@Override
public void onDataReady(@Nullable Void data)
{
//noinspection ConstantConditions
mMytargetHelper.loadShowcase(new MytargetHelper.Listener<List<NativeAppwallBanner>>()
{
@Override
public void onNoAds()
{
onNoAdsInternal();
}
@Override
public void onDataReady(@Nullable List<NativeAppwallBanner> banners)
{
mAdsLoading = false;
mAdsLoaded = true;
mAds.clear();
if (banners != null)
{
for (NativeAppwallBanner banner : banners)
if (!banner.isAppInstalled())
mAds.add(banner);
handleBannersShow(banners);
}
mHeadersDecoration.invalidateHeaders();
notifyDataSetChanged();
}
}, mActivity);
}
}, mActivity.getApplicationContext());
}
private void clearAdsInternal()
{
int oldSize = mAds.size();
mAds.clear();
if (oldSize > 0)
{
mHeadersDecoration.invalidateHeaders();
notifyItemRangeRemoved(mNearMeCount, oldSize);
}
}
void attach()
{
mListenerSlot = MapManager.nativeSubscribe(mStorageCallback);
@ -1088,11 +873,6 @@ class DownloaderAdapter extends RecyclerView.Adapter<DownloaderAdapter.ViewHolde
void detach()
{
MapManager.nativeUnsubscribe(mListenerSlot);
if (mMytargetHelper != null)
mMytargetHelper.cancel();
mAdsLoading = false;
}
boolean isSearchResultsMode()

View file

@ -1,12 +0,0 @@
package com.mapswithme.maps.downloader;
import android.view.View;
import androidx.annotation.IdRes;
import androidx.annotation.NonNull;
interface DownloaderBannerConfigStrategy
{
void configureView(@NonNull View parent, @IdRes int iconViewId, @IdRes int messageViewId,
@IdRes int buttonViewId);
}

View file

@ -1,15 +0,0 @@
package com.mapswithme.maps.downloader;
import android.view.View;
import androidx.annotation.IdRes;
import androidx.annotation.NonNull;
class DownloaderBannerConfigStrategyDefault implements DownloaderBannerConfigStrategy
{
@Override
public void configureView(@NonNull View parent, @IdRes int iconViewId, @IdRes int messageViewId,
@IdRes int buttonViewId)
{
}
}

View file

@ -1,55 +0,0 @@
package com.mapswithme.maps.downloader;
import android.graphics.drawable.GradientDrawable;
import android.view.View;
import android.widget.ImageView;
import android.widget.TextView;
import androidx.annotation.ColorRes;
import androidx.annotation.DrawableRes;
import androidx.annotation.IdRes;
import androidx.annotation.NonNull;
import androidx.annotation.StringRes;
import com.mapswithme.maps.R;
class DownloaderBannerConfigStrategyPartner implements DownloaderBannerConfigStrategy
{
@DrawableRes
private final int mIcon;
@StringRes
private final int mMessage;
@StringRes
private final int mButtonText;
@ColorRes
private final int mButtonTextColor;
@ColorRes
private final int mButtonColor;
DownloaderBannerConfigStrategyPartner(@DrawableRes int icon, @StringRes int message,
@StringRes int buttonText, @ColorRes int buttonTextColor,
@ColorRes int buttonColor)
{
mIcon = icon;
mMessage = message;
mButtonText = buttonText;
mButtonTextColor = buttonTextColor;
mButtonColor = buttonColor;
}
@Override
public void configureView(@NonNull View parent, @IdRes int iconViewId, @IdRes int messageViewId,
@IdRes int buttonViewId)
{
ImageView icon = parent.findViewById(iconViewId);
icon.setImageResource(mIcon);
TextView message = parent.findViewById(messageViewId);
message.setText(mMessage);
TextView button = parent.findViewById(buttonViewId);
button.setText(mButtonText);
button.setTextColor(button.getResources().getColor(mButtonTextColor));
GradientDrawable background = new GradientDrawable();
background.setColor(button.getResources().getColor(mButtonColor));
background.setCornerRadius(R.dimen.downloader_partner_button_corner_radius);
button.setBackground(background);
}
}

View file

@ -1,262 +0,0 @@
package com.mapswithme.maps.downloader;
import android.app.Activity;
import androidx.annotation.LayoutRes;
import androidx.annotation.NonNull;
import com.mapswithme.maps.R;
import com.mapswithme.maps.bookmarks.BookmarkCategoriesActivity;
import com.mapswithme.maps.bookmarks.BookmarksCatalogActivity;
import com.mapswithme.util.Utils;
import com.mapswithme.util.statistics.StatisticValueConverter;
import com.mapswithme.util.statistics.Statistics;
enum DownloaderBannerType implements StatisticValueConverter<String>
{
TINKOFF_AIRLINES(new DownloaderBannerConfigStrategyPartner(R.drawable.ic_logo_tinkoff,
R.string.tinkoff_allairlines_map_downloader_title,
R.string.tinkoff_allairlines_map_downloader_cta_button,
R.color.black_primary,
R.color.tinkoff_button))
{
@NonNull
@Override
public String toStatisticValue()
{
return Statistics.ParamValue.TINKOFF_ALL_AIRLINES;
}
@LayoutRes
@Override
int getLayoutId()
{
return R.layout.onmap_downloader_banner;
}
},
TINKOFF_INSURANCE(new DownloaderBannerConfigStrategyPartner(R.drawable.ic_logo_tinkoff,
R.string.tinkoff_insurance_map_downloader_title,
R.string.tinkoff_insurance_map_downloader_cta_button,
R.color.black_primary,
R.color.tinkoff_button))
{
@NonNull
@Override
public String toStatisticValue()
{
return Statistics.ParamValue.TINKOFF_INSURANCE;
}
@LayoutRes
@Override
int getLayoutId()
{
return R.layout.onmap_downloader_banner;
}
},
MTS(new DownloaderBannerConfigStrategyPartner(R.drawable.ic_logo_mts,
R.string.mts_map_downloader_title,
R.string.mts_map_downloader_cta_button,
R.color.white_primary,
R.color.mts_button))
{
@NonNull
@Override
public String toStatisticValue()
{
return Statistics.ParamValue.MTS;
}
@LayoutRes
@Override
int getLayoutId()
{
return R.layout.onmap_downloader_banner;
}
},
SKYENG(new DownloaderBannerConfigStrategyPartner(R.drawable.ic_logo_skyeng,
R.string.skyeng_map_downloader_title,
R.string.skyeng_map_downloader_cta_button,
R.color.white_primary,
R.color.skyeng_button))
{
@NonNull
@Override
public String toStatisticValue()
{
return Statistics.ParamValue.SKYENG;
}
@LayoutRes
@Override
int getLayoutId()
{
return R.layout.onmap_downloader_banner;
}
},
BOOKMARK_CATALOG(new DownloaderBannerConfigStrategyDefault())
{
@NonNull
@Override
public String toStatisticValue()
{
return Statistics.ParamValue.MAPSME_GUIDES;
}
@Override
void onAction(@NonNull Activity context, @NonNull String url)
{
BookmarksCatalogActivity.startForResult(context,
BookmarkCategoriesActivity.REQ_CODE_DOWNLOAD_BOOKMARK_CATEGORY,
url);
}
@LayoutRes
@Override
int getLayoutId()
{
return R.layout.onmap_downloader_catalog_banner;
}
},
MASTERCARD_SBERBANK(new DownloaderBannerConfigStrategyPartner(R.drawable.ic_logo_mastercard_sberbank,
R.string.sberbank_map_downloader_title,
R.string.sberbank_map_downloader_cta_button,
R.color.white_primary,
R.color.mastercard_sberbank_button))
{
@NonNull
@Override
public String toStatisticValue()
{
return Statistics.ParamValue.MASTERCARD_SBERBANK;
}
@LayoutRes
@Override
int getLayoutId()
{
return R.layout.onmap_downloader_banner_big_logo;
}
},
ARSENAL_MEDIC(new DownloaderBannerConfigStrategyPartner(R.drawable.ic_logo_arsenal,
R.string.arsenal_telemed_map_downloader_title,
R.string.arsenal_cta_button,
R.color.white_primary,
R.color.arsenal_button))
{
@NonNull
@Override
public String toStatisticValue()
{
return Statistics.ParamValue.ARSENAL_MEDIC;
}
@LayoutRes
@Override
int getLayoutId()
{
return R.layout.onmap_downloader_banner;
}
},
ARSENAL_FLAT(new DownloaderBannerConfigStrategyPartner(R.drawable.ic_logo_arsenal,
R.string.arsenal_flat_map_downloader_title,
R.string.arsenal_cta_button,
R.color.white_primary,
R.color.arsenal_button))
{
@NonNull
@Override
public String toStatisticValue()
{
return Statistics.ParamValue.ARSENAL_FLAT;
}
@LayoutRes
@Override
int getLayoutId()
{
return R.layout.onmap_downloader_banner;
}
},
ARSENAL_INSURANCE_CRIMEA(new DownloaderBannerConfigStrategyPartner(R.drawable.ic_logo_arsenal,
R.string.arsenal_crimea_map_downloader_title,
R.string.arsenal_cta_button,
R.color.white_primary,
R.color.arsenal_button))
{
@NonNull
@Override
public String toStatisticValue()
{
return Statistics.ParamValue.ARSENAL_INSURANCE_CRIMEA;
}
@LayoutRes
@Override
int getLayoutId()
{
return R.layout.onmap_downloader_banner;
}
},
ARSENAL_INSURANCE_RUSSIA(new DownloaderBannerConfigStrategyPartner(R.drawable.ic_logo_arsenal,
R.string.arsenal_russia_map_downloader_title,
R.string.arsenal_cta_button,
R.color.white_primary,
R.color.arsenal_button))
{
@NonNull
@Override
public String toStatisticValue()
{
return Statistics.ParamValue.ARSENAL_INSURANCE_RUSSIA;
}
@LayoutRes
@Override
int getLayoutId()
{
return R.layout.onmap_downloader_banner;
}
},
ARSENAL_INSURANCE_WORLD(new DownloaderBannerConfigStrategyPartner(R.drawable.ic_logo_arsenal,
R.string.arsenal_abroad_map_downloader_title,
R.string.arsenal_cta_button,
R.color.white_primary,
R.color.arsenal_button))
{
@NonNull
@Override
public String toStatisticValue()
{
return Statistics.ParamValue.ARSENAL_INSURANCE_WORLD;
}
@LayoutRes
@Override
int getLayoutId()
{
return R.layout.onmap_downloader_banner;
}
};
@NonNull
private final DownloaderBannerConfigStrategy mViewConfigStrategy;
DownloaderBannerType(@NonNull DownloaderBannerConfigStrategy viewConfigStrategy)
{
mViewConfigStrategy = viewConfigStrategy;
}
@NonNull
DownloaderBannerConfigStrategy getViewConfigStrategy()
{
return mViewConfigStrategy;
}
void onAction(@NonNull Activity context, @NonNull String url)
{
Utils.openUrl(context, url);
}
@LayoutRes
abstract int getLayoutId();
}

Some files were not shown because too many files have changed in this diff Show more