summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndroid Build Coastguard Worker <android-build-coastguard-worker@google.com>2021-08-22 10:17:49 +0000
committerAndroid Build Coastguard Worker <android-build-coastguard-worker@google.com>2021-08-22 10:17:49 +0000
commit5bb65f197840a4e283efe52d4c2df4a06e6175c0 (patch)
tree40d7f14673987d3dfc895efe287f46fed913e183
parentc92283518936fffb997574d3eab22ee86aa2ec92 (diff)
parent304410e63a5426aa480a450f7386b3e1ff240096 (diff)
downloadicu-androidx-wear-wear-phone-interactions-release.tar.gz
Snap for 7663505 from 304410e63a5426aa480a450f7386b3e1ff240096 to androidx-wear-wear-phone-interactions-releaseandroidx-wear-wear-phone-interactions-release
Change-Id: I8b22f72fdece65d9bc1597d76acbb003e30c52f5
-rw-r--r--android_icu4j/api/legacy_platform/current.txt1
-rw-r--r--android_icu4j/libcore_bridge/src/java/com/android/i18n/timezone/CountryZonesFinder.java43
-rw-r--r--android_icu4j/testing/src/com/android/i18n/test/timezone/CountryZonesFinderTest.java44
-rw-r--r--icu4c/source/common/CMakeLists.txt52
-rw-r--r--icu4c/source/i18n/CMakeLists.txt42
-rw-r--r--icu4c/source/stubdata/Android.mk4
-rw-r--r--icu4c/source/stubdata/CMakeLists.txt36
-rw-r--r--libandroidicu/CMakeLists.txt41
-rw-r--r--libandroidicu/static_shim/CMakeLists.txt48
-rw-r--r--libandroidicuinit/CMakeLists.txt40
-rw-r--r--libandroidicuinit/IcuRegistration.cpp10
-rw-r--r--libandroidicuinit/IcuRegistration.h9
-rw-r--r--libandroidicuinit/android_icu_init.cpp10
13 files changed, 316 insertions, 64 deletions
diff --git a/android_icu4j/api/legacy_platform/current.txt b/android_icu4j/api/legacy_platform/current.txt
index a81a0c650..692b2b1bf 100644
--- a/android_icu4j/api/legacy_platform/current.txt
+++ b/android_icu4j/api/legacy_platform/current.txt
@@ -81,6 +81,7 @@ package com.android.i18n.timezone {
}
public final class CountryZonesFinder {
+ method @Nullable public String findCanonicalTimeZoneId(String);
method public java.util.List<java.lang.String> lookupAllCountryIsoCodes();
method public com.android.i18n.timezone.CountryTimeZones lookupCountryTimeZones(String);
method public java.util.List<com.android.i18n.timezone.CountryTimeZones> lookupCountryTimeZonesForZoneId(String);
diff --git a/android_icu4j/libcore_bridge/src/java/com/android/i18n/timezone/CountryZonesFinder.java b/android_icu4j/libcore_bridge/src/java/com/android/i18n/timezone/CountryZonesFinder.java
index 80a316e1f..61d9a1895 100644
--- a/android_icu4j/libcore_bridge/src/java/com/android/i18n/timezone/CountryZonesFinder.java
+++ b/android_icu4j/libcore_bridge/src/java/com/android/i18n/timezone/CountryZonesFinder.java
@@ -19,6 +19,7 @@ package com.android.i18n.timezone;
import static com.android.i18n.timezone.XmlUtils.normalizeCountryIso;
import com.android.i18n.timezone.CountryTimeZones.TimeZoneMapping;
+import libcore.util.Nullable;
import java.util.ArrayList;
import java.util.Collections;
@@ -57,10 +58,11 @@ public final class CountryZonesFinder {
/**
* Returns an immutable list of {@link CountryTimeZones} for countries that use the specified
- * time zone. An exact, case-sensitive match is performed on the zone ID. If the match but the method also
- * checks for alternative zone IDs. This method never returns null and will usually return a
- * list containing a single element. It can return an empty list if the zone ID is
- * not recognized or it is not associated with a country.
+ * time zone. An exact, case-sensitive match is performed on the zone ID. Search is done
+ * over currently used time zone IDs and also over no longer used deprecated(alternative) IDs.
+ * This method never returns null and will usually return a list containing a single element.
+ * It can return an empty list if the zone ID is not recognized or it is not associated with a
+ * country.
*/
@libcore.api.CorePlatformApi
public List<CountryTimeZones> lookupCountryTimeZonesForZoneId(String zoneId) {
@@ -104,4 +106,37 @@ public final class CountryZonesFinder {
}
return null;
}
+
+ /**
+ * Returns a canonical time zone ID for the {@code timeZoneId} specified. It is intended for use
+ * when behavioral equivalence of time zones needs to be determined.
+ *
+ * <p>When a time zone ID is returned, it is guaranteed to have the same offset / daylight
+ * savings behavior as the argument, but it might be used in a different country and could
+ * have different I18N properties like display name. The original {@code timeZoneId} will
+ * often be returned.
+ *
+ * <p>If {@code timeZoneId} is unknown or not associated with a country, {@code null} is
+ * returned. e.g. time zones such as Etc/GMT+-XX.
+ *
+ * This method behavior is based on tzlookup.xml file and works with Olson IDs attached to
+ * countries, unlike {@link android.icu.util.TimeZone} which works with wider set of arguments.
+ */
+ @libcore.api.CorePlatformApi
+ @Nullable
+ public String findCanonicalTimeZoneId(String timeZoneId) {
+ for (CountryTimeZones countryTimeZones : countryTimeZonesList) {
+
+ // notafter is ignored as timeZoneId might be deprecated a while ago
+ List<TimeZoneMapping> countryTimeZoneMappings = countryTimeZones.getTimeZoneMappings();
+ for (TimeZoneMapping timeZoneMapping : countryTimeZoneMappings) {
+ if (timeZoneMapping.getTimeZoneId().equals(timeZoneId)
+ || timeZoneMapping.getAlternativeIds().contains(timeZoneId)) {
+ return timeZoneMapping.getTimeZoneId();
+ }
+ }
+ }
+
+ return null;
+ }
}
diff --git a/android_icu4j/testing/src/com/android/i18n/test/timezone/CountryZonesFinderTest.java b/android_icu4j/testing/src/com/android/i18n/test/timezone/CountryZonesFinderTest.java
index 64ec0fd0d..549c8899f 100644
--- a/android_icu4j/testing/src/com/android/i18n/test/timezone/CountryZonesFinderTest.java
+++ b/android_icu4j/testing/src/com/android/i18n/test/timezone/CountryZonesFinderTest.java
@@ -16,22 +16,26 @@
package com.android.i18n.test.timezone;
-import org.junit.Test;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertNull;
+import static org.junit.Assert.assertSame;
+import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.fail;
+
+import android.icu.testsharding.MainTestShard;
-import java.util.Arrays;
-import java.util.Collections;
-import java.util.List;
-import java.util.stream.Collectors;
import com.android.i18n.timezone.CountryTimeZones;
import com.android.i18n.timezone.CountryTimeZones.TimeZoneMapping;
import com.android.i18n.timezone.CountryZonesFinder;
-import android.icu.testsharding.MainTestShard;
+import org.junit.Test;
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNull;
-import static org.junit.Assert.assertSame;
-import static org.junit.Assert.fail;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.List;
+import java.util.Optional;
+import java.util.stream.Collectors;
@MainTestShard
public class CountryZonesFinderTest {
@@ -119,6 +123,26 @@ public class CountryZonesFinderTest {
assertNull(countryZonesFinder.lookupCountryTimeZones("DOES_NOT_EXIST"));
}
+ @Test
+ public void findCanonicalTimeZoneId() {
+ TimeZoneMapping usesNewZoneId = timeZoneMappingWithAlts("America/Detroit",
+ list("US/Michigan"));
+ TimeZoneMapping usesOldZoneId = timeZoneMappingWithAlts("US/Central",
+ list("America/Chicago"));
+ CountryTimeZones countryWithAlternativeZones = CountryTimeZones.createValidated(
+ "us", "America/Detroit" /* defaultTimeZoneId */, false /* defaultTimeZoneBoost */,
+ false /* everUsesUtc */,
+ list(usesNewZoneId, usesOldZoneId),
+ "debug info");
+ CountryZonesFinder countryZonesFinder =
+ CountryZonesFinder.createForTests(list(countryWithAlternativeZones));
+
+ assertEquals(countryZonesFinder.findCanonicalTimeZoneId("America/Chicago"), "US/Central");
+ assertEquals(countryZonesFinder.findCanonicalTimeZoneId("US/Michigan"), "America/Detroit");
+ assertEquals(countryZonesFinder.findCanonicalTimeZoneId("America/Detroit"), "America/Detroit");
+ assertNull(countryZonesFinder.findCanonicalTimeZoneId("Mars/Base"));
+ }
+
private static <X> void assertEqualsAndImmutable(List<X> expected, List<X> actual) {
assertEquals(expected, actual);
assertImmutableList(actual);
diff --git a/icu4c/source/common/CMakeLists.txt b/icu4c/source/common/CMakeLists.txt
new file mode 100644
index 000000000..8ff8bced7
--- /dev/null
+++ b/icu4c/source/common/CMakeLists.txt
@@ -0,0 +1,52 @@
+# Minimum CMake required
+cmake_minimum_required(VERSION 3.1.3)
+
+# Project
+project(icuuc C CXX)
+
+add_definitions("-DANDROID_LINK_SHARED_ICU4C")
+add_definitions("-DU_COMMON_IMPLEMENTATION")
+add_definitions("-D_REENTRANT")
+
+# To suppress deprecated declarations for 'uidna_toASCII_68'
+add_definitions("-Wno-deprecated-declarations")
+
+# Compile icuuc_stubdata
+set(ICUUC_STUB_SOURCE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/../stubdata")
+set(ICUUC_STUB_TARGET_BINARY_DIR "${CMAKE_CURRENT_BINARY_DIR}/libicuuc_stubdata-target")
+add_subdirectory(${ICUUC_STUB_SOURCE_DIR} ${ICUUC_STUB_TARGET_BINARY_DIR})
+
+# Compile androidicuinit
+set(ANDROIDICUINIT_SOURCE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/../../../libandroidicuinit")
+set(ANDROIDICUINIT_TARGET_BINARY_DIR "${CMAKE_CURRENT_BINARY_DIR}/androidicu_init-target")
+add_subdirectory(${ANDROIDICUINIT_SOURCE_DIR} ${ANDROIDICUINIT_TARGET_BINARY_DIR})
+
+# Add android_icu4c headers
+set(ICU_CONFIG_LOCAL_SOURCE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/../../../android_icu4c/include")
+
+# Glob icu common source files
+file(
+ GLOB_RECURSE
+ ICU_COMMON_CC_SOURCES
+ RELATIVE ${CMAKE_CURRENT_SOURCE_DIR}
+ "*.h" "*.cpp"
+)
+message(STATUS "ICU_COMMON_CC_SOURCES=${ICU_COMMON_CC_SOURCES}")
+
+add_library(
+ # name
+ icuuc
+
+ # SHARED or STATIC
+ STATIC
+
+ # Provides a relative path to your source file(s).
+ ${ICU_COMMON_CC_SOURCES}
+)
+target_include_directories(icuuc PRIVATE ${CMAKE_CURRENT_SOURCE_DIR})
+target_include_directories(icuuc PRIVATE ${ICU_CONFIG_LOCAL_SOURCE_DIR})
+target_include_directories(icuuc PRIVATE "${ANDROIDICUINIT_SOURCE_DIR}/include")
+target_link_libraries(icuuc icuuc_stubdata androidicuinit)
+
+set_target_properties(icuuc PROPERTIES LINKER_LANGUAGE CXX)
+
diff --git a/icu4c/source/i18n/CMakeLists.txt b/icu4c/source/i18n/CMakeLists.txt
new file mode 100644
index 000000000..8e7a2b389
--- /dev/null
+++ b/icu4c/source/i18n/CMakeLists.txt
@@ -0,0 +1,42 @@
+# Minimum CMake required
+cmake_minimum_required(VERSION 3.1.3)
+
+# Project
+project(icui18n C CXX)
+
+add_definitions("-DU_I18N_IMPLEMENTATION")
+add_definitions("-D_REENTRANT")
+
+# Add other source dirs that icuuc uses
+set(ICU_CONFIG_LOCAL_SOURCE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/../../../android_icu4c/include")
+
+# Compile icuuc
+set(ICUUC_SOURCE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/../common")
+set(ICUUC_TARGET_BINARY_DIR "${CMAKE_CURRENT_BINARY_DIR}/libicuuc-target")
+add_subdirectory(${ICUUC_SOURCE_DIR} ${ICUUC_TARGET_BINARY_DIR})
+
+# Glob icu common source files
+file(
+ GLOB_RECURSE
+ ICU_I18N_CC_SOURCES
+ RELATIVE ${CMAKE_CURRENT_SOURCE_DIR}
+ "*.h" "*.cpp"
+)
+message(STATUS "ICU_I18N_CC_SOURCES=${ICU_I18N_CC_SOURCES}")
+
+add_library(
+ # name
+ icui18n
+
+ # SHARED or STATIC
+ STATIC
+
+ # Provides a relative path to your source file(s).
+ ${ICU_I18N_CC_SOURCES}
+)
+target_include_directories(icui18n PRIVATE ${CMAKE_CURRENT_SOURCE_DIR})
+target_include_directories(icui18n PRIVATE ${ICUUC_SOURCE_DIR})
+target_include_directories(icui18n PRIVATE ${ICU_CONFIG_LOCAL_SOURCE_DIR})
+target_link_libraries(icui18n icuuc)
+
+set_target_properties(icui18n PROPERTIES LINKER_LANGUAGE CXX)
diff --git a/icu4c/source/stubdata/Android.mk b/icu4c/source/stubdata/Android.mk
index 3dd824936..b3db1d9b7 100644
--- a/icu4c/source/stubdata/Android.mk
+++ b/icu4c/source/stubdata/Android.mk
@@ -35,7 +35,9 @@ LOCAL_SRC_FILES := $(dat_file)
LOCAL_IS_HOST_MODULE := true
include $(BUILD_PREBUILT)
-$(call dist-for-goals, layoutlib, $(LOCAL_MODULE_PATH)/$(dat_file):layoutlib_native/icu/$(dat_file))
+ifneq (,$(wildcard frameworks/layoutlib))
+ $(call dist-for-goals, layoutlib, $(LOCAL_MODULE_PATH)/$(dat_file):layoutlib_native/icu/$(dat_file))
+endif
# Module definition producing ICU .dat prebuilt files in
# /system/etc/icu for standalone ART testing purposes. This is a
diff --git a/icu4c/source/stubdata/CMakeLists.txt b/icu4c/source/stubdata/CMakeLists.txt
new file mode 100644
index 000000000..9ffaa505a
--- /dev/null
+++ b/icu4c/source/stubdata/CMakeLists.txt
@@ -0,0 +1,36 @@
+# Minimum CMake required
+cmake_minimum_required(VERSION 3.1.3)
+
+# Project
+project(icuuc_stubdata C CXX)
+
+add_definitions("-DANDROID_LINK_SHARED_ICU4C")
+
+# Glob icu stub source files
+file(
+ GLOB_RECURSE
+ ICU_STUB_CC_SOURCES
+ RELATIVE ${CMAKE_CURRENT_SOURCE_DIR}
+ "*.h" "*.cpp"
+)
+message(STATUS "ICU_STUB_CC_SOURCES=${ICU_STUB_CC_SOURCES}")
+
+# Add icuuc, android_icu4c headers
+set(ICU_COMMON_SOURCE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/../common")
+set(ICU_CONFIG_LOCAL_SOURCE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/../../../android_icu4c/include")
+
+add_library(
+ # name
+ icuuc_stubdata
+
+ # SHARED or STATIC
+ STATIC
+
+ # Provides a relative path to your source file(s).
+ ${ICU_STUB_CC_SOURCES}
+)
+target_include_directories(icuuc_stubdata PRIVATE ${CMAKE_CURRENT_SOURCE_DIR})
+target_include_directories(icuuc_stubdata PRIVATE ${ICU_COMMON_SOURCE_DIR})
+target_include_directories(icuuc_stubdata PRIVATE ${ICU_CONFIG_LOCAL_SOURCE_DIR})
+
+set_target_properties(icuuc_stubdata PROPERTIES LINKER_LANGUAGE CXX)
diff --git a/libandroidicu/CMakeLists.txt b/libandroidicu/CMakeLists.txt
deleted file mode 100644
index 60d2d07e9..000000000
--- a/libandroidicu/CMakeLists.txt
+++ /dev/null
@@ -1,41 +0,0 @@
-# Minimum CMake required
-cmake_minimum_required(VERSION 3.1.3)
-
-# Project
-project(libandroidicu C CXX)
-
-set(ICU_SOURCE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/include")
-set(ICU_SHIM_SOURCE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/static_shim")
-
-# Glob icu source files
-file(
- GLOB_RECURSE
- ICU_CC_SOURCES
- "${ICU_SOURCE_DIR}/*.cpp"
- "${ICU_SOURCE_DIR}/*.h"
-)
-message(STATUS "ICU_CC_SOURCES=${ICU_CC_SOURCES}")
-
-file(
- GLOB_RECURSE
- ICU_CC_SHIM_SOURCES
- "${ICU_SHIM_SOURCE_DIR}/*.cpp"
- "${ICU_SHIM_SOURCE_DIR}/*.h"
-)
-message(STATUS "ICU_CC_SHIM_SOURCES=${ICU_CC_SHIM_SOURCES}")
-
-add_library(
- # name
- libandroidicu
-
- # SHARED or STATIC
- STATIC
-
- # Provides a relative path to your source file(s).
- ${ICU_CC_SOURCES}
- ${ICU_CC_SHIM_SOURCES}
-)
-target_include_directories(libandroidicu PRIVATE ${ICU_SOURCE_DIR})
-target_include_directories(libandroidicu PRIVATE ${ICU_SHIM_SOURCE_DIR})
-
-set_target_properties(libandroidicu PROPERTIES LINKER_LANGUAGE CXX)
diff --git a/libandroidicu/static_shim/CMakeLists.txt b/libandroidicu/static_shim/CMakeLists.txt
new file mode 100644
index 000000000..472f3d88a
--- /dev/null
+++ b/libandroidicu/static_shim/CMakeLists.txt
@@ -0,0 +1,48 @@
+# Minimum CMake required
+cmake_minimum_required(VERSION 3.1.3)
+
+# Project
+project(libandroidicu C CXX)
+
+add_definitions("-DANDROID_LINK_SHARED_ICU4C")
+
+# Add other source dirs that icuuc uses
+set(ICU_CONFIG_LOCAL_SOURCE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/../../android_icu4c/include")
+
+# Compile icuuc
+set(ICUUC_SOURCE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/../../icu4c/source/common")
+
+# Compile icui18n
+set(ICU_I18N_SOURCE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/../../icu4c/source/i18n")
+set(ICU_I18N_TARGET_BINARY_DIR "${CMAKE_CURRENT_BINARY_DIR}/libicui18n-target")
+add_subdirectory(${ICU_I18N_SOURCE_DIR} ${ICU_I18N_TARGET_BINARY_DIR})
+
+# Glob shim sources
+set(ICU_SHIM_SOURCE_DIR "${CMAKE_CURRENT_SOURCE_DIR}")
+file(
+ GLOB_RECURSE
+ ICU_STATIC_SHIM_CC_SOURCES
+ RELATIVE ${CMAKE_CURRENT_SOURCE_DIR}
+ "${ICU_SHIM_SOURCE_DIR}/*.cpp"
+ "${ICU_SHIM_SOURCE_DIR}/*.h"
+)
+message(STATUS "ICU_STATIC_SHIM_CC_SOURCES=${ICU_STATIC_SHIM_CC_SOURCES}")
+
+add_library(
+ # name
+ libandroidicu
+
+ # SHARED or STATIC
+ STATIC
+
+ # Provides a relative path to your source file(s).
+ ${ICU_STATIC_SHIM_CC_SOURCES}
+)
+target_include_directories(libandroidicu PRIVATE ${ICUUC_SOURCE_DIR})
+target_include_directories(libandroidicu PRIVATE ${ICU_CONFIG_LOCAL_SOURCE_DIR})
+target_include_directories(libandroidicu PRIVATE ${ICU_I18N_SOURCE_DIR})
+target_include_directories(libandroidicu PRIVATE ${ICU_STATIC_SHIM_CC_SOURCES})
+target_link_libraries(libandroidicu icui18n)
+
+set_target_properties(libandroidicu PROPERTIES LINKER_LANGUAGE CXX)
+
diff --git a/libandroidicuinit/CMakeLists.txt b/libandroidicuinit/CMakeLists.txt
new file mode 100644
index 000000000..53bce3a94
--- /dev/null
+++ b/libandroidicuinit/CMakeLists.txt
@@ -0,0 +1,40 @@
+# Minimum CMake required
+cmake_minimum_required(VERSION 3.1.3)
+
+# Project
+project(androidicuinit C CXX)
+
+add_definitions("-DANDROID_LINK_SHARED_ICU4C")
+add_definitions("-DANDROID_ICU_NO_DAT")
+add_definitions("-DNO_ANDROID_LIBLOG")
+
+# Glob libandroidicuinit source files
+file(
+ GLOB_RECURSE
+ ANDROIDICU_INIT_CC_SOURCES
+ RELATIVE ${CMAKE_CURRENT_SOURCE_DIR}
+ "${CMAKE_CURRENT_SOURCE_DIR}/*.h"
+ "${CMAKE_CURRENT_SOURCE_DIR}/*.cpp"
+)
+message(STATUS "ANDROIDICU_INIT_CC_SOURCES=${ANDROIDICU_INIT_CC_SOURCES}")
+
+# Add icuuc, android_icu4c headers
+set(ICU_COMMON_SOURCE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/../icu4c/source/common")
+set(ICU_CONFIG_LOCAL_SOURCE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/../android_icu4c/include")
+
+add_library(
+ # name
+ androidicuinit
+
+ # SHARED or STATIC
+ STATIC
+
+ # Provides a relative path to your source file(s).
+ ${ANDROIDICU_INIT_CC_SOURCES}
+)
+target_include_directories(androidicuinit PRIVATE ${CMAKE_CURRENT_SOURCE_DIR})
+target_include_directories(androidicuinit PRIVATE "${CMAKE_CURRENT_SOURCE_DIR}/include")
+target_include_directories(androidicuinit PRIVATE ${ICU_COMMON_SOURCE_DIR})
+target_include_directories(androidicuinit PRIVATE ${ICU_CONFIG_LOCAL_SOURCE_DIR})
+
+set_target_properties(androidicuinit PROPERTIES LINKER_LANGUAGE CXX)
diff --git a/libandroidicuinit/IcuRegistration.cpp b/libandroidicuinit/IcuRegistration.cpp
index 195318de5..1d68e4c05 100644
--- a/libandroidicuinit/IcuRegistration.cpp
+++ b/libandroidicuinit/IcuRegistration.cpp
@@ -27,7 +27,7 @@
#include <unicode/udata.h>
#include <unicode/utypes.h>
-#ifndef __ANDROID__
+#if !defined(__ANDROID__) || defined(NO_ANDROID_LIBLOG)
static int PriorityToLevel(char priority) {
// Priority is just the array index of priority in kPriorities.
static const char* kPriorities = "VDIWEF";
@@ -57,12 +57,12 @@ bool AIcuHostShouldLog(char priority) {
static int g_LogLevel = GetHostLogLevel();
return PriorityToLevel(priority) >= g_LogLevel;
}
-#endif // __ANDROID__
+#endif // !defined(__ANDROID__) || defined(NO_ANDROID_LIBLOG)
namespace androidicuinit {
namespace impl {
-#ifndef __ANDROID__
+#if !defined(__ANDROID__) || defined(NO_ANDROID_LIBLOG)
// http://b/171371690 Avoid dependency on liblog and libbase on host
// Simplified version of android::base::unique_fd for host.
class simple_unique_fd final {
@@ -103,10 +103,10 @@ class simple_unique_fd final {
_rc; \
})
#endif
-#endif // #ifndef __ANDROID__
+#endif // !defined(__ANDROID__) || defined(NO_ANDROID_LIBLOG)
// http://b/171371690 Avoid dependency on liblog and libbase on host
-#ifdef __ANDROID__
+#if defined(__ANDROID__) && !defined(NO_ANDROID_LIBLOG)
typedef android::base::unique_fd aicu_unique_fd;
#else
typedef simple_unique_fd aicu_unique_fd;
diff --git a/libandroidicuinit/IcuRegistration.h b/libandroidicuinit/IcuRegistration.h
index ded6f5bf9..ca8007bbb 100644
--- a/libandroidicuinit/IcuRegistration.h
+++ b/libandroidicuinit/IcuRegistration.h
@@ -21,7 +21,14 @@
#include <string>
#include <cstdio>
-#ifdef __ANDROID__
+
+/**
+ * def NO_ANDROID_LOGGING
+ * This flag turns off the usage of liblog, and logs into stderr instead.
+ * This is not expected to be used in Android platform build, but is useful
+ * when building this ICU4C for unbundled library or app.
+ */
+#if defined(__ANDROID__) && !defined(NO_ANDROID_LIBLOG)
#include <android-base/logging.h>
#include <android-base/unique_fd.h>
#include <log/log.h>
diff --git a/libandroidicuinit/android_icu_init.cpp b/libandroidicuinit/android_icu_init.cpp
index 575370388..71fcec67e 100644
--- a/libandroidicuinit/android_icu_init.cpp
+++ b/libandroidicuinit/android_icu_init.cpp
@@ -24,7 +24,13 @@ void android_icu_init() {
// We know that the environment variables are exported early in init.environ.rc on Android.
#ifdef __ANDROID__
- runAndroidInit = true;
+ #ifdef ANDROID_ICU_NO_DAT
+ // If we're intentionally building ICU on Android without the .dat file, no
+ // need to run init.
+ runAndroidInit = false;
+ #else // !ANDROID_ICU_NO_DAT
+ runAndroidInit = true;
+ #endif
#else // ART host testing environment has these env variables set.
runAndroidInit = getenv("ANDROID_DATA") != NULL &&
getenv("ANDROID_TZDATA_ROOT") != NULL &&
@@ -47,4 +53,4 @@ void android_icu_cleanup() {
AICU_LOGW("libicuuc is not initialized and possibly never used, "
"but android_icu_cleanup() is called.");
}
-} \ No newline at end of file
+}