dotnet / dotnet/android-libraries
Xamarin.Google.Android.Play.App.Update : 2.1.0.9
- Dominant language
- C#
- Stars
- 317
- Forks
- 73
- Avg merge
- 1d 8h
- Merged PRs (30d)
- 17
Description
_This issue has been moved from [a ticket on Developer Community](https://developercommunity.visualstudio.com/t/XamarinGoogleAndroidPlayAppUpdate-:/10721137)._
---
[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.
#### 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>
Contributor guide
Assessment
This issue has not been assessed yet.