From 9a66b9003fb286f0397fa8858ff20e45ff5d17ea Mon Sep 17 00:00:00 2001 From: Matt Portune <59324545+mportune-bw@users.noreply.github.com> Date: Wed, 29 Jan 2020 07:23:49 -0500 Subject: [PATCH] Made node recycling approach a bit more surgical to appease older versions of Android, and adjusted anchor position offset for older versions of Android (#711) --- .../Accessibility/AccessibilityHelpers.cs | 13 +++++++++++-- .../Accessibility/AccessibilityService.cs | 18 ------------------ src/Android/Accessibility/NodeList.cs | 3 ++- 3 files changed, 13 insertions(+), 21 deletions(-) diff --git a/src/Android/Accessibility/AccessibilityHelpers.cs b/src/Android/Accessibility/AccessibilityHelpers.cs index 03e4621aa..955342225 100644 --- a/src/Android/Accessibility/AccessibilityHelpers.cs +++ b/src/Android/Accessibility/AccessibilityHelpers.cs @@ -253,6 +253,7 @@ namespace Bit.Droid.Accessibility if(dispose) { n?.Recycle(); + n?.Dispose(); } return nodes; } @@ -291,7 +292,6 @@ namespace Bit.Droid.Accessibility if(usernameEditText != null) { isUsernameEditText = IsSameNode(usernameEditText, e.Source); - usernameEditText.Recycle(); } allEditTexts.Dispose(); @@ -370,7 +370,12 @@ namespace Bit.Droid.Accessibility var anchorViewRectTop = anchorViewRect.Top; anchorViewRect.Dispose(); - var calculatedTop = rootRectHeight - anchorViewRectTop - GetNavigationBarHeight(); + int calculatedTop = rootRectHeight - anchorViewRectTop; + if((int)Build.VERSION.SdkInt >= 24) + { + calculatedTop -= GetNavigationBarHeight(); + } + return new Point(anchorViewRectLeft, calculatedTop); } @@ -385,6 +390,10 @@ namespace Bit.Droid.Accessibility { return new Point(-1, -1); } + if(!anchorNode.Focused) + { + return null; + } // node.VisibleToUser doesn't always give us exactly what we want, so attempt to tighten up the range // of visibility diff --git a/src/Android/Accessibility/AccessibilityService.cs b/src/Android/Accessibility/AccessibilityService.cs index 69efd5130..dda364403 100644 --- a/src/Android/Accessibility/AccessibilityService.cs +++ b/src/Android/Accessibility/AccessibilityService.cs @@ -75,32 +75,27 @@ namespace Bit.Droid.Accessibility if(e.Source == null || e.PackageName == BitwardenPackage) { CancelOverlayPrompt(); - e.Recycle(); break; } root = RootInActiveWindow; if(root == null || root.PackageName != e.PackageName) { - e.Recycle(); break; } var isKnownBroswer = AccessibilityHelpers.SupportedBrowsers.ContainsKey(root.PackageName); if(e.EventType == EventTypes.ViewClicked && isKnownBroswer) { - e.Recycle(); break; } if(!(e.Source?.Password ?? false) && !AccessibilityHelpers.IsUsernameEditText(root, e)) { CancelOverlayPrompt(); - e.Recycle(); break; } if(ScanAndAutofill(root, e)) { CancelOverlayPrompt(); - e.Recycle(); } else { @@ -111,36 +106,27 @@ namespace Bit.Droid.Accessibility case EventTypes.WindowStateChanged: if(AccessibilityHelpers.LastCredentials == null) { - e.Recycle(); break; } if(e.PackageName == BitwardenPackage) { CancelOverlayPrompt(); - e.Recycle(); break; } root = RootInActiveWindow; if(root == null || root.PackageName != e.PackageName) { - e.Recycle(); break; } if(ScanAndAutofill(root, e)) { CancelOverlayPrompt(); } - e.Recycle(); break; default: break; } - - if(root != null) - { - root.Recycle(); - } } // Suppress exceptions so that service doesn't crash. catch(Exception ex) @@ -211,7 +197,6 @@ namespace Bit.Droid.Accessibility { System.Diagnostics.Debug.WriteLine(">>> Overlay Permission not granted"); Toast.MakeText(this, AppResources.AccessibilityOverlayPermissionAlert, ToastLength.Long).Show(); - e.Recycle(); return; } @@ -222,14 +207,12 @@ namespace Bit.Droid.Accessibility if(Java.Lang.JavaSystem.CurrentTimeMillis() - _lastAutoFillTime < 1000) { - e.Recycle(); return; } var uri = AccessibilityHelpers.GetUri(root); if(string.IsNullOrWhiteSpace(uri)) { - e.Recycle(); return; } @@ -301,7 +284,6 @@ namespace Bit.Droid.Accessibility windows = Windows; } var anchorPosition = AccessibilityHelpers.GetOverlayAnchorPosition(_anchorNode, root, windows); - root.Recycle(); if(anchorPosition == null) { diff --git a/src/Android/Accessibility/NodeList.cs b/src/Android/Accessibility/NodeList.cs index 9843e912f..13a1fbc83 100644 --- a/src/Android/Accessibility/NodeList.cs +++ b/src/Android/Accessibility/NodeList.cs @@ -10,8 +10,9 @@ namespace Bit.Droid.Accessibility { foreach(var item in this) { + item.Recycle(); item.Dispose(); } } } -} \ No newline at end of file +}