Implement the new geotz mainline module

Implement the new (release independent) geotz mainline module to
hold time zone geo data and associated code.

Bug: 172546738
Test: build / boot
Change-Id: I5a67faad543457a0ac75017ebaad1a3ee393d85e
diff --git a/apex/Android.bp b/apex/Android.bp
index 3a78cb6..ff672c7 100644
--- a/apex/Android.bp
+++ b/apex/Android.bp
@@ -57,6 +57,6 @@
         "apex_telephonylookup.xml",
         "apex_tzdata",
         "apex_icu_tzdata.dat",
-        "apex_tzs2.dat",
     ],
 }
+
diff --git a/geolocation/apex/com.android.geotz/Android.bp b/geolocation/apex/com.android.geotz/Android.bp
new file mode 100644
index 0000000..aec1a84
--- /dev/null
+++ b/geolocation/apex/com.android.geotz/Android.bp
@@ -0,0 +1,69 @@
+// Copyright (C) 2020 The Android Open Source Project
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+// Defaults shared between real and test versions of the APEX.
+apex_defaults {
+    name: "com.android.geotz-defaults",
+    updatable: true,
+    // TODO(b/174024269) Change this to the value for S once the API level is
+    // final.
+    min_sdk_version: "current",
+
+    // Explicit because the defaulting behavior only works for the real
+    // module.
+    file_contexts: ":com.android.geotz-file_contexts",
+
+    // This name is hardcoded on Android S with associated AndroidManifest.xml
+    // entries in the system server. Do not remove until all releases use an
+    // APK.
+    java_libs: ["geotz"],
+
+    // Shared signing information.
+    key: "com.android.geotz.key",
+    certificate: ":com.android.geotz.certificate",
+}
+
+apex_key {
+    name: "com.android.geotz.key",
+    public_key: "com.android.geotz.avbpubkey",
+    private_key: "com.android.geotz.pem",
+}
+
+android_app_certificate {
+    name: "com.android.geotz.certificate",
+    certificate: "com.android.geotz",
+}
+
+// The definition for the real (not test) geotz APEX.
+apex {
+    name: "com.android.geotz",
+    defaults: ["com.android.geotz-defaults"],
+    manifest: "manifest.json",
+    prebuilts: [
+        "apex_tzs2.dat",
+    ],
+}
+
+// A library intended to be added to the system server classpath.
+java_library {
+    name: "geotz",
+    java_resource_dirs: ["resources/"],
+    static_libs: [
+        "offlinelocationtimezoneprovider",
+    ],
+    sdk_version: "current",
+    apex_available: [
+        "com.android.geotz",
+    ],
+}
diff --git a/geolocation/apex/com.android.geotz/com.android.geotz.avbpubkey b/geolocation/apex/com.android.geotz/com.android.geotz.avbpubkey
new file mode 100644
index 0000000..f705184
--- /dev/null
+++ b/geolocation/apex/com.android.geotz/com.android.geotz.avbpubkey
Binary files differ
diff --git a/geolocation/apex/com.android.geotz/com.android.geotz.pem b/geolocation/apex/com.android.geotz/com.android.geotz.pem
new file mode 100644
index 0000000..48bcae7
--- /dev/null
+++ b/geolocation/apex/com.android.geotz/com.android.geotz.pem
@@ -0,0 +1,51 @@
+-----BEGIN RSA PRIVATE KEY-----
+MIIJKQIBAAKCAgEAwG5FoMP5rSNXTfi/IDMB3EQtWaKXsb6hP6soQGTlm6iVajnA
+IR2A8X62jS33o3KbYASgqcRnSeY4LpOmsidnQ6gOxtOrupVgWL3H+C82EY8wZ+TG
+Jag5lnGbeoglINO8Sw3LMt+2X1UDDwOdp3wX1aC5RpRk9GRONIrjMPVCZNASPy0+
+cLXtslavg/KOOOBsrgSVzB9JR9lf6WQp3WlA2U+YUX9kO8xeOqcX8NrjXPISkRgW
+rcvzBaastb/kbqZHbvij/NNsmLy/X5anxSQJuvi/p7RN4keHf3aR0pown5bJ9wht
+vSrRz50nv2gdB8sLwjglPkKRU/4aiSXjYUTqhJOu4rbkE8pdoVO/Y7iFUXd3fXNi
+TcrfZPve3cgI1CoX3rcALQXdP2rgjg3OVvkVrsNMfabq7WKp+p+5Z4ibD8D6Edsg
+EidSXSgZ3+72ltByN5Dnp55G+WuDlZL9gHmxd8VrnT4+JLAordbkRoxcuwlBPO1w
+F6ok8yJE1Fg3FH0zX04pbKPE9Ax2Ge1nsBhoeHLBKDaqagEcQK2rC8l6KIen2weV
+kDdNMVYtQrfV5en3pzCVZ3mhIjZvHKy5wftVZYBtc9OVDxlKIqcqwlsiK/33+/Qp
+rZ5oO6m+au6mZRxwnfEMN01Sk8WENaZE1JgZKwThkoEeWxPxTImeZ1OcJkcCAwEA
+AQKCAgAE4gd0R+TLBu2NNfWrnH+8liJMdvrAcOTol7BCygylgYahFmwQqw39ksiR
+FoyFIkBdFGD7TdeNIYFldSuys5tENTyCwRZHesjiF5a+bnxBv89ro3t/syAa+DEI
+z/GZPqY1hVkVpmWbT63vMJlMibKVIinxZ4yUQwNVA/013dNceYctATnnZEZu0xJL
+F9mSCefYFpeygUy7vQFZC8igLK6PlRx5XPEvL0Vo2Zqa6wL/9ciQ0/qnWFiHWS5i
+wkbKo/+GClsm7DqCOa/lfg4ty3dPvkYmvEWJq2T90AVtQapgMlRXp2gZd7+xM/yx
+N7Qc4YMf34raZJgJeJY1yrdVXYlR3pBn6uQS1VOVzSud/MLuvFFjsy1MG0L04GaF
+P9UN/kC7MdD6unT6kKJLjIpEO94oPnL5tzTRXwV05usOVVVf6Bk+3UUNPZB75AmD
+xhgz2a5oBOV2a0EZ/+3TgUkCv0rVGkdghX8f5k2ML424ZxwSwgjIjFtREINI6CaD
+ZZyIAvKgtjUoGi9kQdseD9NNMd/GNrgMAnzhcrmw+jmW+9MUiew9uD+dqZPkR6DW
+Y7VulHYDuNBGUQPvH9RtQMFEkb0jcCNJn2g/QiwxdvIm6khx/fEqx4B9do+oVGgt
+SG3JJ51i/a2VKTJgd2fMVf67qPbbeF4c5jIT5t+Y13G5nA2QKQKCAQEA+rrpeUl2
+zXFDKfwrl51HqOrgQe9gBv25tHYnPpy9Euo7HINLrllxiRvGOTH/rG02r/tZYmRS
+uBBZ4RRq82+HoGwnpRK7ZFoU73ql6UFBV2rPxPCiLEOO8uyBJO+wsIIVr+3OZt1c
+qGHwI2t4TaIw1Buepwxg/IS5lk668ZoUsGiILxHhh/2NHwW7LW/ZAb0AFh+Y4jeM
+xo/Mx0x+UaU2OKcxFBnyXEKa2ytsk+K0zpvfkPGBK8KjXhDHexdi2OWrHQ7Dnpxr
+kQibJ8eaiZqgPXgRNGHhAOrPQx3mo7JMbd4yjCfPl4Jv/JnofDY4STBlVtNWNGM2
+ULy3wBqIMjcdgwKCAQEAxHmsElk7VEvKRAWK46axGX+GyOzN97/IArD21DCK9YIV
+IDvVk0nEFuYoOLMBOiAP62m/GhxMLrS7oFM03UIfrxQATIpCMWLkPBmjEZC0eIcR
+FSpjZDuQfTwwbfl8nMLzE7lpuRtLRjTiyOJCphon+mm5MVIZiHkPTO+MroOA4XnE
+XcPoMFSmT+bqYYw75C7ELXxZNxAzCH9Cf5rdTGlJl2M9WVavX/WFKMkvL9Sq44qM
+iaClmvQt6Oi1/kricXO0CL4DYXrEt+hM+sBPUFHHa6etEhifWW4zR5t8CnFQCcY0
+HsMGdHXUYtAr8gNFr/cFh6KXYkk2x+aUAtjWY96c7QKCAQAAycGeHfr/nlGFukMw
+0M++2i4mRuhYXUfOJ2jsK3X0r0PMTSVZwPI4ahvvZhbVpeo8F2AqjQItje+aY4QK
+i9kzSeO+AxcPs7DJJ+uJlijsa2uHxPHdjcDPRqsJQK+ffmkvCmJRtHRsGxK0KcxR
+AieBIy0WfVV4tboXnNu9kqxp+YokC7xXvxZIeK4j8GwQM1Xiu+qxG1eX8C/GmJj1
+DL3k47GlzIcUfykZc0N+G4JR++9x9zBewNfendLisiofYGlvR/KZdwhnhk1mjJwR
+vqiuSMhVD9GzPQm1vkxRS2guGDq0chOW+FP9yUYPzePTZxGKelOVCpLLIiy5r9up
+vL6dAoIBAQCjEcFpcTo22rjEAD2oeN+gpCHAfhrtN/XPlgUnVCrhXdge6sp29tCT
+mO9lL90i2x2bbCc6iqYIVeUsSiMkSQ93BojA/je2Obfo0fZwS8QeDSx2froDpRRl
+fSFNBbcRfRS3GDrRcf/mA1r/FBvxNOBdjIYyk0ux45h5aJFA/tBnU+NRV5pNEtT+
+mE+MKxJCbzZP8lcxxnY05TrSIjzugKydw7ZVggcJBARDN8e8USyMsp+2UulgVK4O
+E6eJqamMNFYGs36m13iSk3Hg5OBvb5Cun3qb/Ge1mCtjkX9AQ5AErMbxiTjATFO8
+t77hnSmnxMSIMMCoyM941r2eJ065kTh5AoIBAQDFV0H5fH6tBK3wNW9qM1nWv4t/
+sVS7Rvi8lalP/CADYQ/zIGGuWpK1J3MAak9UGkZfJbSfMJt1B+jf9GFIlR2PKhzV
+WPQz5OmKdu2nc+na41805s/X3ka1cn+v7vCqMEd4b49+SBshxqLI3Vgc6w1UICCl
+A8qToVGX8jz1PBaHAMnUl+8Kq90nJwTHnKs9440Atbw1OMam8WjjMsxPsVVDNG27
+9umuMaYd3yAiO9vz6ZYtaKbwDFqR8EzczlxOZE40tB5oI/a2PTbHA04JRQZK9vTt
+FgSj6K3wx+aTiIykL84hHkVxOYL2gmGjshcc49qcpvr7/HUc5N3c5oas3Z7W
+-----END RSA PRIVATE KEY-----
diff --git a/geolocation/apex/com.android.geotz/com.android.geotz.pk8 b/geolocation/apex/com.android.geotz/com.android.geotz.pk8
new file mode 100644
index 0000000..28d7e83
--- /dev/null
+++ b/geolocation/apex/com.android.geotz/com.android.geotz.pk8
Binary files differ
diff --git a/geolocation/apex/com.android.geotz/com.android.geotz.x509.pem b/geolocation/apex/com.android.geotz/com.android.geotz.x509.pem
new file mode 100644
index 0000000..699a05d
--- /dev/null
+++ b/geolocation/apex/com.android.geotz/com.android.geotz.x509.pem
@@ -0,0 +1,33 @@
+-----BEGIN CERTIFICATE-----
+MIIFxzCCA68CFCR6wDXn507mTPGRIQ/EwtHYfnuJMA0GCSqGSIb3DQEBCwUAMIGe
+MQswCQYDVQQGEwJVUzETMBEGA1UECAwKQ2FsaWZvcm5pYTEWMBQGA1UEBwwNTW91
+bnRhaW4gVmlldzEQMA4GA1UECgwHQW5kcm9pZDEQMA4GA1UECwwHQW5kcm9pZDEi
+MCAGCSqGSIb3DQEJARYTYW5kcm9pZEBhbmRyb2lkLmNvbTEaMBgGA1UEAwwRY29t
+LmFuZHJvaWQuZ2VvdHowIBcNMjAxMTIwMTkwMTExWhgPNDc1ODEwMTcxOTAxMTFa
+MIGeMQswCQYDVQQGEwJVUzETMBEGA1UECAwKQ2FsaWZvcm5pYTEWMBQGA1UEBwwN
+TW91bnRhaW4gVmlldzEQMA4GA1UECgwHQW5kcm9pZDEQMA4GA1UECwwHQW5kcm9p
+ZDEiMCAGCSqGSIb3DQEJARYTYW5kcm9pZEBhbmRyb2lkLmNvbTEaMBgGA1UEAwwR
+Y29tLmFuZHJvaWQuZ2VvdHowggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoIC
+AQDHuehv1/q5S7XlMxzAPaprlHPfgOGb/wQIWb6rtyR25ze/a0b0hhxPYOCj8Qzk
+J+ZLqWfAp7QvrKlW/o0uj1nUJnM0Q6DK8x5uVYK2dFjDjg5XMdNreePw2Exmi5eD
+cG03LFBay5MgDSifS+adS1gLqkcjERuw8VDDq/lk0qxnW+aX+YXIdaiNPn+RcAwz
+QcIMixBvrWDtnQRzHcRTSHH1B6cKB4C8gRWfjiVfr3FY03miJdhO0gtVnp0VnzP8
+f87UiqVokoIbFKAkuU4svp+J38YGJFx3/iGN2To88IXPBWl+0efUH3sk9XHx6HBu
+GpAj02IU1nsh3QEommwEcRm8GhEjhlO4L/wcERYFWzbp7tl4zQF9RfAesev5MR+d
+oCwn5ym7BT3T8meTXnby0Pkec7VOZFIoSCG7/GAhYqcL6DLnvB4ks8I8fdyWtNNG
+1coE/Awtbsq4AA4xP0fH79niEfwta13kuL3cOm+BGNmYP0ylHYsjC3iTWcjoLcAn
+TXv5Olif5/bhmiFDwlwM+RSck9VLO3WWUX7dZYuK3/AzsoJK++7hWNswkrhvZixS
+Rb3es6q02YMubtGzUe9eCpQDTQPROr4Zl0KeGQc6tWQwHm+Ezyf1se34IThl4eX+
+R4NG5lIULdGMqaMei0Sg5Qoq013R8J5bAbzeQujaEdqp4wIDAQABMA0GCSqGSIb3
+DQEBCwUAA4ICAQAT9ItGqdnNpFo0pGekCPQSVCRF1pEbJlSn6fbHL1rDso6EA7oU
+B98wUzMXzezPy985ot2BUC3R62JsP1UARsSv06c2+9inNpOsaYybT4ZjZ4UlggjN
+ORyGl3LRNhmaeLqLSpJfcAKA41ENniuh2f2HCQuYZYZfZy8ZErQr764mPmHQ3XjX
+3DxAEPu+oVoGBdywVZZk1SM0MPpFSWMleL+ezM4TbO6tiLMU3yVQRKeehLZ09Ycr
+nXs13nYt6j4PdmJn4zKD0Omv7bN7CdqtiN86PDevIwpByGOdnj8T9YEC04u2qvyR
+CeFWMve0y9/7RIxXrPCbZTFlxls+/WUoHvuWDDkc8c/6PjbLNl5mzy/fNrF2G4kr
+/yntA+JQdQAHMKiy2oVfOzIt5PKe5o1971JP3jwx51HQ7Rqnle7WInbZ/1d3tUk9
+sc+vv6vn5Du6Z5R29ng7h6nVM4gsO9jlHnCQsZgwBZU7D98KX/vfbXYE17XtKqK6
+SVxonZplWvEdm4E2AghwKuuh6GVBEC6RvHxusYuN3sGH8Z5rOm70wg+w12dXUfOl
+Q7GGVud36OZ/A03hmW8mr2YQJseZ+wjOJudiR1hY/kkwbWOdTNW27z7WEZ6Zvakx
+wtEF1KBkpRWq0/JY2u7tXh/PIjRplhFI4/vqDzNK552QMYwKmKRTqcY/Bg==
+-----END CERTIFICATE-----
diff --git a/geolocation/apex/com.android.geotz/manifest.json b/geolocation/apex/com.android.geotz/manifest.json
new file mode 100644
index 0000000..942dd98
--- /dev/null
+++ b/geolocation/apex/com.android.geotz/manifest.json
@@ -0,0 +1,4 @@
+{
+  "name": "com.android.geotz",
+  "version": 1
+}
diff --git a/geolocation/apex/com.android.geotz/resources/offlineltzprovider.properties b/geolocation/apex/com.android.geotz/resources/offlineltzprovider.properties
new file mode 100644
index 0000000..38b653b
--- /dev/null
+++ b/geolocation/apex/com.android.geotz/resources/offlineltzprovider.properties
@@ -0,0 +1,6 @@
+# Configuration for the
+# com.android.timezone.geotz.provider.OfflineLocationTimeZoneProvider
+# deployed in the com.android.geotz mainline module.
+
+# The location of the tzs2.dat file to use for time zone boundaries.
+geodata.path=/apex/com.android.geotz/etc/tzs2.dat
diff --git a/geolocation/geotz_lookup/Android.bp b/geolocation/geotz_lookup/Android.bp
index 690b855..2ef2c15 100644
--- a/geolocation/geotz_lookup/Android.bp
+++ b/geolocation/geotz_lookup/Android.bp
@@ -23,6 +23,9 @@
     ],
     host_supported: true,
     jarjar_rules: "jarjar-rules.txt",
