Skip to content

Commit

Permalink
feat: Added ability to debug listeners multiple times.
Browse files Browse the repository at this point in the history
  • Loading branch information
HavenDV committed Jan 2, 2024
1 parent faf221b commit a2b5843
Show file tree
Hide file tree
Showing 4 changed files with 123 additions and 78 deletions.
43 changes: 13 additions & 30 deletions sample/MainPage.xaml
Original file line number Diff line number Diff line change
@@ -1,40 +1,23 @@
<?xml version="1.0" encoding="utf-8" ?>
<ContentPage
x:Class="Maui.Android.InAppUpdates.MainPage"
x:DataType="inAppUpdates:MainPage"
xmlns="http:https://schemas.microsoft.com/dotnet/2021/maui"
xmlns:x="http:https://schemas.microsoft.com/winfx/2009/xaml"
xmlns:inAppUpdates="clr-namespace:Maui.Android.InAppUpdates"
x:DataType="inAppUpdates:MainPage">
xmlns:x="http:https://schemas.microsoft.com/winfx/2009/xaml">

<ScrollView>
<VerticalStackLayout
Padding="30,0"
Spacing="25">
<Image
Aspect="AspectFit"
HeightRequest="185"
SemanticProperties.Description="dot net bot in a race car number eight"
Source="dotnet_bot.png" />

<Label
SemanticProperties.HeadingLevel="Level1"
Style="{StaticResource Headline}"
Text="Hello, World!" />

<Label
SemanticProperties.Description="Welcome to dot net Multi platform App U I"
SemanticProperties.HeadingLevel="Level2"
Style="{StaticResource SubHeadline}"
Text="Welcome to &#10;.NET Multi-platform App UI" />

<Button
Command="{Binding SetUpdateAvailableWithPriorityOf3Command}"
HorizontalOptions="Fill"
Text="SetUpdateAvailableWithPriorityOf3Command" />
<Button
Command="{Binding SetUpdateAvailableWithPriorityOf5Command}"
HorizontalOptions="Fill"
Text="SetUpdateAvailableWithPriorityOf5Command" />
<VerticalStackLayout Padding="5" Spacing="5">
<Label Text="Test using FakeUpdateManager:" />
<Button Command="{Binding SetUpdateAvailableWithPriorityOf3Command}" Text="SetUpdateAvailableWithPriorityOf3Command" />
<Button Command="{Binding SetUpdateAvailableWithPriorityOf5Command}" Text="SetUpdateAvailableWithPriorityOf5Command" />
<Button Command="{Binding UserAcceptsUpdateCommand}" Text="UserAcceptsUpdate" />
<Button Command="{Binding DownloadStartsCommand}" Text="DownloadStarts" />
<Button Command="{Binding DownloadCompletesCommand}" Text="DownloadCompletes" />
<Button Command="{Binding InstallCompletesCommand}" Text="InstallCompletes" />
<Button Command="{Binding InstallFailsCommand}" Text="InstallFails" />
<Label Text="Test UI:" />
<Button Command="{Binding CompleteUpdateCommand}" Text="CompleteUpdate" />
</VerticalStackLayout>
</ScrollView>

Expand Down
83 changes: 80 additions & 3 deletions sample/MainPage.xaml.cs
Original file line number Diff line number Diff line change
@@ -1,10 +1,16 @@
using CommunityToolkit.Mvvm.Input;
using Maui.Android.InAppUpdates.Internal;
#if ANDROID
using Xamarin.Google.Android.Play.Core.AppUpdate.Testing;
#endif

namespace Maui.Android.InAppUpdates;

