trying to remove memory leak in AccService

This commit is contained in:
Philipp Crocoll 2016-01-20 22:13:30 +01:00
parent 8cda4e8919
commit 4b0d727a41
1 changed files with 29 additions and 15 deletions

View File

@ -48,11 +48,12 @@ namespace keepass2android.AutoFill
if (e.PackageName == "com.android.systemui") if (e.PackageName == "com.android.systemui")
return; //avoid that the notification is cancelled when pulling down notif drawer return; //avoid that the notification is cancelled when pulling down notif drawer
var root = RootInActiveWindow; var root = RootInActiveWindow;
if ((ExistsNodeOrChildren(root, n => n.WindowId == e.WindowId) && !ExistsNodeOrChildren(root, n => (n.ViewIdResourceName != null) && (n.ViewIdResourceName.StartsWith("com.android.systemui"))))) int eventWindowId = e.WindowId;
if ((ExistsNodeOrChildren(root, n => n.WindowId == eventWindowId) && !ExistsNodeOrChildren(root, IsSystemUi)))
{ {
bool cancelNotification = true; bool cancelNotification = true;
var allEditTexts = GetNodeOrChildren(root, n=> { return IsEditText(n); }); var allEditTexts = GetNodeOrChildren(root, IsEditText);
var usernameEdit = allEditTexts.TakeWhile(edit => (edit.Password == false)).LastOrDefault(); var usernameEdit = allEditTexts.TakeWhile(edit => (edit.Password == false)).LastOrDefault();
@ -72,7 +73,7 @@ namespace keepass2android.AutoFill
UrlFromAddressField(ref url, addressField); UrlFromAddressField(ref url, addressField);
} }
List<AccessibilityNodeInfo> emptyPasswordFields = GetNodeOrChildren(root, n => { return IsPasswordField(n); }).ToList(); List<AccessibilityNodeInfo> emptyPasswordFields = GetNodeOrChildren(root, IsPasswordField);
if (emptyPasswordFields.Any()) if (emptyPasswordFields.Any())
{ {
if ((LastReceivedCredentialsUser != null) && IsSame(GetCredentialsField(PwDefs.UrlField), url)) if ((LastReceivedCredentialsUser != null) && IsSame(GetCredentialsField(PwDefs.UrlField), url))
@ -91,7 +92,7 @@ namespace keepass2android.AutoFill
} }
AskFillPassword(url, usernameEdit, emptyPasswordFields); AskFillPassword(url, usernameEdit, emptyPasswordFields);
cancelNotification = false; cancelNotification = false;
} }
} }
@ -107,7 +108,13 @@ namespace keepass2android.AutoFill
} }
private static void UrlFromAddressField(ref string url, AccessibilityNodeInfo addressField)
private bool IsSystemUi(AccessibilityNodeInfo n)
{
return (n.ViewIdResourceName != null) && (n.ViewIdResourceName.StartsWith("com.android.systemui"));
}
private static void UrlFromAddressField(ref string url, AccessibilityNodeInfo addressField)
{ {
if (addressField != null) if (addressField != null)
{ {
@ -139,7 +146,7 @@ namespace keepass2android.AutoFill
return (n.ClassName != null) && (n.ClassName.Contains("EditText")); return (n.ClassName != null) && (n.ClassName.Contains("EditText"));
} }
private void AskFillPassword(string url, AccessibilityNodeInfo usernameEdit, IEnumerable<AccessibilityNodeInfo> passwordFields) private void AskFillPassword(string url, AccessibilityNodeInfo usernameEdit, List<AccessibilityNodeInfo> passwordFields)
{ {
Intent startKp2aIntent = PackageManager.GetLaunchIntentForPackage(ApplicationContext.PackageName); Intent startKp2aIntent = PackageManager.GetLaunchIntentForPackage(ApplicationContext.PackageName);
@ -190,7 +197,7 @@ namespace keepass2android.AutoFill
} }
private void FillPassword(string url, AccessibilityNodeInfo usernameEdit, IEnumerable<AccessibilityNodeInfo> passwordFields) private void FillPassword(string url, AccessibilityNodeInfo usernameEdit, List<AccessibilityNodeInfo> passwordFields)
{ {
if ((Keepass2android.Kbbridge.KeyboardData.HasData) && (_hasUsedData == false)) if ((Keepass2android.Kbbridge.KeyboardData.HasData) && (_hasUsedData == false))
{ {
@ -236,22 +243,29 @@ namespace keepass2android.AutoFill
private bool ExistsNodeOrChildren(AccessibilityNodeInfo n, Func<AccessibilityNodeInfo, bool> p) private bool ExistsNodeOrChildren(AccessibilityNodeInfo n, Func<AccessibilityNodeInfo, bool> p)
{ {
return GetNodeOrChildren(n, p).Any(); if (p(n))
return true;
for (int i = 0; i < n.ChildCount; i++)
{
if (ExistsNodeOrChildren(n.GetChild(i), p))
return true;
}
return false;
} }
private IEnumerable<AccessibilityNodeInfo> GetNodeOrChildren(AccessibilityNodeInfo n, Func<AccessibilityNodeInfo, bool> p) private List<AccessibilityNodeInfo> GetNodeOrChildren(AccessibilityNodeInfo n, Func<AccessibilityNodeInfo, bool> p)
{ {
List<AccessibilityNodeInfo> result = new List<AccessibilityNodeInfo>();
if (n != null) if (n != null)
{ {
if (p(n)) if (p(n))
yield return n; result.Add(n);
for (int i = 0; i < n.ChildCount; i++) for (int i = 0; i < n.ChildCount; i++)
{ {
foreach (var x in GetNodeOrChildren(n.GetChild(i), p)) result.AddRange(GetNodeOrChildren(n.GetChild(i), p));
yield return x;
} }
} }
return result;
} }
public override void OnInterrupt() public override void OnInterrupt()