forked from organicmaps/organicmaps
Added guide ads translations into json file from server.
This commit is contained in:
parent
e15c286424
commit
6481086151
11 changed files with 365 additions and 213 deletions
|
@ -17,6 +17,7 @@
|
|||
#include "../../../../../map/dialog_settings.hpp"
|
||||
|
||||
#include "../../../../../platform/settings.hpp"
|
||||
#include "../../../../../platform/preferred_languages.hpp"
|
||||
|
||||
|
||||
extern "C"
|
||||
|
@ -147,13 +148,16 @@ extern "C"
|
|||
guides::GuideInfo info;
|
||||
if (g_framework->NativeFramework()->GetGuideInfo(storage::toNative(index), info))
|
||||
{
|
||||
const jclass giClazz = env->FindClass("com/mapswithme/maps/guides/GuideInfo");
|
||||
const jmethodID constrId = env->GetMethodID(giClazz, "<init>", "(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V");
|
||||
const jclass giClass = env->FindClass("com/mapswithme/maps/guides/GuideInfo");
|
||||
const jmethodID methodID = env->GetMethodID(giClass,
|
||||
"<init>", "(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V");
|
||||
|
||||
return env->NewObject(giClazz, constrId,
|
||||
jni::ToJavaString(env, info.m_appName),
|
||||
jni::ToJavaString(env, info.m_appId),
|
||||
jni::ToJavaString(env, info.m_appUrl));
|
||||
string const lang = languages::CurrentLanguage();
|
||||
return env->NewObject(giClass, methodID,
|
||||
jni::ToJavaString(env, info.GetAppID()),
|
||||
jni::ToJavaString(env, info.GetURL()),
|
||||
jni::ToJavaString(env, info.GetAdTitle(lang)),
|
||||
jni::ToJavaString(env, info.GetAdMessage(lang)));
|
||||
}
|
||||
|
||||
return 0;
|
||||
|
|
|
@ -5,7 +5,8 @@
|
|||
|
||||
#include "../../../../../std/string.hpp"
|
||||
|
||||
#define DEFAULT_LANG "en"
|
||||
|
||||
static char const * DEFAULT_LANG = "en";
|
||||
|
||||
/// This function is called from native c++ code
|
||||
string GetAndroidSystemLanguage()
|
||||
|
@ -18,27 +19,24 @@ string GetAndroidSystemLanguage()
|
|||
}
|
||||
|
||||
jclass localeClass = env->FindClass("java/util/Locale");
|
||||
ASSERT(localeClass, ("Can't find java class java/util/Locale"));
|
||||
ASSERT(localeClass, ());
|
||||
|
||||
jmethodID localeGetDefaultId = env->GetStaticMethodID(localeClass, "getDefault", "()Ljava/util/Locale;");
|
||||
ASSERT(localeGetDefaultId, ("Can't find static java/util/Locale.getDefault() method"));
|
||||
ASSERT(localeGetDefaultId, ());
|
||||
|
||||
jobject localeInstance = env->CallStaticObjectMethod(localeClass, localeGetDefaultId);
|
||||
ASSERT(localeInstance, ("Locale.getDefault() returned NULL"));
|
||||
ASSERT(localeInstance, ());
|
||||
|
||||
jmethodID localeGetLanguageId = env->GetMethodID(localeClass, "getLanguage", "()Ljava/lang/String;");
|
||||
ASSERT(localeGetLanguageId, ("Can't find java/util/Locale.getLanguage() method"));
|
||||
ASSERT(localeGetLanguageId, ());
|
||||
|
||||
jstring langString = (jstring)env->CallObjectMethod(localeInstance, localeGetLanguageId);
|
||||
ASSERT(langString, ("Locale.getLanguage() returned NULL"));
|
||||
ASSERT(langString, ());
|
||||
|
||||
char const * langUtf8 = env->GetStringUTFChars(langString, 0);
|
||||
string result(DEFAULT_LANG);
|
||||
if (langUtf8 != 0)
|
||||
{
|
||||
result = langUtf8;
|
||||
env->ReleaseStringUTFChars(langString, langUtf8);
|
||||
}
|
||||
string res = jni::ToNativeString(env, langString);
|
||||
if (res.empty())
|
||||
res = DEFAULT_LANG;
|
||||
|
||||
return result;
|
||||
LOG(LDEBUG, ("System language:", res));
|
||||
return res;
|
||||
}
|
||||
|
|
|
@ -91,12 +91,10 @@ public class MWMApplication extends android.app.Application implements MapStorag
|
|||
if (Utils.hasAnyGoogleStoreInstalled())
|
||||
{
|
||||
final GuideInfo info = getGuideInfoForIndex(idx);
|
||||
if (info != null && !GuidesUtils.isGuideInstalled(info.getAppId(), this))
|
||||
if (info != null && !GuidesUtils.isGuideInstalled(info.mAppId, this))
|
||||
{
|
||||
final Notifier notifier = new Notifier(this);
|
||||
notifier.placeGuideAvailable(info.getAppName(),
|
||||
info.getAppId(),
|
||||
getMapStorage().countryName(idx));
|
||||
notifier.placeGuideAvailable(info.mAppId, info.mTitle, info.mMessage);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -86,12 +86,8 @@ public class Notifier
|
|||
.setSmallIcon(R.drawable.ic_notification);
|
||||
}
|
||||
|
||||
public void placeGuideAvailable(String guideName, String packageName, String country)
|
||||
public void placeGuideAvailable(String packageName, String title, String content)
|
||||
{
|
||||
// TODO: Add string resources
|
||||
final String title = mContext.getString(R.string.noti_guide_title, country);
|
||||
final String content = mContext.getString(R.string.noti_guide_content, guideName);
|
||||
|
||||
final PendingIntent pi = PendingIntent
|
||||
.getActivity(mContext, 0, GuidesUtils.getGoogleStoreIntentForPackage(packageName), 0);
|
||||
|
||||
|
|
|
@ -2,29 +2,16 @@ package com.mapswithme.maps.guides;
|
|||
|
||||
public class GuideInfo
|
||||
{
|
||||
private final String mAppName;
|
||||
private final String mAppId;
|
||||
private final String mAppUrl;
|
||||
public final String mAppId;
|
||||
public final String mAppUrl;
|
||||
public final String mTitle;
|
||||
public final String mMessage;
|
||||
|
||||
public GuideInfo(String appName, String appId, String appUrl)
|
||||
public GuideInfo(String appId, String appUrl, String title, String message)
|
||||
{
|
||||
this.mAppName = appName;
|
||||
this.mAppId = appId;
|
||||
this.mAppUrl = appUrl;
|
||||
}
|
||||
|
||||
public String getAppName()
|
||||
{
|
||||
return mAppName;
|
||||
}
|
||||
|
||||
public String getAppId()
|
||||
{
|
||||
return mAppId;
|
||||
}
|
||||
|
||||
public String getAppUrl()
|
||||
{
|
||||
return mAppUrl;
|
||||
this.mTitle = title;
|
||||
this.mMessage = message;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -8,9 +8,13 @@
|
|||
#include <sys/xattr.h>
|
||||
|
||||
#include "Framework.h"
|
||||
|
||||
#include "../../../storage/storage.hpp"
|
||||
|
||||
#include "../../../platform/settings.hpp"
|
||||
#include "../../../platform/platform.hpp"
|
||||
#include "../../../platform/preferred_languages.hpp"
|
||||
|
||||
|
||||
#define NOTIFICATION_ALERT_VIEW_TAG 665
|
||||
|
||||
|
@ -200,7 +204,7 @@ void InitLocalizedStrings()
|
|||
if ([[dict objectForKey:@"Proposal"] isEqual:@"OpenGuides"])
|
||||
{
|
||||
self.lastGuidesUrl = [dict objectForKey:@"GuideUrl"];
|
||||
UIAlertView * view = [[UIAlertView alloc] initWithTitle:@"Guide With Me" message:@"Get GuideWithMe, free travel guide on UK" delegate:self cancelButtonTitle:NSLocalizedString(@"cancel", nil) otherButtonTitles:NSLocalizedString(@"get_it_now", nil), nil];
|
||||
UIAlertView * view = [[UIAlertView alloc] initWithTitle:[dict objectForKey:@"GuideTitle"] message:[dict objectForKey:@"GuideMessage"] delegate:self cancelButtonTitle:NSLocalizedString(@"cancel", nil) otherButtonTitles:NSLocalizedString(@"get_it_now", nil), nil];
|
||||
view.tag = NOTIFICATION_ALERT_VIEW_TAG;
|
||||
[view show];
|
||||
[view release];
|
||||
|
@ -339,23 +343,35 @@ void InitLocalizedStrings()
|
|||
{
|
||||
}
|
||||
|
||||
-(BOOL) ShowNotificationWithGuideInfo:(guides::GuideInfo &)guide
|
||||
-(BOOL) ShowNotificationWithGuideInfo:(guides::GuideInfo const &)guide
|
||||
{
|
||||
guides::GuidesManager guidesManager = GetFramework().GetGuidesManager();
|
||||
bool wasAdvertised = guidesManager.WasAdvertised(guide.m_appId);
|
||||
if (wasAdvertised || [[UIApplication sharedApplication] canOpenURL:[NSURL URLWithString:[NSString stringWithUTF8String:guide.m_appId.c_str()]]])
|
||||
guides::GuidesManager & guidesManager = GetFramework().GetGuidesManager();
|
||||
string const appID = guide.GetAppID();
|
||||
|
||||
if (guidesManager.WasAdvertised(appID) ||
|
||||
[[UIApplication sharedApplication] canOpenURL:[NSURL URLWithString:[NSString stringWithUTF8String:appID.c_str()]]])
|
||||
return NO;
|
||||
|
||||
UILocalNotification * notification = [[UILocalNotification alloc] init];
|
||||
notification.fireDate = [NSDate dateWithTimeIntervalSinceNow:0];
|
||||
notification.repeatInterval = 0;
|
||||
notification.timeZone = [NSTimeZone defaultTimeZone];
|
||||
notification.soundName = UILocalNotificationDefaultSoundName;
|
||||
notification.alertBody = @"Get GuideWithMe, free travel guide on UK";
|
||||
|
||||
notification.userInfo = @{@"Proposal" : @"OpenGuides", @"GuideUrl" : [NSString stringWithUTF8String:guide.m_appUrl.c_str()], @"GuideName" : [NSString stringWithUTF8String:guide.m_appName.c_str()]};
|
||||
string const lang = languages::CurrentLanguage();
|
||||
NSString * message = [NSString stringWithUTF8String:guide.GetAdMessage(lang).c_str()];
|
||||
notification.alertBody = message;
|
||||
notification.userInfo = @{
|
||||
@"Proposal" : @"OpenGuides",
|
||||
@"GuideUrl" : [NSString stringWithUTF8String:guide.GetURL().c_str()],
|
||||
@"GuideTitle" : [NSString stringWithUTF8String:guide.GetAdTitle(lang).c_str()],
|
||||
@"GuideMessage" : message
|
||||
};
|
||||
|
||||
[[UIApplication sharedApplication] scheduleLocalNotification:notification];
|
||||
[notification release];
|
||||
guidesManager.SetWasAdvertised(guide.m_appId);
|
||||
|
||||
guidesManager.SetWasAdvertised(appID);
|
||||
return YES;
|
||||
}
|
||||
|
||||
|
|
|
@ -1723,15 +1723,16 @@ bool Framework::GetGuideInfo(storage::TIndex const & index, guides::GuideInfo &
|
|||
m_storage.GetGuideManager().GetGuideInfo(m_storage.CountryFileName(index), info));
|
||||
}
|
||||
|
||||
void Framework::GetGuidesInfosWithDownloadedMaps(vector <guides::GuideInfo> & guides)
|
||||
void Framework::GetGuidesInfosWithDownloadedMaps(vector<guides::GuideInfo> & guides) const
|
||||
{
|
||||
vector <string> maps;
|
||||
vector<string> maps;
|
||||
GetLocalMaps(maps);
|
||||
|
||||
for (size_t i = 0; i < maps.size(); ++i)
|
||||
{
|
||||
guides::GuideInfo tmp;
|
||||
my::GetNameWithoutExt(maps[i]);
|
||||
if (GetGuidesManager().GetGuideInfo(maps[i], tmp))
|
||||
if (m_storage.GetGuideManager().GetGuideInfo(maps[i], tmp))
|
||||
guides.push_back(tmp);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -55,8 +55,6 @@ class CountryStatusDisplay;
|
|||
class BenchmarkEngine;
|
||||
|
||||
|
||||
|
||||
|
||||
/// Uncomment line to make fixed position settings and
|
||||
/// build version for screenshots.
|
||||
//#define FIXED_LOCATION
|
||||
|
@ -481,7 +479,7 @@ public:
|
|||
/// @name Guides
|
||||
//@{
|
||||
public:
|
||||
guides::GuidesManager & GetGuidesManager();
|
||||
guides::GuidesManager & GetGuidesManager() { return m_storage.GetGuideManager(); }
|
||||
bool GetGuideInfo(storage::TIndex const & index, guides::GuideInfo & info) const;
|
||||
void GetGuidesInfosWithDownloadedMaps(vector<guides::GuideInfo> & guides) const;
|
||||
//@}
|
||||
|
|
|
@ -2,6 +2,7 @@
|
|||
|
||||
#include "../../coding/file_writer.hpp"
|
||||
#include "../../coding/file_reader.hpp"
|
||||
#include "../../coding/internal/file_data.hpp"
|
||||
|
||||
#include "../../platform/platform.hpp"
|
||||
#include "../../platform/settings.hpp"
|
||||
|
@ -16,14 +17,73 @@
|
|||
#include "../../3party/jansson/myjansson.hpp"
|
||||
|
||||
|
||||
namespace
|
||||
{
|
||||
char const * GUIDE_UPDATE_TIME_KEY = "GuideUpdateTime";
|
||||
char const * GUIDE_ADVERTISE_KEY "GuideAdvertised:";
|
||||
char const * GUIDE_ADVERTISE_KEY = "GuideAdvertised:";
|
||||
int const GUIDE_UPDATE_PERIOD = 60 * 60 * 24;
|
||||
|
||||
}
|
||||
|
||||
namespace guides
|
||||
{
|
||||
|
||||
string GetStringImpl(json_t * j)
|
||||
{
|
||||
char const * s = json_string_value(j);
|
||||
return (s ? s : "");
|
||||
}
|
||||
|
||||
string GuideInfo::GetString(char const * key) const
|
||||
{
|
||||
return GetStringImpl(json_object_get(m_obj.get(), key));
|
||||
}
|
||||
|
||||
string GuideInfo::GetAdForLang(string const & lang, char const * key) const
|
||||
{
|
||||
json_t * jKey = json_object_get(m_obj.get(), key);
|
||||
ASSERT(jKey, (key));
|
||||
|
||||
string s = GetStringImpl(json_object_get(jKey, lang.c_str()));
|
||||
if (s.empty())
|
||||
{
|
||||
s = GetStringImpl(json_object_get(jKey, "en"));
|
||||
ASSERT(!s.empty(), ());
|
||||
}
|
||||
return s;
|
||||
}
|
||||
|
||||
string GuideInfo::GetURL() const
|
||||
{
|
||||
return GetString("url");
|
||||
}
|
||||
|
||||
string GuideInfo::GetAppID() const
|
||||
{
|
||||
return GetString("appId");
|
||||
}
|
||||
|
||||
string GuideInfo::GetAdTitle(string const & lang) const
|
||||
{
|
||||
return GetAdForLang(lang, "adTitles");
|
||||
}
|
||||
|
||||
string GuideInfo::GetAdMessage(string const & lang) const
|
||||
{
|
||||
return GetAdForLang(lang, "adMessages");
|
||||
}
|
||||
|
||||
bool GuideInfo::IsValid() const
|
||||
{
|
||||
return (!GetURL().empty() && !GetAppID().empty());
|
||||
}
|
||||
|
||||
string DebugPrint(GuideInfo const & r)
|
||||
{
|
||||
ostringstream ss;
|
||||
ss << "URL: " << r.GetURL() << "; ID: " << r.GetAppID();
|
||||
return ss.str();
|
||||
}
|
||||
|
||||
bool GuidesManager::RestoreFromFile()
|
||||
{
|
||||
try
|
||||
|
@ -58,11 +118,10 @@ void GuidesManager::UpdateGuidesData()
|
|||
}
|
||||
}
|
||||
|
||||
bool GuidesManager::GetGuideInfo(string const & countryId, GuideInfo & appInfo) const
|
||||
bool GuidesManager::GetGuideInfo(string const & id, GuideInfo & appInfo) const
|
||||
{
|
||||
map<string, GuideInfo>::const_iterator const it = m_countryToInfoMapping.find(countryId);
|
||||
|
||||
if (it != m_countryToInfoMapping.end())
|
||||
MapT::const_iterator const it = m_file2Info.find(id);
|
||||
if (it != m_file2Info.end())
|
||||
{
|
||||
appInfo = it->second;
|
||||
return true;
|
||||
|
@ -80,13 +139,35 @@ string GuidesManager::GetDataFileName() const
|
|||
return OMIM_OS_NAME "-" GUIDES_DATA_FILE_SUFFIX;
|
||||
}
|
||||
|
||||
string GuidesManager::GetDataFileFullPath() const
|
||||
{
|
||||
return GetPlatform().WritableDir() + GetDataFileName();
|
||||
}
|
||||
|
||||
void GuidesManager::OnFinish(downloader::HttpRequest & request)
|
||||
{
|
||||
if (request.Status() == downloader::HttpRequest::ECompleted)
|
||||
{
|
||||
string const & data = request.Data();
|
||||
if (ValidateAndParseGuidesData(data))
|
||||
SaveToFile();
|
||||
if (ValidateAndParseGuidesData(data) && !m_file2Info.empty())
|
||||
{
|
||||
// Save only if file was parsed successfully and info exists!
|
||||
|
||||
string const path = GetDataFileFullPath();
|
||||
try
|
||||
{
|
||||
FileWriter writer(path);
|
||||
writer.Write(data.c_str(), data.size());
|
||||
}
|
||||
catch (Writer::Exception const & ex)
|
||||
{
|
||||
LOG(LWARNING, (ex.Msg()));
|
||||
|
||||
// Delete file in case of error
|
||||
// (app will get the default one from bundle on start).
|
||||
(void)my::DeleteFileX(path);
|
||||
}
|
||||
}
|
||||
else
|
||||
LOG(LWARNING, ("Request data is invalid:", request.Data()));
|
||||
}
|
||||
|
@ -98,79 +179,55 @@ void GuidesManager::OnFinish(downloader::HttpRequest & request)
|
|||
|
||||
bool GuidesManager::ValidateAndParseGuidesData(string const & jsonData)
|
||||
{
|
||||
typedef my::Json::Exception ParseException;
|
||||
|
||||
try
|
||||
{
|
||||
my::Json root(jsonData.c_str());
|
||||
void * iter = json_object_iter(root.get());
|
||||
void * iter = json_object_iter(root.get());
|
||||
|
||||
map<string, GuideInfo> temp;
|
||||
MapT temp;
|
||||
while (iter)
|
||||
{
|
||||
char const * key = json_object_iter_key(iter);
|
||||
json_t * value = json_object_get(root.get(), key);
|
||||
|
||||
GuideInfo info;
|
||||
info.m_appId = json_string_value(json_object_get(value, "appId"));
|
||||
info.m_appName = json_string_value(json_object_get(value, "name"));
|
||||
info.m_appUrl = json_string_value(json_object_get(value, "url"));
|
||||
temp[key] = info;
|
||||
json_t * entry = json_object_iter_value(iter);
|
||||
if (entry)
|
||||
{
|
||||
GuideInfo info(entry);
|
||||
if (info.IsValid())
|
||||
{
|
||||
json_t * keys = json_object_get(entry, "keys");
|
||||
for (size_t i = 0; i < json_array_size(keys); ++i)
|
||||
{
|
||||
char const * key = json_string_value(json_array_get(keys, i));
|
||||
if (key)
|
||||
temp[key] = info;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
iter = json_object_iter_next(root.get(), iter);
|
||||
}
|
||||
|
||||
m_countryToInfoMapping.swap(temp);
|
||||
m_file2Info.swap(temp);
|
||||
return true;
|
||||
}
|
||||
catch (my::Json::Exception const &)
|
||||
catch (ParseException const & ex)
|
||||
{
|
||||
LOG(LWARNING, ("Failded to parse guides data."));
|
||||
LOG(LWARNING, ("Failed to parse guides data:", ex.Msg()));
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
bool GuidesManager::WasAdvertised(string const & countryId)
|
||||
bool GuidesManager::WasAdvertised(string const & appID)
|
||||
{
|
||||
bool flag = false;
|
||||
Settings::Get(GUIDE_ADVERTISE_KEY + countryId, flag);
|
||||
Settings::Get(GUIDE_ADVERTISE_KEY + appID, flag);
|
||||
return flag;
|
||||
}
|
||||
|
||||
void GuidesManager::SetWasAdvertised(string const & countryId)
|
||||
void GuidesManager::SetWasAdvertised(string const & appID)
|
||||
{
|
||||
Settings::Set(GUIDE_ADVERTISE_KEY + countryId, true);
|
||||
}
|
||||
|
||||
void GuidesManager::SaveToFile() const
|
||||
{
|
||||
string const path = GetPlatform().WritableDir() + GetDataFileName();
|
||||
FileWriter writer(path);
|
||||
|
||||
char braces[] = { '{', '}' };
|
||||
|
||||
writer.Write(&braces[0], 1);
|
||||
|
||||
if (!m_countryToInfoMapping.empty())
|
||||
{
|
||||
bool isFirst = true;
|
||||
map<string, GuideInfo>::const_iterator it;
|
||||
for (it = m_countryToInfoMapping.begin(); it != m_countryToInfoMapping.end(); ++it)
|
||||
{
|
||||
ostringstream node;
|
||||
node << (isFirst ? "" : " ,");
|
||||
isFirst = false;
|
||||
|
||||
GuideInfo info = it->second;
|
||||
node << "\"" + it->first + "\": {"
|
||||
<< "\"name\": \"" << info.m_appName << "\", "
|
||||
<< "\"url\": \"" << info.m_appUrl << "\", "
|
||||
<< "\"appId\": \"" << info.m_appId << "\"}";
|
||||
|
||||
string const nodeStr = node.str();
|
||||
writer.Write(nodeStr.data(), nodeStr.size());
|
||||
}
|
||||
}
|
||||
|
||||
writer.Write(&braces[1], 1);
|
||||
Settings::Set(GUIDE_ADVERTISE_KEY + appID, true);
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -1,54 +1,72 @@
|
|||
#pragma once
|
||||
|
||||
#include "../platform/http_request.hpp"
|
||||
|
||||
#include "../std/string.hpp"
|
||||
#include "../std/map.hpp"
|
||||
#include "../std/scoped_ptr.hpp"
|
||||
#include "../std/noncopyable.hpp"
|
||||
|
||||
#include "../platform/http_request.hpp"
|
||||
#include "../../3party/jansson/jansson_handle.hpp"
|
||||
|
||||
|
||||
namespace guides
|
||||
{
|
||||
|
||||
struct GuideInfo
|
||||
class GuideInfo
|
||||
{
|
||||
GuideInfo() {}
|
||||
my::JsonHandle m_obj;
|
||||
|
||||
GuideInfo(string const & appName, string const & appUrl, string const & appId)
|
||||
: m_appName(appName), m_appUrl(appUrl), m_appId(appId)
|
||||
{}
|
||||
string GetString(char const * key) const;
|
||||
string GetAdForLang(string const & lang, char const * key) const;
|
||||
|
||||
string m_appName;
|
||||
string m_appUrl;
|
||||
string m_appId;
|
||||
public:
|
||||
GuideInfo(json_struct_t * obj = 0) : m_obj(obj) {}
|
||||
|
||||
bool operator == (GuideInfo const & other) const
|
||||
{
|
||||
return (m_appName == other.m_appName
|
||||
&& m_appId == other.m_appId
|
||||
&& m_appUrl == other.m_appUrl);
|
||||
}
|
||||
string GetURL() const;
|
||||
string GetAppID() const;
|
||||
string GetAdTitle(string const & lang) const;
|
||||
string GetAdMessage(string const & lang) const;
|
||||
|
||||
bool operator == (GuideInfo const & r) const { return (m_obj.get() == r.m_obj.get()); }
|
||||
|
||||
bool IsValid() const;
|
||||
};
|
||||
|
||||
class GuidesManager
|
||||
string DebugPrint(GuideInfo const & r);
|
||||
|
||||
|
||||
class GuidesManager : private noncopyable
|
||||
{
|
||||
/// @name Guides managment
|
||||
//@{
|
||||
public:
|
||||
void UpdateGuidesData();
|
||||
bool RestoreFromFile();
|
||||
void SaveToFile() const;
|
||||
bool GetGuideInfo(string const & countryId, GuideInfo & appInfo) const;
|
||||
|
||||
/// @param[in] id MWM file name without extension as a key.
|
||||
bool GetGuideInfo(string const & id, GuideInfo & appInfo) const;
|
||||
|
||||
/// @param[in] appID Guide app package id.
|
||||
//@{
|
||||
bool WasAdvertised(string const & appID);
|
||||
void SetWasAdvertised(string const & appID);
|
||||
//@}
|
||||
|
||||
bool ValidateAndParseGuidesData(string const & jsonData);
|
||||
bool WasAdvertised(string const & countryId);
|
||||
void SetWasAdvertised(string const & countryId);
|
||||
|
||||
/// Public visibility for unit tests only!
|
||||
string GetDataFileFullPath() const;
|
||||
|
||||
private:
|
||||
void OnFinish(downloader::HttpRequest & request);
|
||||
string GetDataFileName() const;
|
||||
string GetGuidesDataUrl() const;
|
||||
string GetDataFileName() const;
|
||||
|
||||
/// Map from mwm file name (key) to guide info.
|
||||
typedef map<string, GuideInfo> MapT;
|
||||
MapT m_file2Info;
|
||||
|
||||
map<string, GuideInfo> m_countryToInfoMapping;
|
||||
scoped_ptr<downloader::HttpRequest> m_httpRequest;
|
||||
//@}
|
||||
};
|
||||
|
|
|
@ -2,112 +2,191 @@
|
|||
|
||||
#include "../guides.hpp"
|
||||
|
||||
UNIT_TEST(ValidTest)
|
||||
{
|
||||
guides::GuidesManager manager;
|
||||
string str = "{\"Guernsey\":{\"name\": \"UK Travel Guide with Me\",\"url\": \"https://itunes.apple.com/app/uk-travel-guide-with-me/id687855665\",\"appId\": \"com.guideswithme.uk\"}}";
|
||||
#include "../../platform/platform.hpp"
|
||||
|
||||
TEST(!manager.ValidateAndParseGuidesData("invalidtest"), (""));
|
||||
TEST(manager.ValidateAndParseGuidesData("{}"), (""));
|
||||
#include "../../coding/file_writer.hpp"
|
||||
#include "../../coding/file_reader.hpp"
|
||||
|
||||
TEST(manager.ValidateAndParseGuidesData(str),("Has 'Guernsey'"));
|
||||
}
|
||||
|
||||
UNIT_TEST(ParseDataTest)
|
||||
{
|
||||
guides::GuidesManager manager;
|
||||
string str = "{\"Guernsey\":{\"name\": \"UK Travel Guide with Me\",\"url\": \"https://itunes.apple.com/app/uk-travel-guide-with-me/id687855665\",\"appId\": \"com.guideswithme.uk\"}}";
|
||||
string key = "Guernsey";
|
||||
guides::GuideInfo info;
|
||||
|
||||
manager.ValidateAndParseGuidesData("{}");
|
||||
TEST(!manager.GetGuideInfo(key, info), ("Empty data set"));
|
||||
|
||||
manager.ValidateAndParseGuidesData(str);
|
||||
TEST(manager.GetGuideInfo(key, info), ("Has info for Guernsey"));
|
||||
TEST(!manager.GetGuideInfo("Minsk", info), ("Has not info for Minsk"));
|
||||
}
|
||||
|
||||
UNIT_TEST(CorrectlyParseData)
|
||||
UNIT_TEST(Guides_SmokeTest)
|
||||
{
|
||||
guides::GuidesManager manager;
|
||||
guides::GuideInfo info;
|
||||
|
||||
string strLondonIsle = "{\"London\": {\"name\": \"UK Travel Guide with Me\",\"url\": \"https://itunes.apple.com/app/uk-travel-guide-with-me/id687855665\",\"appId\": \"com.guideswithme.uk\"},\"Isle of Man\": {\"name\": \"UK Travel Guide with Me\",\"url\": \"https://play.google.com/store/apps/details?id=com.guidewithme.uk\",\"appId\": \"com.guideswithme.uk\"}}";
|
||||
string validKeys[] = {"London", "Isle of Man"};
|
||||
string invalidKeys[] = {"Minsk", "Blabla"};
|
||||
string str = "{ \"UK\": {"
|
||||
"\"url\": \"https://itunes.apple.com/app/uk-travel-guide-with-me/id687855665\","
|
||||
"\"appId\": \"com.guideswithme.uk\","
|
||||
"\"adTitles\": { \"en\": \"UK title\", \"ru\": \"ВБ заголовок\" },"
|
||||
"\"adMessages\": { \"en\": \"UK message\", \"ru\": \"ВБ сообщение\" },"
|
||||
"\"keys\": [ \"Guernsey\", \"Mercy\" ]"
|
||||
"} }";
|
||||
|
||||
TEST(manager.ValidateAndParseGuidesData(strLondonIsle), ("MUST BE PARSED"));
|
||||
for (int i = 0; i < ARRAY_SIZE(validKeys); ++i)
|
||||
TEST(!manager.ValidateAndParseGuidesData("invalidtest"), ());
|
||||
TEST(manager.ValidateAndParseGuidesData("{}"), ());
|
||||
TEST(!manager.GetGuideInfo("Guernsey", info), ());
|
||||
|
||||
TEST(manager.ValidateAndParseGuidesData(str), ());
|
||||
TEST(manager.GetGuideInfo("Guernsey", info), ());
|
||||
TEST(info.IsValid(), ());
|
||||
|
||||
TEST_EQUAL(info.GetAdTitle("en"), "UK title", ());
|
||||
TEST_EQUAL(info.GetAdMessage("en"), "UK message", ());
|
||||
TEST_EQUAL(info.GetAdTitle("ru"), "ВБ заголовок", ());
|
||||
TEST_EQUAL(info.GetAdMessage("ru"), "ВБ сообщение", ());
|
||||
TEST_EQUAL(info.GetAdTitle("zh"), "UK title", ());
|
||||
TEST_EQUAL(info.GetAdMessage("zh"), "UK message", ());
|
||||
|
||||
guides::GuideInfo info1;
|
||||
TEST(manager.GetGuideInfo("Mercy", info1), ());
|
||||
TEST(info1.IsValid(), ());
|
||||
TEST_EQUAL(info, info1, ());
|
||||
|
||||
TEST(!manager.GetGuideInfo("Minsk", info), ());
|
||||
}
|
||||
|
||||
UNIT_TEST(Guides_CorrectlyParseData)
|
||||
{
|
||||
guides::GuidesManager manager;
|
||||
guides::GuideInfo info;
|
||||
|
||||
string strLondonIsle = "{ \"UK_1\": {"
|
||||
"\"url\": \"https://itunes.apple.com/app/uk-travel-guide-with-me/id687855665\","
|
||||
"\"appId\": \"com.guideswithme.uk\","
|
||||
"\"adTitles\": { \"en\": \"UK title\", \"ru\": \"ВБ заголовок\" },"
|
||||
"\"adMessages\": { \"en\": \"UK message\", \"ru\": \"ВБ сообщение\" },"
|
||||
"\"keys\": [ \"London\" ]"
|
||||
"}, \"UK_2\": {"
|
||||
"\"url\": \"https://play.google.com/store/apps/details?id=com.guidewithme.uk\","
|
||||
"\"appId\": \"com.guideswithme.uk\","
|
||||
"\"adTitles\": { \"en\": \"UK title\", \"ru\": \"ВБ заголовок\" },"
|
||||
"\"adMessages\": { \"en\": \"UK message\", \"ru\": \"ВБ сообщение\" },"
|
||||
"\"keys\": [ \"Isle of Man\" ]"
|
||||
"} }";
|
||||
|
||||
string validKeys[] = { "London", "Isle of Man" };
|
||||
string invalidKeys[] = { "london", "Lond", "Isle", "Man" };
|
||||
|
||||
TEST(manager.ValidateAndParseGuidesData(strLondonIsle), ());
|
||||
for (size_t i = 0; i < ARRAY_SIZE(validKeys); ++i)
|
||||
{
|
||||
string key = validKeys[i];
|
||||
TEST(manager.GetGuideInfo(key, info), ("Has info for:", key));
|
||||
TEST(manager.GetGuideInfo(validKeys[i], info), (i));
|
||||
TEST(info.IsValid(), ());
|
||||
}
|
||||
|
||||
for (int i = 0; i < ARRAY_SIZE(invalidKeys); ++i)
|
||||
{
|
||||
string key = invalidKeys[i];
|
||||
TEST(!manager.GetGuideInfo(key, info), ("Has no info for:", key));
|
||||
}
|
||||
for (size_t i = 0; i < ARRAY_SIZE(invalidKeys); ++i)
|
||||
TEST(!manager.GetGuideInfo(invalidKeys[i], info), (i));
|
||||
|
||||
guides::GuideInfo guidesArray [] =
|
||||
char const * guidesArray[][2] =
|
||||
{
|
||||
guides::GuideInfo("UK Travel Guide with Me", "https://itunes.apple.com/app/uk-travel-guide-with-me/id687855665", "com.guideswithme.uk"),
|
||||
guides::GuideInfo("UK Travel Guide with Me", "https://play.google.com/store/apps/details?id=com.guidewithme.uk", "com.guideswithme.uk")
|
||||
{ "https://itunes.apple.com/app/uk-travel-guide-with-me/id687855665", "com.guideswithme.uk" },
|
||||
{ "https://play.google.com/store/apps/details?id=com.guidewithme.uk", "com.guideswithme.uk" }
|
||||
};
|
||||
for (int i = 0; i < ARRAY_SIZE(validKeys); ++i)
|
||||
|
||||
for (size_t i = 0; i < ARRAY_SIZE(validKeys); ++i)
|
||||
{
|
||||
string key = validKeys[i];
|
||||
manager.GetGuideInfo(key, info);
|
||||
TEST((info == guidesArray[i]), (i));
|
||||
TEST(manager.GetGuideInfo(validKeys[i], info), ());
|
||||
TEST(info.IsValid(), ());
|
||||
TEST_EQUAL(info.GetURL(), guidesArray[i][0], (i));
|
||||
TEST_EQUAL(info.GetAppID(), guidesArray[i][1], (i));
|
||||
}
|
||||
}
|
||||
|
||||
UNIT_TEST(ComplexNames)
|
||||
UNIT_TEST(Guides_ComplexNames)
|
||||
{
|
||||
guides::GuidesManager manager;
|
||||
guides::GuideInfo info;
|
||||
|
||||
string strLondonIsle = "{\"Côte_d'Ivoire\": {\"name\": \"Côte_d'Ivoire Travel Guide with Me\",\"url\": \"https://itunes.apple.com/app/uk-travel-guide-with-me/id687855665\",\"appId\": \"com.guideswithme.uk\"},\"Беларусь\": {\"name\": \"UK Travel Guide with Me\",\"url\": \"https://play.google.com/store/apps/details?id=com.guidewithme.uk\",\"appId\": \"com.guideswithme.uk\"}}";
|
||||
string validKeys[] = {"Côte_d'Ivoire", "Беларусь"};
|
||||
string invalidKeys[] = {"Не Белурусь", "Côte_d'IvoireCôte_d'IvoireCôte_d'Ivoire"};
|
||||
string strLondonIsle = "{\"Côte_d'Ivoire\": {"
|
||||
"\"url\": \"https://itunes.apple.com/app/uk-travel-guide-with-me/id687855665\","
|
||||
"\"appId\": \"com.guideswithme.uk\","
|
||||
"\"adTitles\": { \"en\": \"Côte_d'Ivoire title\", \"ru\": \"КДВар заголовок\" },"
|
||||
"\"adMessages\": { \"en\": \"Côte_d'Ivoire message\", \"ru\": \"КДВар сообщение\" },"
|
||||
"\"keys\": [ \"Côte_d'Ivoire\" ]"
|
||||
"}, \"Беларусь\": {"
|
||||
"\"url\": \"https://play.google.com/store/apps/details?id=com.guidewithme.uk\","
|
||||
"\"appId\": \"com.guideswithme.uk\","
|
||||
"\"adTitles\": { \"en\": \"Belarus title\", \"ru\": \"РБ заголовок\" },"
|
||||
"\"adMessages\": { \"en\": \"Belarus message\", \"ru\": \"РБ сообщение\" },"
|
||||
"\"keys\": [ \"Беларусь\" ]"
|
||||
"} }";
|
||||
|
||||
TEST(manager.ValidateAndParseGuidesData(strLondonIsle), ("MUST BE PARSED"));
|
||||
for (int i = 0; i < ARRAY_SIZE(validKeys); ++i)
|
||||
string validKeys[] = { "Côte_d'Ivoire", "Беларусь" };
|
||||
string invalidKeys[] = { "Не Беларусь", "Côte_d'IvoireCôte_d'IvoireCôte_d'Ivoire" };
|
||||
|
||||
TEST(manager.ValidateAndParseGuidesData(strLondonIsle), ());
|
||||
for (size_t i = 0; i < ARRAY_SIZE(validKeys); ++i)
|
||||
{
|
||||
string key = validKeys[i];
|
||||
TEST(manager.GetGuideInfo(key, info), ("Has info for:", key));
|
||||
TEST(manager.GetGuideInfo(validKeys[i], info), (i));
|
||||
TEST(info.IsValid(), ());
|
||||
}
|
||||
|
||||
for (int i = 0; i < ARRAY_SIZE(invalidKeys); ++i)
|
||||
{
|
||||
string key = invalidKeys[i];
|
||||
TEST(!manager.GetGuideInfo(key, info), ("Has no info for:", key));
|
||||
}
|
||||
for (size_t i = 0; i < ARRAY_SIZE(invalidKeys); ++i)
|
||||
TEST(!manager.GetGuideInfo(invalidKeys[i], info), (i));
|
||||
}
|
||||
|
||||
UNIT_TEST(SaveRestoreFromFile)
|
||||
UNIT_TEST(Guides_SaveRestoreFromFile)
|
||||
{
|
||||
|
||||
guides::GuidesManager manager;
|
||||
guides::GuideInfo info;
|
||||
|
||||
string strLondonIsle = "{\"London\": {\"name\": \"UK Travel Guide with Me\",\"url\": \"https://itunes.apple.com/app/uk-travel-guide-with-me/id687855665\",\"appId\": \"com.guideswithme.uk\"},\"Isle of Man\": {\"name\": \"UK Travel Guide with Me\",\"url\": \"https://play.google.com/store/apps/details?id=com.guidewithme.uk\",\"appId\": \"com.guideswithme.uk\"}}";
|
||||
manager.ValidateAndParseGuidesData(strLondonIsle);
|
||||
manager.SaveToFile();
|
||||
string strLondonIsle = "{ \"UK_1\": {"
|
||||
"\"url\": \"https://itunes.apple.com/app/uk-travel-guide-with-me/id687855665\","
|
||||
"\"appId\": \"com.guideswithme.uk\","
|
||||
"\"adTitles\": { \"en\": \"UK title\", \"ru\": \"ВБ заголовок\" },"
|
||||
"\"adMessages\": { \"en\": \"UK message\", \"ru\": \"ВБ сообщение\" },"
|
||||
"\"keys\": [ \"London\" ]"
|
||||
"}, \"UK_2\": {"
|
||||
"\"url\": \"https://play.google.com/store/apps/details?id=com.guidewithme.uk\","
|
||||
"\"appId\": \"com.guideswithme.uk\","
|
||||
"\"adTitles\": { \"en\": \"UK title\", \"ru\": \"ВБ заголовок\" },"
|
||||
"\"adMessages\": { \"en\": \"UK message\", \"ru\": \"ВБ сообщение\" },"
|
||||
"\"keys\": [ \"Isle of Man\" ]"
|
||||
"} }";
|
||||
|
||||
TEST(manager.RestoreFromFile(), ("File must exist."));
|
||||
TEST(manager.ValidateAndParseGuidesData(strLondonIsle), ());
|
||||
|
||||
string validKeys[] = {"London", "Isle of Man"};
|
||||
guides::GuideInfo guidesArray [] =
|
||||
string const path = manager.GetDataFileFullPath();
|
||||
{
|
||||
guides::GuideInfo("UK Travel Guide with Me", "https://itunes.apple.com/app/uk-travel-guide-with-me/id687855665", "com.guideswithme.uk"),
|
||||
guides::GuideInfo("UK Travel Guide with Me", "https://play.google.com/store/apps/details?id=com.guidewithme.uk", "com.guideswithme.uk")
|
||||
FileWriter writer(path);
|
||||
writer.Write(strLondonIsle.c_str(), strLondonIsle.size());
|
||||
}
|
||||
|
||||
TEST(manager.RestoreFromFile(), ());
|
||||
|
||||
string validKeys[] = { "London", "Isle of Man" };
|
||||
char const * guidesArray [][2] =
|
||||
{
|
||||
{ "https://itunes.apple.com/app/uk-travel-guide-with-me/id687855665", "com.guideswithme.uk" },
|
||||
{ "https://play.google.com/store/apps/details?id=com.guidewithme.uk", "com.guideswithme.uk" }
|
||||
};
|
||||
for (int i = 0; i < ARRAY_SIZE(validKeys); ++i)
|
||||
|
||||
for (size_t i = 0; i < ARRAY_SIZE(validKeys); ++i)
|
||||
{
|
||||
string key = validKeys[i];
|
||||
manager.GetGuideInfo(key, info);
|
||||
TEST((info == guidesArray[i]), (i));
|
||||
TEST(manager.GetGuideInfo(validKeys[i], info), (i));
|
||||
TEST(info.IsValid(), ());
|
||||
TEST_EQUAL(info.GetURL(), guidesArray[i][0], (i));
|
||||
TEST_EQUAL(info.GetAppID(), guidesArray[i][1], (i));
|
||||
}
|
||||
|
||||
FileWriter::DeleteFileX(path);
|
||||
}
|
||||
|
||||
UNIT_TEST(Guides_CheckDataFiles)
|
||||
{
|
||||
string const path = GetPlatform().WritableDir();
|
||||
string arr[] = { "android-guides.json", "ios-guides.json" };
|
||||
|
||||
guides::GuidesManager manager;
|
||||
guides::GuideInfo info;
|
||||
|
||||
for (size_t i = 0; i < ARRAY_SIZE(arr); ++i)
|
||||
{
|
||||
FileReader reader(path + arr[i]);
|
||||
string str;
|
||||
reader.ReadAsString(str);
|
||||
|
||||
TEST(manager.ValidateAndParseGuidesData(str), ());
|
||||
TEST(manager.GetGuideInfo("UK_England", info), ());
|
||||
TEST(info.IsValid(), ());
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Add table
Reference in a new issue