[severity:It bothers me. A fix would be nice]
DotNet-8.0-Android : In-App Update Build Failing
Using Nuget package Xamarin.Google.Android.Play.Core.AppUpdate (Version: 2.1.0.9)
Build Is Failing with this error:
1. Home_AppUpdateInstallUpdateListner is not abstract and does not override abstract method onStateUpdate(InstallState) in StateUpdatedListener
public class Home_AppUpdateInstallUpdateListner
2. name clash: onStateUpdate(Object) in Home_AppUpdateInstallUpdateListner and onStateUpdate(InstallState) in StateUpdatedListener have the same erasure, yet neither overrides the other public void onStateUpdate (java.lang.Object p0)
Code I'm Using : FileName : Home.cs
using Xamarin.Google.Android.Play.Core.AppUpdate;
using Xamarin.Google.Android.Play.Core.AppUpdate.Install;
using Xamarin.Google.Android.Play.Core.AppUpdate.Install.Model;
public IAppUpdateManager? AppUpdateManager;
private AppUpdateInstallUpdateListner? MyInstallUpdateListner;
public const int AppUpdateTypeSupported = AppUpdateType.Flexible;
protected override void OnCreate(Bundle? savedInstanceState)
{
base. OnCreate(savedInstanceState);
HomeLayout = BindingHome.Inflate(LayoutInflater);
SetContentView(HomeLayout.Root);
try
{
OneSignal.Notifications.RequestPermissionAsync(true);
App.SetUserId();
AppUpdateManager = AppUpdateManagerFactory.Create(this);
MyInstallUpdateListner = new AppUpdateInstallUpdateListner(AppUpdateManager);
AppUpdateManager.RegisterListener(MyInstallUpdateListner);
var AppUpdateInfoTask = AppUpdateManager.GetAppUpdateInfo();
AppUpdateInfoTask.AddOnSuccessListener(new InAppUpdateSuccessListener(AppUpdateManager, this));
}
catch (Exception Ex) { App.ReportError(Ex); }
}
public class InAppUpdateSuccessListener(IAppUpdateManager? AppUpdateManager, Activity? Home) : Java.Lang.Object, IOnSuccessListener
{
private readonly IAppUpdateManager? AppUpdateManager = AppUpdateManager;
private readonly Activity? Home = Home;
public void OnSuccess(Java.Lang.Object result)
{
if (result is not AppUpdateInfo EInfo)
{
return;
}
if (EInfo.InstallStatus() == InstallStatus.Downloaded)
{
AppUpdateManager?. CompleteUpdate();
return;
}
int IAvailability = EInfo.UpdateAvailability();
if ((IAvailability.Equals(UpdateAvailability.UpdateAvailable) ||
IAvailability.Equals(UpdateAvailability.DeveloperTriggeredUpdateInProgress)) &&
EInfo.IsUpdateTypeAllowed(AppUpdateType.Immediate))
{
AppUpdateOptions? Options = AppUpdateOptions.NewBuilder(AppUpdateTypeSupported). Build();
AppUpdateManager?. StartUpdateFlow(EInfo, Home, Options);
}
}
}
public class AppUpdateInstallUpdateListner(IAppUpdateManager? AppUpdateManager) : Java.Lang.Object, IInstallStateUpdatedListener
{
public IAppUpdateManager? AppUpdateManager = AppUpdateManager;
public void OnStateUpdate(Java.Lang.Object p0)
{
if (p0 is not InstallState state)
{
return;
}
if (state. InstallStatus() == InstallStatus.Downloaded)
{
AppUpdateManager?. CompleteUpdate();
}
}
}
Original Comments
Feedback Bot on 14/08/2024, 03:38 AM:
We have directed your feedback to the appropriate engineering team for further evaluation. The team will review the feedback and notify you about the next steps.
The idea is you write a Wrapper class which exposes a non generic API to C#. You can then add this java file to your project with a AndroidJavaSource build action. It will bind it just before the build and your new API should show up.
The source code I have linked to should give you an idea of what to do.
Dean Ellis [MSFT] on 10/10/2024, 07:03 PM:
I put together a sample for you
package xamarin.google.android.play.core.install;
import com.google.android.play.core.install.InstallStateUpdatedListener;
import com.google.android.play.core.install.InstallState;
publicclassInstallStateUpdatedListenerWrapper{
private InstallStateUpdatedListener installStateUpdatedListener = state -> {
onStateUpdate (state);
};
voidonStateUpdate(InstallState state){
if (stateUpdateListener != null)
stateUpdateListener.OnStateUpdate(state);
}
public InstallStateUpdatedListener GetListener(){
return installStateUpdatedListener;
}
publicinterfaceInstallStateListener{
/**
* Called when an the State is Updated
*
* @param state The Install Session State.
*/abstractvoidOnStateUpdate(InstallState state);
}
private InstallStateListener stateUpdateListener = null;
publicvoidsetStateUpdateListener(InstallStateListener listener){
stateUpdateListener = listener;
}
}
and the C# side will be
var installListener = new InstallStateUpdatedListenerWrapper();
installListener.StateUpdate += (sender, args) => {
// do stuff.
};
This issue has been moved from a ticket on Developer Community.
[severity:It bothers me. A fix would be nice] DotNet-8.0-Android : In-App Update Build Failing
Using Nuget package Xamarin.Google.Android.Play.Core.AppUpdate (Version: 2.1.0.9) Build Is Failing with this error: 1. Home_AppUpdateInstallUpdateListner is not abstract and does not override abstract method onStateUpdate(InstallState) in StateUpdatedListener public class Home_AppUpdateInstallUpdateListner
2. name clash: onStateUpdate(Object) in Home_AppUpdateInstallUpdateListner and onStateUpdate(InstallState) in StateUpdatedListener have the same erasure, yet neither overrides the other public void onStateUpdate (java.lang.Object p0)
Code I'm Using : FileName : Home.cs
Original Comments
Feedback Bot on 14/08/2024, 03:38 AM:
We have directed your feedback to the appropriate engineering team for further evaluation. The team will review the feedback and notify you about the next steps.
Dean Ellis [MSFT] on 10/10/2024, 11:24 AM:
Hi
There is a problem with Binding generics in C#. Unfortunately the API you want to use has generics.
To work around this you can take a look at something we did for Asset Delivery https://github.com/xamarin/GooglePlayServicesComponents/blob/main/source/com.google.android.play/asset.delivery.extensions/extensions-aar/src/main/java/xamarin/google/android/play/core/assetpacks/AssetPackStateUpdateListenerWrapper.java.
The idea is you write a Wrapper class which exposes a non generic API to C#. You can then add this java file to your project with a
AndroidJavaSource
build action. It will bind it just before the build and your new API should show up.The source code I have linked to should give you an idea of what to do.
Dean Ellis [MSFT] on 10/10/2024, 07:03 PM:
I put together a sample for you
package xamarin.google.android.play.core.install; import com.google.android.play.core.install.InstallStateUpdatedListener; import com.google.android.play.core.install.InstallState; public class InstallStateUpdatedListenerWrapper { private InstallStateUpdatedListener installStateUpdatedListener = state -> { onStateUpdate (state); }; void onStateUpdate(InstallState state) { if (stateUpdateListener != null) stateUpdateListener.OnStateUpdate(state); } public InstallStateUpdatedListener GetListener() { return installStateUpdatedListener; } public interface InstallStateListener { /** * Called when an the State is Updated * * @param state The Install Session State. */ abstract void OnStateUpdate (InstallState state); } private InstallStateListener stateUpdateListener = null; public void setStateUpdateListener (InstallStateListener listener) { stateUpdateListener = listener; } }
and the C# side will be
var installListener = new InstallStateUpdatedListenerWrapper(); installListener.StateUpdate += (sender, args) => { // do stuff. };
I did however have to add this to my csproj
<Target Name="_Foo" AfterTargets="ResolveAndroidTooling" BeforeTargets="_CompileBindingJava"> <ItemGroup> <_ReferenceJavaLibs Include="$(AndroidSdkBuildToolsPath)core-lambda-stubs.jar" /> </ItemGroup>