From d83fc186b270cc1f125d12d3bd7fe9e0c07136b5 Mon Sep 17 00:00:00 2001 From: Matthew Wong Date: Sat, 7 Nov 2015 19:48:00 -0500 Subject: [PATCH] Request system_alert_window permission in android m, fix #138, --- .../pwdstore/autofill/AutofillService.java | 20 +++++++++++-------- 1 file changed, 12 insertions(+), 8 deletions(-) diff --git a/app/src/main/java/com/zeapo/pwdstore/autofill/AutofillService.java b/app/src/main/java/com/zeapo/pwdstore/autofill/AutofillService.java index 9b4b7172..bd2464b8 100644 --- a/app/src/main/java/com/zeapo/pwdstore/autofill/AutofillService.java +++ b/app/src/main/java/com/zeapo/pwdstore/autofill/AutofillService.java @@ -1,6 +1,5 @@ package com.zeapo.pwdstore.autofill; -import android.Manifest; import android.accessibilityservice.AccessibilityService; import android.app.PendingIntent; import android.content.ClipData; @@ -11,10 +10,11 @@ import android.content.Intent; import android.content.SharedPreferences; import android.content.pm.ApplicationInfo; import android.content.pm.PackageManager; +import android.net.Uri; import android.os.Build; import android.os.Bundle; import android.preference.PreferenceManager; -import android.support.v4.content.ContextCompat; +import android.provider.Settings; import android.support.v7.app.AlertDialog; import android.util.Log; import android.util.TypedValue; @@ -69,12 +69,6 @@ public class AutofillService extends AccessibilityService { @Override public void onAccessibilityEvent(AccessibilityEvent event) { - if (ContextCompat.checkSelfPermission(this, Manifest.permission.SYSTEM_ALERT_WINDOW) - == PackageManager.PERMISSION_DENIED) { - // may need a way to request the permission but only activities can, so by notification? - return; - } - // if returning to the source app from a successful AutofillActivity if (event.getEventType() == AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED && event.getPackageName().equals(packageName) && resultData != null) { @@ -117,6 +111,16 @@ public class AutofillService extends AccessibilityService { return; } + // need to request permission before attempting to draw dialog + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M + && !Settings.canDrawOverlays(this)) { + Intent intent = new Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION, + Uri.parse("package:" + getApplicationContext().getPackageName())); + intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); + startActivity(intent); + return; + } + // we are now going to attempt to fill, save AccessibilityNodeInfo for later in decryptAndVerify // (there should be a proper way to do this, although this seems to work 90% of the time) info = source;