public partial class MainPage : ContentPage
{
#if ANDROID
private int _availableVersionCode = 2;
#endif

public MainPage()
{
InitializeComponent();
Expand All @@ -14,13 +20,84 @@ public MainPage()
[RelayCommand]
private void SetUpdateAvailableWithPriorityOf5()
{
DebugHelpers.SetUpdateAvailable(availableVersionCode: 2, priority: 5);
#if ANDROID
FakeAppUpdateManager.SetUpdatePriority(updatePriority: 5);
FakeAppUpdateManager.SetUpdateAvailable(availableVersionCode: _availableVersionCode++);
AddOnSuccessListener();
#endif
}

[RelayCommand]
private void SetUpdateAvailableWithPriorityOf3()
{
DebugHelpers.SetUpdateAvailable(availableVersionCode: 2, priority: 3);
#if ANDROID
FakeAppUpdateManager.SetUpdatePriority(updatePriority: 3);
FakeAppUpdateManager.SetUpdateAvailable(availableVersionCode: _availableVersionCode++);
AddOnSuccessListener();
#endif
}

[RelayCommand]
private void UserAcceptsUpdate()
{
#if ANDROID
FakeAppUpdateManager.UserAcceptsUpdate();
#endif
}

[RelayCommand]
private void DownloadStarts()
{
#if ANDROID
FakeAppUpdateManager.SetBytesDownloaded(0);
FakeAppUpdateManager.SetTotalBytesToDownload(10_000_000);
FakeAppUpdateManager.DownloadStarts();
#endif
}

[RelayCommand]
private void DownloadCompletes()
{
#if ANDROID
FakeAppUpdateManager.SetBytesDownloaded(10_000_000);
FakeAppUpdateManager.DownloadCompletes();
#endif
}

[RelayCommand]
private void InstallCompletes()
{
#if ANDROID
FakeAppUpdateManager.InstallCompletes();
#endif
}

[RelayCommand]
private void InstallFails()
{
#if ANDROID
FakeAppUpdateManager.InstallFails();
#endif
}

[RelayCommand]
private void CompleteUpdate()
{
#if ANDROID
Internal.Handler.Options.CompleteUpdateAction(
Platform.CurrentActivity!,
Internal.Handler.AppUpdateManager!);
#endif
}

#if ANDROID
private static FakeAppUpdateManager FakeAppUpdateManager =>
(Internal.Handler.AppUpdateManager as FakeAppUpdateManager)!;

private static void AddOnSuccessListener()
{
FakeAppUpdateManager.AppUpdateInfo.AddOnSuccessListener(Internal.Handler.AppUpdateSuccessListener!);
}
#endif
}

Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
using Android.Content;
using Xamarin.Google.Android.Play.Core.AppUpdate;
using Xamarin.Google.Android.Play.Core.AppUpdate.Testing;
using Xamarin.Google.Android.Play.Core.Install.Model;
using Xamarin.Google.Android.Play.Core.Tasks;
using Activity = Android.App.Activity;
Expand All @@ -14,6 +13,8 @@ public class AppUpdateSuccessListener(
Intent? intent)
: Java.Lang.Object, IOnSuccessListener
{
public InstallStateUpdatedListener? InstallStateUpdatedListener { get; private set; }

public void OnSuccess(Java.Lang.Object p0)
{
if (p0 is not AppUpdateInfo info)
Expand All @@ -23,48 +24,37 @@ public void OnSuccess(Java.Lang.Object p0)

Handler.Options.DebugAction($"AVAILABLE VERSION CODE {info.AvailableVersionCode()}");

switch (info.UpdateAvailability())
var updateAvailability = info.UpdateAvailability();
var updatePriority = info.UpdatePriority();
var isImmediateUpdatesAllowed = info.IsUpdateTypeAllowed(AppUpdateType.Immediate);
var isFlexibleUpdatesAllowed = info.IsUpdateTypeAllowed(AppUpdateType.Flexible);
switch (updateAvailability)
{
case UpdateAvailability.UpdateAvailable or UpdateAvailability.DeveloperTriggeredUpdateInProgress when
info.UpdatePriority() >= Handler.Options.ImmediateUpdatePriority &&
info.IsUpdateTypeAllowed(AppUpdateType.Immediate):
updatePriority >= Handler.Options.ImmediateUpdatePriority &&
isImmediateUpdatesAllowed:
{
_ = appUpdateManager.StartUpdateFlowForResult(
info,
AppUpdateType.Immediate,
activity,
updateRequest);

if (appUpdateManager is FakeAppUpdateManager { IsImmediateFlowVisible: true } fakeAppUpdate)
{
fakeAppUpdate.UserAcceptsUpdate();
fakeAppUpdate.DownloadStarts();
fakeAppUpdate.DownloadCompletes();

Handler.Options.CompleteUpdateAction(activity, appUpdateManager);
}
break;
}

case UpdateAvailability.UpdateAvailable or UpdateAvailability.DeveloperTriggeredUpdateInProgress when
info.IsUpdateTypeAllowed(AppUpdateType.Flexible):
isFlexibleUpdatesAllowed:
{
appUpdateManager.RegisterListener(new InstallStateUpdatedListener(
InstallStateUpdatedListener ??= new InstallStateUpdatedListener(
context: activity,
appUpdateManager: appUpdateManager));
appUpdateManager: appUpdateManager);
appUpdateManager.RegisterListener(InstallStateUpdatedListener);

_ = appUpdateManager.StartUpdateFlowForResult(
info,
AppUpdateType.Flexible,
activity,
updateRequest);

if (appUpdateManager is FakeAppUpdateManager fakeAppUpdate)
{
fakeAppUpdate.UserAcceptsUpdate();
fakeAppUpdate.DownloadStarts();
fakeAppUpdate.DownloadCompletes();
}
break;
}

Expand Down
39 changes: 17 additions & 22 deletions src/libs/Maui.Android.InAppUpdates/Platforms/Android/Handler.cs
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,9 @@ public static class Handler
/// </summary>
public static IAppUpdateManager? AppUpdateManager { get; private set; }

public static AppUpdateSuccessListener? AppUpdateSuccessListener { get; private set; }
public static ResumeSuccessListener? ResumeSuccessListener { get; private set; }

/// <summary>
/// Options for the in-app updates.
/// </summary>
Expand All @@ -35,27 +38,15 @@ public static void HandleCreate(Activity activity, Bundle? savedInstanceState)
{
activity = activity ?? throw new ArgumentNullException(nameof(activity));

if (Options.UseFakeAppUpdateManager)
{
var updateManager = new FakeAppUpdateManager(activity);
/* The below line of code will trigger the fake app update manager which it will display the alert dialog
Let say if we comment this line of code to simulate update is not available then the play core update not available flag
will be captured on the appupdatesuccess listener.
If comment this line it will simulate if the app update is not available. Then you can add logic when update is not available using immeidate update*/
//updateManager.SetUpdateAvailable(3); // your higher app version code that can be used to test fakeappupdate manager
//updateManager.SetUpdatePriority(4);
AppUpdateManager = updateManager;
}
else
{
AppUpdateManager = AppUpdateManagerFactory.Create(activity);
}

AppUpdateManager.AppUpdateInfo.AddOnSuccessListener(new AppUpdateSuccessListener(
AppUpdateManager = Options.UseFakeAppUpdateManager
? new FakeAppUpdateManager(activity)
: AppUpdateManagerFactory.Create(activity);
AppUpdateSuccessListener ??= new AppUpdateSuccessListener(
appUpdateManager: AppUpdateManager,
activity: activity,
updateRequest: RequestUpdate,
intent: activity.Intent));
intent: activity.Intent);
AppUpdateManager.AppUpdateInfo.AddOnSuccessListener(AppUpdateSuccessListener);
}

/// <summary>
Expand All @@ -64,9 +55,15 @@ public static void HandleCreate(Activity activity, Bundle? savedInstanceState)
/// <param name="activity"></param>
public static void HandleResume(Activity activity)
{
AppUpdateManager?.AppUpdateInfo.AddOnSuccessListener(new ResumeSuccessListener(
if (AppUpdateManager is null)
{
return;
}

ResumeSuccessListener ??= new ResumeSuccessListener(
context: activity,
appUpdateManager: AppUpdateManager));
appUpdateManager: AppUpdateManager);
AppUpdateManager.AppUpdateInfo.AddOnSuccessListener(ResumeSuccessListener);
}

/// <summary>
Expand All @@ -91,8 +88,6 @@ public static void HandleResume(Activity activity)
switch (resultCode)
{
case Result.Ok:
// In app update success
//if (AppUpdateTypeSupported == AppUpdateType.Immediate)
Options.AppUpdatedAction(activity);
break;

Expand Down

0 comments on commit a2b5843

Please sign in to comment.