AppVersion.Android.cs 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148
  1. using System.Text.RegularExpressions;
  2. using Android.Content;
  3. using Android.Runtime;
  4. using InABox.Core;
  5. using Net = Android.Net;
  6. namespace InABox.Avalonia.Platform.Android
  7. {
  8. public class Android_AppVersion : IAppVersion
  9. {
  10. string _packageName = "";
  11. string _versionName = "";
  12. public Logger? Logger { get; set; }
  13. public Android_AppVersion() : base()
  14. {
  15. try
  16. {
  17. _packageName = Application.Context.PackageName;
  18. _versionName = Application.Context.PackageManager.GetPackageInfo(Application.Context.PackageName, 0).VersionName;
  19. }
  20. catch
  21. {
  22. }
  23. }
  24. /// <inheritdoc />
  25. public string InstalledVersionNumber() => _versionName;
  26. /// <inheritdoc />
  27. public async Task<bool> IsUsingLatestVersion()
  28. {
  29. try
  30. {
  31. var info = await GetLatestVersion(false);
  32. return String.IsNullOrWhiteSpace(info.Version)
  33. || (Version.Parse(info.Version).CompareTo(Version.Parse(_versionName)) <= 0);
  34. }
  35. catch (Exception e)
  36. {
  37. Logger?.Error($"Error in IsUsingLatestVersion(): {e.Message}\n{e.StackTrace}");
  38. }
  39. return true;
  40. }
  41. private static AppInfo _info;
  42. public async Task<AppInfo> GetLatestVersion(bool force)
  43. {
  44. if (force)
  45. _info = null;
  46. if (_info != null)
  47. return _info;
  48. _info = new AppInfo();
  49. // https://play.google.com/store/apps/details?id=comal.timesheets.Android&hl=en
  50. var url = $"https://play.google.com/store/apps/details?id={_packageName}&hl=en";
  51. try
  52. {
  53. using (var request = new HttpRequestMessage(HttpMethod.Get, url))
  54. {
  55. using (var handler = new HttpClientHandler())
  56. {
  57. handler.ServerCertificateCustomValidationCallback = (sender, cert, chain, sslPolicyErrors) =>
  58. {
  59. //bypass
  60. return true;
  61. };
  62. using (var client = new HttpClient(handler))
  63. {
  64. try
  65. {
  66. using (var responseMsg = await client.SendAsync(request, HttpCompletionOption.ResponseContentRead))
  67. {
  68. if (!responseMsg.IsSuccessStatusCode)
  69. {
  70. throw new LatestVersionException($"Error connecting to the Play Store. Url={url}.");
  71. }
  72. try
  73. {
  74. var content = responseMsg.Content == null ? null : await responseMsg.Content.ReadAsStringAsync();
  75. var versionMatch = Regex.Match(content, "\\[\\[\\[\"(\\d+\\.\\d+\\.\\d+)").Groups[1];
  76. if (versionMatch.Success)
  77. {
  78. _info.Version = versionMatch.Value.Trim();
  79. }
  80. }
  81. catch (Exception e)
  82. {
  83. throw new LatestVersionException($"Error parsing content from the Play Store. Url={url}.", e);
  84. }
  85. }
  86. }
  87. catch (Exception ex1)
  88. {
  89. }
  90. }
  91. }
  92. }
  93. }
  94. catch (Exception ex)
  95. {
  96. Logger?.Error($"Error in GetLatestVersion(): {ex.Message}\n{ex.StackTrace}");
  97. }
  98. return _info;
  99. }
  100. public Task OpenAppInStore()
  101. {
  102. try
  103. {
  104. try
  105. {
  106. var intent = new Intent(Intent.ActionView, Net.Uri.Parse($"market://details?id={_packageName}"));
  107. intent.SetPackage("com.android.vending");
  108. intent.SetFlags(ActivityFlags.NewTask);
  109. Application.Context.StartActivity(intent);
  110. }
  111. catch (ActivityNotFoundException)
  112. {
  113. var intent = new Intent(Intent.ActionView, Net.Uri.Parse($"https://play.google.com/store/apps/details?id={_packageName}"));
  114. Application.Context.StartActivity(intent);
  115. }
  116. }
  117. catch (Exception e)
  118. {
  119. Logger?.Error($"Error in OpenAppInStore(): {e.Message}\n{e.StackTrace}");
  120. }
  121. return Task.FromResult(true);
  122. }
  123. }
  124. }