Skip to content

Commit

Permalink
[Android] Enable access to up-to-date tzdata on Android 10+ (#20349)
Browse files Browse the repository at this point in the history
Context: https://source.android.com/devices/architecture/modular-system/runtime#time-zone-data-interactions
Context: https://source.android.com/devices/tech/config/timezone-rules#timezone-apex
Context: https://android.googlesource.com/platform/frameworks/base/+/a1ae02519d6fb5de636fc8728dec7cb9b14de356
Maybe helps with: xamarin/xamarin-android#5080

Add support to read ICANN timezone data from two new locations found on
devices running Android 10+.  The data in the previously searched
location still exists but it's most likely out of date.

On Android 10+ tzdata updates will be derived via an APEX TimeData
package update, whose data directory this commit sets as the first
location to be searched.

This commit potentially fixes the Xamarin.Android issue mentioned above.
"Potentially" because I can't be sure this is what's causing it since
I'm unable to reproduce the issue locally.  However, out-of-date tz
database seems to be the most probable cause.
  • Loading branch information
grendello committed Sep 4, 2020
1 parent 5756e65 commit 413dcc9
Showing 1 changed file with 26 additions and 0 deletions.
26 changes: 26 additions & 0 deletions mcs/class/corlib/System/TimeZoneInfo.Android.cs
Expand Up @@ -58,10 +58,16 @@ unsafe struct AndroidTzDataEntry {
* https://android.googlesource.com/platform/libcore/+/master/luni/src/main/java/libcore/util/ZoneInfoDB.java
*
* This is needed in order to read Android v4.3 tzdata files.
*
* Android 10+ moved the up-to-date tzdata location to a module updatable via the Google Play Store and the
* database location changed (https://source.android.com/devices/architecture/modular-system/runtime#time-zone-data-interactions)
* The older locations still exist (at least the `/system/usr/share/zoneinfo` one) but they won't be updated.
*/
sealed class AndroidTzData : IAndroidTimeZoneDB {

internal static readonly string[] Paths = new string[]{
GetApexTimeDataRoot () + "/etc/tz/tzdata", // Android 10+, TimeData module where the updates land
GetApexRuntimeRoot () + "/etc/tz/tzdata", // Android 10+, Fallback location if the above isn't found or corrupted
Environment.GetEnvironmentVariable ("ANDROID_DATA") + "/misc/zoneinfo/tzdata",
Environment.GetEnvironmentVariable ("ANDROID_ROOT") + "/usr/share/zoneinfo/tzdata",
};
Expand Down Expand Up @@ -98,6 +104,26 @@ public AndroidTzData (params string[] paths)
get {return zoneTab;}
}

static string GetApexTimeDataRoot ()
{
string ret = Environment.GetEnvironmentVariable ("ANDROID_TZDATA_ROOT");
if (!String.IsNullOrEmpty (ret)) {
return ret;
}

return "/apex/com.android.tzdata";
}

static string GetApexRuntimeRoot ()
{
string ret = Environment.GetEnvironmentVariable ("ANDROID_RUNTIME_ROOT");
if (!String.IsNullOrEmpty (ret)) {
return ret;
}

return "/apex/com.android.runtime";
}

bool LoadData (string path)
{
if (!File.Exists (path))
Expand Down

0 comments on commit 413dcc9

Please sign in to comment.