Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(731)

Unified Diff: ui/base/resource/resource_bundle_android.cc

Issue 1187433006: Load language .pak files directly from the apk when using splits (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@locale-res-or-file
Patch Set: was totally broken. Created 5 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: ui/base/resource/resource_bundle_android.cc
diff --git a/ui/base/resource/resource_bundle_android.cc b/ui/base/resource/resource_bundle_android.cc
index 587d7385c3e08e1c8f7b24a5b40dd3ce9140aa54..26f21cdf4b9bb5ab170943f7c50997266ed32987 100644
--- a/ui/base/resource/resource_bundle_android.cc
+++ b/ui/base/resource/resource_bundle_android.cc
@@ -8,7 +8,10 @@
#include "base/android/jni_android.h"
#include "base/android/jni_string.h"
#include "base/logging.h"
+#include "base/metrics/histogram.h"
#include "jni/ResourceBundle_jni.h"
+#include "ui/base/l10n/l10n_util.h"
+#include "ui/base/resource/data_pack.h"
#include "ui/base/resource/resource_bundle.h"
namespace {
@@ -16,8 +19,10 @@ namespace {
// ResourceBundle singleton never closes the handles.
int g_chrome_100_percent_fd = -1;
int g_resources_pack_fd = -1;
+int g_locale_pack_fd = -1;
base::MemoryMappedFile::Region g_chrome_100_percent_region;
base::MemoryMappedFile::Region g_resources_pack_region;
+base::MemoryMappedFile::Region g_locale_pack_region;
bool g_locale_paks_in_apk = false;
}
@@ -39,6 +44,50 @@ bool ResourceBundle::LocaleDataPakExists(const std::string& locale) {
return !GetLocaleFilePath(locale, true).empty();
}
+std::string ResourceBundle::LoadLocaleResources(
+ const std::string& pref_locale) {
+ DCHECK(!locale_resources_data_.get()) << "locale.pak already loaded";
+ DCHECK_EQ(g_locale_pack_fd, -1);
+ std::string app_locale = l10n_util::GetApplicationLocale(pref_locale);
+ if (g_locale_paks_in_apk) {
+ std::string locale_path_within_apk =
+ GetPathForAndroidLocalePakWithinApk(app_locale);
+ if (locale_path_within_apk.empty()) {
+ LOG(WARNING) << "locale_path_within_apk.empty() for locale "
+ << app_locale;
+ return std::string();
+ }
+ g_locale_pack_fd = base::android::OpenApkAsset(locale_path_within_apk,
+ &g_locale_pack_region);
+ } else {
+ base::FilePath locale_file_path = GetOverriddenPakPath();
+ if (locale_file_path.empty())
+ locale_file_path = GetLocaleFilePath(app_locale, true);
+
+ if (locale_file_path.empty()) {
+ // It's possible that there is no locale.pak.
+ LOG(WARNING) << "locale_file_path.empty() for locale " << app_locale;
+ return std::string();
+ }
+ int flags = base::File::FLAG_OPEN | base::File::FLAG_READ;
+ g_locale_pack_fd = base::File(locale_file_path, flags).TakePlatformFile();
+ g_locale_pack_region = base::MemoryMappedFile::Region::kWholeFile;
+ }
+
+ scoped_ptr<DataPack> data_pack(new DataPack(SCALE_FACTOR_100P));
+ if (!data_pack->LoadFromFileRegion(base::File(g_locale_pack_fd),
+ g_locale_pack_region)) {
+ UMA_HISTOGRAM_ENUMERATION("ResourceBundle.LoadLocaleResourcesError",
+ logging::GetLastSystemErrorCode(), 16000);
+ LOG(ERROR) << "failed to load locale.pak";
+ NOTREACHED();
+ return std::string();
+ }
+
+ locale_resources_data_.reset(data_pack.release());
+ return app_locale;
+}
+
gfx::Image& ResourceBundle::GetNativeImageNamed(int resource_id, ImageRTL rtl) {
// Flipped image is not used on Android.
DCHECK_EQ(rtl, RTL_DISABLED);
@@ -49,6 +98,10 @@ void SetLocalePaksStoredInApk(bool value) {
g_locale_paks_in_apk = value;
}
+bool GetLocalePaksStoredInApk() {
+ return g_locale_paks_in_apk;
+}
+
void LoadMainAndroidPackFile() {
DCHECK_EQ(g_resources_pack_fd, -1);
g_resources_pack_fd = base::android::OpenApkAsset("assets/resources.pak",
@@ -71,6 +124,12 @@ int GetCommonResourcesPackFd(base::MemoryMappedFile::Region* out_region) {
return g_chrome_100_percent_fd;
}
+int GetLocalePackFd(base::MemoryMappedFile::Region* out_region) {
+ DCHECK_GE(g_locale_pack_fd, 0);
+ *out_region = g_locale_pack_region;
+ return g_locale_pack_fd;
+}
+
std::string GetPathForAndroidLocalePakWithinApk(const std::string& locale) {
JNIEnv* env = base::android::AttachCurrentThread();
base::android::ScopedJavaLocalRef<jstring> ret =
« ui/base/resource/resource_bundle_android.h ('K') | « ui/base/resource/resource_bundle_android.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698