+    apex_available: [
+        "com.android.geotz",
+    ],
 }
 
 // Device side tests for the geotz_lookup code.
diff --git a/geolocation/locationtzprovider/Android.bp b/geolocation/locationtzprovider/Android.bp
index 550032c..c25e887 100644
--- a/geolocation/locationtzprovider/Android.bp
+++ b/geolocation/locationtzprovider/Android.bp
@@ -25,6 +25,9 @@
     static_libs: [
         "geotz_lookup",
     ],
+    apex_available: [
+        "com.android.geotz",
+    ],
 }
 
 // Device side tests for offlinelocationtimezoneprovider.
diff --git a/geolocation/locationtzprovider/src/main/java/com/android/timezone/geotz/provider/OfflineLocationTimeZoneProvider.java b/geolocation/locationtzprovider/src/main/java/com/android/timezone/geotz/provider/OfflineLocationTimeZoneProvider.java
index a4c8c03..a11e667 100644
--- a/geolocation/locationtzprovider/src/main/java/com/android/timezone/geotz/provider/OfflineLocationTimeZoneProvider.java
+++ b/geolocation/locationtzprovider/src/main/java/com/android/timezone/geotz/provider/OfflineLocationTimeZoneProvider.java
@@ -38,6 +38,9 @@
  * changes. No location state is retained when the provider is disabled.
  *
  * <p>See {@link OfflineLocationTimeZoneDelegate} for implementation details.
