dotnet / dotnet/android-libraries

Xamarin.Google.Android.Play.App.Update : 2.1.0.9

Open
#1,006 0 comments 0 reactions 0 assignees View on GitHub
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

Open the contributing guide

Assessment

This issue has not been assessed yet.

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.