Skip to content

Commit bb881bf

Browse files
authored
[Mono.Android] Bind java.time and java.time.chrono packages. (#8088)
Fixes: #8081 Context: 571546a When binding API-26 we chose not to bind the `java.time` and `java.time.chrono` Android packages (571546a), likely due to the amount of metadata required to build them correctly. (It also requires the use of `managedOverride`, which didn't exist at the time.) However, they are pretty useful packages, so let's invest the effort to get them bound. Additionally, this results in now producing bindings for many methods in unrelated types that consume `java.time` types.
1 parent 2259d98 commit bb881bf

File tree

7 files changed

+1545
-4
lines changed

7 files changed

+1545
-4
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
#if ANDROID_26
2+
using System;
3+
using Android.Runtime;
4+
using Java.Time.Chrono;
5+
6+
namespace Java.Time.Chrono
7+
{
8+
public abstract partial class AbstractChronology
9+
{
10+
public int CompareTo (Java.Lang.Object obj) => CompareTo (obj.JavaCast<IChronology> ());
11+
}
12+
}
13+
#endif
14+
+14
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
#if ANDROID_26
2+
using System;
3+
using Android.Runtime;
4+
using Java.Time.Chrono;
5+
6+
namespace Java.Time
7+
{
8+
public sealed partial class LocalDate
9+
{
10+
public int CompareTo (Java.Lang.Object obj) => CompareTo (obj.JavaCast<IChronoLocalDate> ());
11+
}
12+
}
13+
#endif
14+
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
#if ANDROID_26
2+
using System;
3+
using Android.Runtime;
4+
using Java.Time.Chrono;
5+
6+
namespace Java.Time
7+
{
8+
public sealed partial class LocalDateTime
9+
{
10+
public int CompareTo (Java.Lang.Object obj) => CompareTo (obj.JavaCast<IChronoLocalDateTime> ());
11+
}
12+
}
13+
#endif
14+
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
#if ANDROID_26
2+
using System;
3+
using Android.Runtime;
4+
using Java.Time.Chrono;
5+
6+
namespace Java.Time
7+
{
8+
public sealed partial class ZonedDateTime
9+
{
10+
public int CompareTo (Java.Lang.Object obj) => (this as IChronoZonedDateTime).CompareTo (obj.JavaCast<IChronoZonedDateTime> ());
11+
}
12+
}
13+
#endif
14+

src/Mono.Android/Mono.Android.csproj

+4
Original file line numberDiff line numberDiff line change
@@ -92,6 +92,10 @@
9292
<Compile Include="Android.Telecom\InCallService.cs" />
9393
<Compile Include="Android.Views\WindowManagerLayoutParams.cs" />
9494
<Compile Include="Java.Lang.Invoke\MethodType.cs" />
95+
<Compile Include="Java.Time.Chrono\AbstractChronology.cs" />
96+
<Compile Include="Java.Time\ZonedDateTime.cs" />
97+
<Compile Include="Java.Time\LocalDateTime.cs" />
98+
<Compile Include="Java.Time\LocalDate.cs" />
9599
</ItemGroup>
96100

97101
<Import Project="..\Xamarin.Android.NamingCustomAttributes\Xamarin.Android.NamingCustomAttributes.projitems" Label="Shared" Condition="Exists('..\Xamarin.Android.NamingCustomAttributes\Xamarin.Android.NamingCustomAttributes.projitems')" />

src/Mono.Android/PublicAPI/API-34/PublicAPI.Unshipped.txt

+1,419-1
Large diffs are not rendered by default.

src/Mono.Android/metadata

+66-3
Original file line numberDiff line numberDiff line change
@@ -1337,9 +1337,72 @@
13371337
(It's all Xamarin's fault to have introduced enumification, after all. -->
13381338
<attr path="/api/package[@name='android.media']/class[@name='AudioFocusRequest']" name="managedName" api-since="26">AudioFocusRequestClass</attr>
13391339

1340-
<!-- FIXME: fix build and enable these packages -->
1341-
<remove-node path="/api/package[@name='java.time']" api-since="26" />
1342-
<remove-node path="/api/package[@name='java.time.chrono']" api-since="26" />
1340+
<!-- Lots of covariant and override fixes needed to get these classes to build -->
1341+
<remove-node path="/api/package[@name='java.time.chrono']/class[@name='HijrahChronology']" api-since="26" />
1342+
<remove-node path="/api/package[@name='java.time.chrono']/class[@name='HijrahDate']" api-since="26" />
1343+
<remove-node path="/api/package[@name='java.time.chrono']/class[@name='JapaneseChronology']" api-since="26" />
1344+
<remove-node path="/api/package[@name='java.time.chrono']/class[@name='JapaneseDate']" api-since="26" />
1345+
<remove-node path="/api/package[@name='java.time.chrono']/class[@name='MinguoChronology']" api-since="26" />
1346+
<remove-node path="/api/package[@name='java.time.chrono']/class[@name='MinguoDate']" api-since="26" />
1347+
<remove-node path="/api/package[@name='java.time.chrono']/class[@name='ThaiBuddhistChronology']" api-since="26" />
1348+
<remove-node path="/api/package[@name='java.time.chrono']/class[@name='ThaiBuddhistDate']" api-since="26" />
1349+
1350+
<!-- java.time types make heavy use of covariant return types that require extensive fixing -->
1351+
<attr path="/api/package[@name='java.time']/class[@name='Instant']/method[@name='plus' and count(parameter)=2 and parameter[1][@type='long'] and parameter[2][@type='java.time.temporal.TemporalUnit']]" name="managedReturn" api-since="26">Java.Time.Temporal.ITemporal</attr>
1352+
<attr path="/api/package[@name='java.time']/class[@name='Instant']/method[@name='with' and count(parameter)=2 and parameter[1][@type='java.time.temporal.TemporalField'] and parameter[2][@type='long']]" name="managedReturn" api-since="26">Java.Time.Temporal.ITemporal</attr>
1353+
<attr path="/api/package[@name='java.time']/class[@name='LocalDate']/method[@name='plus' and count(parameter)=2 and parameter[1][@type='long'] and parameter[2][@type='java.time.temporal.TemporalUnit']]" name="managedReturn" api-since="26">Java.Time.Temporal.ITemporal</attr>
1354+
<attr path="/api/package[@name='java.time']/class[@name='LocalDate']/method[@name='with' and count(parameter)=2 and parameter[1][@type='java.time.temporal.TemporalField'] and parameter[2][@type='long']]" name="managedReturn" api-since="26">Java.Time.Temporal.ITemporal</attr>
1355+
<attr path="/api/package[@name='java.time']/class[@name='LocalDateTime']/method[@name='plus' and count(parameter)=2 and parameter[1][@type='long'] and parameter[2][@type='java.time.temporal.TemporalUnit']]" name="managedReturn" api-since="26">Java.Time.Temporal.ITemporal</attr>
1356+
<attr path="/api/package[@name='java.time']/class[@name='LocalDateTime']/method[@name='with' and count(parameter)=2 and parameter[1][@type='java.time.temporal.TemporalField'] and parameter[2][@type='long']]" name="managedReturn" api-since="26">Java.Time.Temporal.ITemporal</attr>
1357+
<attr path="/api/package[@name='java.time']/class[@name='LocalTime']/method[@name='plus' and count(parameter)=2 and parameter[1][@type='long'] and parameter[2][@type='java.time.temporal.TemporalUnit']]" name="managedReturn" api-since="26">Java.Time.Temporal.ITemporal</attr>
1358+
<attr path="/api/package[@name='java.time']/class[@name='LocalTime']/method[@name='with' and count(parameter)=2 and parameter[1][@type='java.time.temporal.TemporalField'] and parameter[2][@type='long']]" name="managedReturn" api-since="26">Java.Time.Temporal.ITemporal</attr>
1359+
<attr path="/api/package[@name='java.time']/class[@name='OffsetDateTime']/method[@name='plus' and count(parameter)=2 and parameter[1][@type='long'] and parameter[2][@type='java.time.temporal.TemporalUnit']]" name="managedReturn" api-since="26">Java.Time.Temporal.ITemporal</attr>
1360+
<attr path="/api/package[@name='java.time']/class[@name='OffsetDateTime']/method[@name='with' and count(parameter)=2 and parameter[1][@type='java.time.temporal.TemporalField'] and parameter[2][@type='long']]" name="managedReturn" api-since="26">Java.Time.Temporal.ITemporal</attr>
1361+
<attr path="/api/package[@name='java.time']/class[@name='OffsetTime']/method[@name='plus' and count(parameter)=2 and parameter[1][@type='long'] and parameter[2][@type='java.time.temporal.TemporalUnit']]" name="managedReturn" api-since="26">Java.Time.Temporal.ITemporal</attr>
1362+
<attr path="/api/package[@name='java.time']/class[@name='OffsetTime']/method[@name='with' and count(parameter)=2 and parameter[1][@type='java.time.temporal.TemporalField'] and parameter[2][@type='long']]" name="managedReturn" api-since="26">Java.Time.Temporal.ITemporal</attr>
1363+
<attr path="/api/package[@name='java.time']/class[@name='Year']/method[@name='plus' and count(parameter)=2 and parameter[1][@type='long'] and parameter[2][@type='java.time.temporal.TemporalUnit']]" name="managedReturn" api-since="26">Java.Time.Temporal.ITemporal</attr>
1364+
<attr path="/api/package[@name='java.time']/class[@name='Year']/method[@name='with' and count(parameter)=2 and parameter[1][@type='java.time.temporal.TemporalField'] and parameter[2][@type='long']]" name="managedReturn" api-since="26">Java.Time.Temporal.ITemporal</attr>
1365+
<attr path="/api/package[@name='java.time']/class[@name='YearMonth']/method[@name='plus' and count(parameter)=2 and parameter[1][@type='long'] and parameter[2][@type='java.time.temporal.TemporalUnit']]" name="managedReturn" api-since="26">Java.Time.Temporal.ITemporal</attr>
1366+
<attr path="/api/package[@name='java.time']/class[@name='YearMonth']/method[@name='with' and count(parameter)=2 and parameter[1][@type='java.time.temporal.TemporalField'] and parameter[2][@type='long']]" name="managedReturn" api-since="26">Java.Time.Temporal.ITemporal</attr>
1367+
<attr path="/api/package[@name='java.time']/class[@name='ZonedDateTime']/method[@name='plus' and count(parameter)=2 and parameter[1][@type='long'] and parameter[2][@type='java.time.temporal.TemporalUnit']]" name="managedReturn" api-since="26">Java.Time.Temporal.ITemporal</attr>
1368+
<attr path="/api/package[@name='java.time']/class[@name='ZonedDateTime']/method[@name='with' and count(parameter)=2 and parameter[1][@type='java.time.temporal.TemporalField'] and parameter[2][@type='long']]" name="managedReturn" api-since="26">Java.Time.Temporal.ITemporal</attr>
1369+
1370+
<attr path="/api/package[@name='java.time.chrono']/interface[@name='ChronoLocalDate']/method[@name='minus' and count(parameter)=1 and parameter[1][@type='java.time.temporal.TemporalAmount']]" name="managedReturn" api-since="26">Java.Time.Temporal.ITemporal</attr>
1371+
<attr path="/api/package[@name='java.time.chrono']/interface[@name='ChronoLocalDate']/method[@name='minus' and count(parameter)=2 and parameter[1][@type='long'] and parameter[2][@type='java.time.temporal.TemporalUnit']]" name="managedReturn" api-since="26">Java.Time.Temporal.ITemporal</attr>
1372+
<attr path="/api/package[@name='java.time.chrono']/interface[@name='ChronoLocalDate']/method[@name='plus' and count(parameter)=1 and parameter[1][@type='java.time.temporal.TemporalAmount']]" name="managedReturn" api-since="26">Java.Time.Temporal.ITemporal</attr>
1373+
<attr path="/api/package[@name='java.time.chrono']/interface[@name='ChronoLocalDate']/method[@name='plus' and count(parameter)=2 and parameter[1][@type='long'] and parameter[2][@type='java.time.temporal.TemporalUnit']]" name="managedReturn" api-since="26">Java.Time.Temporal.ITemporal</attr>
1374+
<attr path="/api/package[@name='java.time.chrono']/interface[@name='ChronoLocalDate']/method[@name='with' and count(parameter)=1 and parameter[1][@type='java.time.temporal.TemporalAdjuster']]" name="managedReturn" api-since="26">Java.Time.Temporal.ITemporal</attr>
1375+
<attr path="/api/package[@name='java.time.chrono']/interface[@name='ChronoLocalDate']/method[@name='with' and count(parameter)=2 and parameter[1][@type='java.time.temporal.TemporalField'] and parameter[2][@type='long']]" name="managedReturn" api-since="26">Java.Time.Temporal.ITemporal</attr>
1376+
1377+
<attr path="/api/package[@name='java.time.chrono']/interface[@name='ChronoLocalDateTime']/method[@name='minus' and count(parameter)=1 and parameter[1][@type='java.time.temporal.TemporalAmount']]" name="managedReturn" api-since="26">Java.Time.Temporal.ITemporal</attr>
1378+
<attr path="/api/package[@name='java.time.chrono']/interface[@name='ChronoLocalDateTime']/method[@name='minus' and count(parameter)=2 and parameter[1][@type='long'] and parameter[2][@type='java.time.temporal.TemporalUnit']]" name="managedReturn" api-since="26">Java.Time.Temporal.ITemporal</attr>
1379+
<attr path="/api/package[@name='java.time.chrono']/interface[@name='ChronoLocalDateTime']/method[@name='plus' and count(parameter)=1 and parameter[1][@type='java.time.temporal.TemporalAmount']]" name="managedReturn" api-since="26">Java.Time.Temporal.ITemporal</attr>
1380+
<attr path="/api/package[@name='java.time.chrono']/interface[@name='ChronoLocalDateTime']/method[@name='plus' and count(parameter)=2 and parameter[1][@type='long'] and parameter[2][@type='java.time.temporal.TemporalUnit']]" name="managedReturn" api-since="26">Java.Time.Temporal.ITemporal</attr>
1381+
<attr path="/api/package[@name='java.time.chrono']/interface[@name='ChronoLocalDateTime']/method[@name='with' and count(parameter)=1 and parameter[1][@type='java.time.temporal.TemporalAdjuster']]" name="managedReturn" api-since="26">Java.Time.Temporal.ITemporal</attr>
1382+
<attr path="/api/package[@name='java.time.chrono']/interface[@name='ChronoLocalDateTime']/method[@name='with' and count(parameter)=2 and parameter[1][@type='java.time.temporal.TemporalField'] and parameter[2][@type='long']]" name="managedReturn" api-since="26">Java.Time.Temporal.ITemporal</attr>
1383+
1384+
<attr path="/api/package[@name='java.time.chrono']/interface[@name='ChronoZonedDateTime']/method[@name='minus' and count(parameter)=1 and parameter[1][@type='java.time.temporal.TemporalAmount']]" name="managedReturn" api-since="26">Java.Time.Temporal.ITemporal</attr>
1385+
<attr path="/api/package[@name='java.time.chrono']/interface[@name='ChronoZonedDateTime']/method[@name='minus' and count(parameter)=2 and parameter[1][@type='long'] and parameter[2][@type='java.time.temporal.TemporalUnit']]" name="managedReturn" api-since="26">Java.Time.Temporal.ITemporal</attr>
1386+
<attr path="/api/package[@name='java.time.chrono']/interface[@name='ChronoZonedDateTime']/method[@name='plus' and count(parameter)=1 and parameter[1][@type='java.time.temporal.TemporalAmount']]" name="managedReturn" api-since="26">Java.Time.Temporal.ITemporal</attr>
1387+
<attr path="/api/package[@name='java.time.chrono']/interface[@name='ChronoZonedDateTime']/method[@name='plus' and count(parameter)=2 and parameter[1][@type='long'] and parameter[2][@type='java.time.temporal.TemporalUnit']]" name="managedReturn" api-since="26">Java.Time.Temporal.ITemporal</attr>
1388+
<attr path="/api/package[@name='java.time.chrono']/interface[@name='ChronoZonedDateTime']/method[@name='with' and count(parameter)=1 and parameter[1][@type='java.time.temporal.TemporalAdjuster']]" name="managedReturn" api-since="26">Java.Time.Temporal.ITemporal</attr>
1389+
<attr path="/api/package[@name='java.time.chrono']/interface[@name='ChronoZonedDateTime']/method[@name='with' and count(parameter)=2 and parameter[1][@type='java.time.temporal.TemporalField'] and parameter[2][@type='long']]" name="managedReturn" api-since="26">Java.Time.Temporal.ITemporal</attr>
1390+
1391+
<attr path="/api/package[@name='java.time.chrono']/class[@name='IsoChronology']/method[@name='dateEpochDay' and count(parameter)=1 and parameter[1][@type='long']]" name="managedOverride" api-since="26">override</attr>
1392+
<attr path="/api/package[@name='java.time.chrono']/class[@name='IsoChronology']/method[@name='dateYearDay' and count(parameter)=2 and parameter[1][@type='int'] and parameter[2][@type='int']]" name="managedOverride" api-since="26">override</attr>
1393+
<attr path="/api/package[@name='java.time.chrono']/class[@name='IsoChronology']/method[@name='eraOf' and count(parameter)=1 and parameter[1][@type='int']]" name="managedOverride" api-since="26">override</attr>
1394+
<attr path="/api/package[@name='java.time.chrono']/class[@name='IsoChronology']/method[@name='date' and count(parameter)=3 and parameter[1][@type='int'] and parameter[2][@type='int'] and parameter[3][@type='int']]" name="managedOverride" api-since="26">override</attr>
1395+
<attr path="/api/package[@name='java.time.chrono']/class[@name='IsoChronology']/method[@name='date' and count(parameter)=1 and parameter[1][@type='java.time.temporal.TemporalAccessor']]" name="managedOverride" api-since="26">override</attr>
1396+
<attr path="/api/package[@name='java.time.chrono']/class[@name='IsoChronology']/method[@name='epochSecond' and count(parameter)=7 and parameter[1][@type='int'] and parameter[2][@type='int'] and parameter[3][@type='int'] and parameter[4][@type='int'] and parameter[5][@type='int'] and parameter[6][@type='int'] and parameter[7][@type='java.time.ZoneOffset']]" name="managedOverride" api-since="34">none</attr>
1397+
1398+
<attr path="/api/package[@name='java.time']/class[@name='LocalDate']/method[@name='getChronology' and count(parameter)=0]" name="managedReturn" api-since="26">Java.Time.Chrono.IChronology</attr>
1399+
<attr path="/api/package[@name='java.time']/class[@name='LocalDate']/method[@name='until' and count(parameter)=1 and parameter[1][@type='java.time.chrono.ChronoLocalDate']]" name="managedReturn" api-since="26">Java.Time.Chrono.IChronoPeriod</attr>
1400+
1401+
<attr path="/api/package[@name='java.time']/class[@name='Period']/method[@name='getChronology' and count(parameter)=0]" name="managedReturn" api-since="26">Java.Time.Chrono.IChronology</attr>
1402+
<attr path="/api/package[@name='java.time']/class[@name='Period']/method[@name='minus' and count(parameter)=1 and parameter[1][@type='java.time.temporal.TemporalAmount']]" name="managedReturn" api-since="26">Java.Time.Chrono.IChronoPeriod</attr>
1403+
<attr path="/api/package[@name='java.time']/class[@name='Period']/method[@name='multipliedBy' and count(parameter)=1 and parameter[1][@type='int']]" name="managedReturn" api-since="26">Java.Time.Chrono.IChronoPeriod</attr>
1404+
<attr path="/api/package[@name='java.time']/class[@name='Period']/method[@name='normalized' and count(parameter)=0]" name="managedReturn" api-since="26">Java.Time.Chrono.IChronoPeriod</attr>
1405+
<attr path="/api/package[@name='java.time']/class[@name='Period']/method[@name='plus' and count(parameter)=1 and parameter[1][@type='java.time.temporal.TemporalAmount']]" name="managedReturn" api-since="26">Java.Time.Chrono.IChronoPeriod</attr>
13431406

13441407
<!-- FIXME: fix build and enable this method -->
13451408
<remove-node path="/api/package[@name='android.text']/class[@name='TextUtils']/method[@name='listEllipsize']" api-since="26" />

0 commit comments

Comments
 (0)