+ *
+ * <p>The provider is configured via a "offlineltzprovider.properties" resource file. See
+ * {@link EnvironmentImpl} for details.
  */
 final class OfflineLocationTimeZoneProvider extends LocationTimeZoneProviderBase {
 
diff --git a/geolocation/locationtzprovider/src/main/java/com/android/timezone/geotz/provider/OfflineLocationTimeZoneService.java b/geolocation/locationtzprovider/src/main/java/com/android/timezone/geotz/provider/OfflineLocationTimeZoneService.java
index e675b6b..fe4f1e6 100644
--- a/geolocation/locationtzprovider/src/main/java/com/android/timezone/geotz/provider/OfflineLocationTimeZoneService.java
+++ b/geolocation/locationtzprovider/src/main/java/com/android/timezone/geotz/provider/OfflineLocationTimeZoneService.java
@@ -26,7 +26,14 @@
 import java.io.PrintWriter;
 
 /**
- * The service that provides the {@link OfflineLocationTimeZoneProvider}.
+ * The service that provides the {@link OfflineLocationTimeZoneProvider}. An instance of this
+ * service is discovered via configuration in an {@code AndroidManifest.xml}.
+ *
+ * <p>See {@link com.android.server.location.timezone.LocationTimeZoneManagerService} for the server
+ * component that binds to it and how it is discovered.
+ *
+ * <p>See {@link com.android.server.ServiceWatcher} for how to control how the service is treated
+ * and how the server resolves to a single service if there are multiple available.
  */
 public final class OfflineLocationTimeZoneService extends Service {
 
diff --git a/geolocation/output_data/Android.bp b/geolocation/output_data/Android.bp
index 287c757..91cca25 100644
--- a/geolocation/output_data/Android.bp
+++ b/geolocation/output_data/Android.bp
@@ -18,7 +18,6 @@
     src: "odbl/tzs2.dat",
     notice: "odbl/LICENSE",
     filename: "tzs2.dat",
-    sub_dir: "geo",
     installable: false,
 }
 
diff --git a/geolocation/s2storage/Android.bp b/geolocation/s2storage/Android.bp
index f190323..84a3ec1 100644
--- a/geolocation/s2storage/Android.bp
+++ b/geolocation/s2storage/Android.bp
@@ -20,6 +20,9 @@
     srcs: [
         "src/readonly/java/**/*.java",
     ],
+    apex_available: [
+        "com.android.geotz",
+    ],
 }
 
 // Library for read/write access to TZ S2 data files.