From cd371e68e22e297bdb3c2a2ec2f0b6feedc0ceec Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Fri, 20 Feb 2026 14:51:06 +0000 Subject: [PATCH 1/4] Initial plan From d518560a2194782dc0260d4c97907a306d1ab8e8 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Fri, 20 Feb 2026 15:23:04 +0000 Subject: [PATCH 2/4] Add missing TvContractCompat.WatchNextPrograms class via Additions The class was being dropped during API generation because it only contains static final fields with no constructors or methods. Added a manual C# binding in Additions that provides all the constants from the Java API including CONTENT_URI, CONTENT_TYPE, CONTENT_ITEM_TYPE, WATCH_NEXT_TYPE_* constants, and COLUMN_* constants. Co-authored-by: jonathanpeppers <840039+jonathanpeppers@users.noreply.github.com> --- .../TvContractCompat.WatchNextPrograms.cs | 60 +++++++++++++++++++ .../PublicAPI/PublicAPI.Unshipped.txt | 11 ++++ 2 files changed, 71 insertions(+) create mode 100644 source/androidx.tvprovider/tvprovider/Additions/TvContractCompat.WatchNextPrograms.cs diff --git a/source/androidx.tvprovider/tvprovider/Additions/TvContractCompat.WatchNextPrograms.cs b/source/androidx.tvprovider/tvprovider/Additions/TvContractCompat.WatchNextPrograms.cs new file mode 100644 index 000000000..c276851c1 --- /dev/null +++ b/source/androidx.tvprovider/tvprovider/Additions/TvContractCompat.WatchNextPrograms.cs @@ -0,0 +1,60 @@ +using System; +using Android.Runtime; +using Java.Interop; + +namespace AndroidX.TvProvider.Media.Tv +{ + public sealed partial class TvContractCompat + { + [Register ("androidx/tvprovider/media/tv/TvContractCompat$WatchNextPrograms", DoNotGenerateAcw = true)] + public sealed class WatchNextPrograms : Java.Lang.Object + { + static readonly JniPeerMembers _members = new XAPeerMembers ("androidx/tvprovider/media/tv/TvContractCompat$WatchNextPrograms", typeof (WatchNextPrograms)); + + internal static new IntPtr class_ref { + get { return _members.JniPeerType.PeerReference.Handle; } + } + + public override JniPeerMembers JniPeerMembers { + get { return _members; } + } + + WatchNextPrograms (nint javaReference, JniHandleOwnership transfer) : base (javaReference, transfer) + { + } + + [Register ("CONTENT_URI")] + public static Android.Net.Uri? ContentUri { + get { + const string __id = "CONTENT_URI.Landroid/net/Uri;"; + var __v = _members.StaticFields.GetObjectValue (__id); + return Java.Lang.Object.GetObject (__v.Handle, JniHandleOwnership.TransferLocalRef); + } + } + + [Register ("CONTENT_TYPE")] + public const string ContentType = "vnd.android.cursor.dir/watch_next_program"; + + [Register ("CONTENT_ITEM_TYPE")] + public const string ContentItemType = "vnd.android.cursor.item/watch_next_program"; + + [Register ("WATCH_NEXT_TYPE_CONTINUE")] + public const int WatchNextTypeContinue = 0; + + [Register ("WATCH_NEXT_TYPE_NEXT")] + public const int WatchNextTypeNext = 1; + + [Register ("WATCH_NEXT_TYPE_NEW")] + public const int WatchNextTypeNew = 2; + + [Register ("WATCH_NEXT_TYPE_WATCHLIST")] + public const int WatchNextTypeWatchlist = 3; + + [Register ("COLUMN_WATCH_NEXT_TYPE")] + public const string ColumnWatchNextType = "watch_next_type"; + + [Register ("COLUMN_LAST_ENGAGEMENT_TIME_UTC_MILLIS")] + public const string ColumnLastEngagementTimeUtcMillis = "last_engagement_time_utc_millis"; + } + } +} diff --git a/source/androidx.tvprovider/tvprovider/PublicAPI/PublicAPI.Unshipped.txt b/source/androidx.tvprovider/tvprovider/PublicAPI/PublicAPI.Unshipped.txt index 45bbab836..d288a608c 100644 --- a/source/androidx.tvprovider/tvprovider/PublicAPI/PublicAPI.Unshipped.txt +++ b/source/androidx.tvprovider/tvprovider/PublicAPI/PublicAPI.Unshipped.txt @@ -153,6 +153,7 @@ AndroidX.TvProvider.Media.Tv.TvContractCompat AndroidX.TvProvider.Media.Tv.TvContractCompat.IPreviewProgramColumns AndroidX.TvProvider.Media.Tv.TvContractCompat.PreviewProgramColumns AndroidX.TvProvider.Media.Tv.TvContractCompat.PreviewProgramColumnsConsts +AndroidX.TvProvider.Media.Tv.TvContractCompat.WatchNextPrograms AndroidX.TvProvider.Media.Tv.TvContractUtils AndroidX.TvProvider.Media.Tv.TvContractUtils.TvContractUtils(nint javaReference, Android.Runtime.JniHandleOwnership transfer) -> void AndroidX.TvProvider.Media.Tv.WatchNextProgram @@ -264,6 +265,14 @@ const AndroidX.TvProvider.Media.Tv.TvContractCompat.PreviewProgramColumns.TypeTr const AndroidX.TvProvider.Media.Tv.TvContractCompat.PreviewProgramColumns.TypeTvEpisode = 3 -> int const AndroidX.TvProvider.Media.Tv.TvContractCompat.PreviewProgramColumns.TypeTvSeason = 2 -> int const AndroidX.TvProvider.Media.Tv.TvContractCompat.PreviewProgramColumns.TypeTvSeries = 1 -> int +const AndroidX.TvProvider.Media.Tv.TvContractCompat.WatchNextPrograms.ColumnLastEngagementTimeUtcMillis = "last_engagement_time_utc_millis" -> string! +const AndroidX.TvProvider.Media.Tv.TvContractCompat.WatchNextPrograms.ColumnWatchNextType = "watch_next_type" -> string! +const AndroidX.TvProvider.Media.Tv.TvContractCompat.WatchNextPrograms.ContentItemType = "vnd.android.cursor.item/watch_next_program" -> string! +const AndroidX.TvProvider.Media.Tv.TvContractCompat.WatchNextPrograms.ContentType = "vnd.android.cursor.dir/watch_next_program" -> string! +const AndroidX.TvProvider.Media.Tv.TvContractCompat.WatchNextPrograms.WatchNextTypeContinue = 0 -> int +const AndroidX.TvProvider.Media.Tv.TvContractCompat.WatchNextPrograms.WatchNextTypeNew = 2 -> int +const AndroidX.TvProvider.Media.Tv.TvContractCompat.WatchNextPrograms.WatchNextTypeNext = 1 -> int +const AndroidX.TvProvider.Media.Tv.TvContractCompat.WatchNextPrograms.WatchNextTypeWatchlist = 3 -> int const AndroidX.TvProvider.Media.Tv.WatchNextProgram.WatchNextTypeUnknown = -1 -> int override AndroidX.TvProvider.Media.Tv.BasePreviewProgram.Builder.JniPeerMembers.get -> Java.Interop.JniPeerMembers! override AndroidX.TvProvider.Media.Tv.BasePreviewProgram.Builder.ThresholdClass.get -> nint @@ -302,6 +311,7 @@ override AndroidX.TvProvider.Media.Tv.Program.Builder.ThresholdClass.get -> nint override AndroidX.TvProvider.Media.Tv.Program.Builder.ThresholdType.get -> System.Type! override AndroidX.TvProvider.Media.Tv.Program.JniPeerMembers.get -> Java.Interop.JniPeerMembers! override AndroidX.TvProvider.Media.Tv.TvContractCompat.JniPeerMembers.get -> Java.Interop.JniPeerMembers! +override AndroidX.TvProvider.Media.Tv.TvContractCompat.WatchNextPrograms.JniPeerMembers.get -> Java.Interop.JniPeerMembers! override AndroidX.TvProvider.Media.Tv.TvContractUtils.JniPeerMembers.get -> Java.Interop.JniPeerMembers! override AndroidX.TvProvider.Media.Tv.TvContractUtils.ThresholdClass.get -> nint override AndroidX.TvProvider.Media.Tv.TvContractUtils.ThresholdType.get -> System.Type! @@ -343,6 +353,7 @@ static AndroidX.TvProvider.Media.Tv.TvContractCompat.IsChannelUriForTunerInput(A static AndroidX.TvProvider.Media.Tv.TvContractCompat.IsProgramUri(Android.Net.Uri? uri) -> bool static AndroidX.TvProvider.Media.Tv.TvContractCompat.IsRecordedProgramUri(Android.Net.Uri? uri) -> bool static AndroidX.TvProvider.Media.Tv.TvContractCompat.RequestChannelBrowsable(Android.Content.Context? context, long channelId) -> void +static AndroidX.TvProvider.Media.Tv.TvContractCompat.WatchNextPrograms.ContentUri.get -> Android.Net.Uri? static AndroidX.TvProvider.Media.Tv.TvContractUtils.AudioLanguagesToString(string![]? audioLanguages) -> string? static AndroidX.TvProvider.Media.Tv.TvContractUtils.ContentRatingsToString(Android.Media.TV.TvContentRating![]? contentRatings) -> string? static AndroidX.TvProvider.Media.Tv.TvContractUtils.StringToAudioLanguages(string? commaSeparatedString) -> string![]? From b9c04f84dd85369b88e50c5a76ae991a95255597 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Fri, 20 Feb 2026 21:15:16 +0000 Subject: [PATCH 3/4] Switch to Metadata.xml approach for TvContractCompat.WatchNextPrograms Replace manual C# Additions with Metadata.xml remove-node/add-node to define TvContractCompat.WatchNextPrograms. The binding generator drops constants-only classes during processing; re-adding the class definition with a package-private constructor via Metadata.xml ensures the generator keeps it while producing proper auto-generated C# bindings. Co-authored-by: jonathanpeppers <840039+jonathanpeppers@users.noreply.github.com> --- .../TvContractCompat.WatchNextPrograms.cs | 60 ------------------- .../tvprovider/Transforms/Metadata.xml | 26 +++++--- 2 files changed, 18 insertions(+), 68 deletions(-) delete mode 100644 source/androidx.tvprovider/tvprovider/Additions/TvContractCompat.WatchNextPrograms.cs diff --git a/source/androidx.tvprovider/tvprovider/Additions/TvContractCompat.WatchNextPrograms.cs b/source/androidx.tvprovider/tvprovider/Additions/TvContractCompat.WatchNextPrograms.cs deleted file mode 100644 index c276851c1..000000000 --- a/source/androidx.tvprovider/tvprovider/Additions/TvContractCompat.WatchNextPrograms.cs +++ /dev/null @@ -1,60 +0,0 @@ -using System; -using Android.Runtime; -using Java.Interop; - -namespace AndroidX.TvProvider.Media.Tv -{ - public sealed partial class TvContractCompat - { - [Register ("androidx/tvprovider/media/tv/TvContractCompat$WatchNextPrograms", DoNotGenerateAcw = true)] - public sealed class WatchNextPrograms : Java.Lang.Object - { - static readonly JniPeerMembers _members = new XAPeerMembers ("androidx/tvprovider/media/tv/TvContractCompat$WatchNextPrograms", typeof (WatchNextPrograms)); - - internal static new IntPtr class_ref { - get { return _members.JniPeerType.PeerReference.Handle; } - } - - public override JniPeerMembers JniPeerMembers { - get { return _members; } - } - - WatchNextPrograms (nint javaReference, JniHandleOwnership transfer) : base (javaReference, transfer) - { - } - - [Register ("CONTENT_URI")] - public static Android.Net.Uri? ContentUri { - get { - const string __id = "CONTENT_URI.Landroid/net/Uri;"; - var __v = _members.StaticFields.GetObjectValue (__id); - return Java.Lang.Object.GetObject (__v.Handle, JniHandleOwnership.TransferLocalRef); - } - } - - [Register ("CONTENT_TYPE")] - public const string ContentType = "vnd.android.cursor.dir/watch_next_program"; - - [Register ("CONTENT_ITEM_TYPE")] - public const string ContentItemType = "vnd.android.cursor.item/watch_next_program"; - - [Register ("WATCH_NEXT_TYPE_CONTINUE")] - public const int WatchNextTypeContinue = 0; - - [Register ("WATCH_NEXT_TYPE_NEXT")] - public const int WatchNextTypeNext = 1; - - [Register ("WATCH_NEXT_TYPE_NEW")] - public const int WatchNextTypeNew = 2; - - [Register ("WATCH_NEXT_TYPE_WATCHLIST")] - public const int WatchNextTypeWatchlist = 3; - - [Register ("COLUMN_WATCH_NEXT_TYPE")] - public const string ColumnWatchNextType = "watch_next_type"; - - [Register ("COLUMN_LAST_ENGAGEMENT_TIME_UTC_MILLIS")] - public const string ColumnLastEngagementTimeUtcMillis = "last_engagement_time_utc_millis"; - } - } -} diff --git a/source/androidx.tvprovider/tvprovider/Transforms/Metadata.xml b/source/androidx.tvprovider/tvprovider/Transforms/Metadata.xml index 99f709ce1..530e3df46 100644 --- a/source/androidx.tvprovider/tvprovider/Transforms/Metadata.xml +++ b/source/androidx.tvprovider/tvprovider/Transforms/Metadata.xml @@ -1,13 +1,23 @@  Java.Lang.Object - + + + + + + + + + + + + + + + + \ No newline at end of file From 9818920f9d4d9d1832f40a9b76930aad39ad4968 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Mon, 23 Feb 2026 15:01:57 +0000 Subject: [PATCH 4/4] Simplify Metadata.xml: remove unnecessary remove-node, use add-node only The class is already absent from api.xml (dropped by the binding generator before Metadata.xml transforms run), so remove-node was unnecessary. Now uses a single add-node to add the class with a package-private constructor and all fields. Co-authored-by: jonathanpeppers <840039+jonathanpeppers@users.noreply.github.com> --- .../androidx.tvprovider/tvprovider/Transforms/Metadata.xml | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/source/androidx.tvprovider/tvprovider/Transforms/Metadata.xml b/source/androidx.tvprovider/tvprovider/Transforms/Metadata.xml index 530e3df46..69d9e2f62 100644 --- a/source/androidx.tvprovider/tvprovider/Transforms/Metadata.xml +++ b/source/androidx.tvprovider/tvprovider/Transforms/Metadata.xml @@ -1,10 +1,9 @@  Java.Lang.Object - - +