-
-
Save rocboronat/65b1187a9fca9eabfebb5121d818a3c4 to your computer and use it in GitHub Desktop.
package com.fewlaps.android.permissiongranter; | |
import android.app.Activity; | |
import android.content.pm.PackageManager; | |
import android.os.Build; | |
import android.support.test.uiautomator.UiDevice; | |
import android.support.test.uiautomator.UiObject; | |
import android.support.test.uiautomator.UiObjectNotFoundException; | |
import android.support.test.uiautomator.UiSelector; | |
import android.support.v4.content.ContextCompat; | |
import static android.support.test.InstrumentationRegistry.getInstrumentation; | |
public class PermissionGranter { | |
private static final int PERMISSIONS_DIALOG_DELAY = 3000; | |
private static final int GRANT_BUTTON_INDEX = 1; | |
public static void allowPermissionsIfNeeded(String permissionNeeded) { | |
try { | |
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M && !hasNeededPermission(permissionNeeded)) { | |
sleep(PERMISSIONS_DIALOG_DELAY); | |
UiDevice device = UiDevice.getInstance(getInstrumentation()); | |
UiObject allowPermissions = device.findObject(new UiSelector() | |
.clickable(true) | |
.checkable(false) | |
.index(GRANT_BUTTON_INDEX)); | |
if (allowPermissions.exists()) { | |
allowPermissions.click(); | |
} | |
} | |
} catch (UiObjectNotFoundException e) { | |
System.out.println("There is no permissions dialog to interact with"); | |
} | |
} | |
private static boolean hasNeededPermission(String permissionNeeded) { | |
Context context = InstrumentationRegistry.getTargetContext(); | |
int permissionStatus = ContextCompat.checkSelfPermission(context, permissionNeeded); | |
return permissionStatus == PackageManager.PERMISSION_GRANTED; | |
} | |
private static void sleep(long millis) { | |
try { | |
Thread.sleep(millis); | |
} catch (InterruptedException e) { | |
throw new RuntimeException("Cannot execute Thread.sleep()"); | |
} | |
} | |
} | |
WEP! Instead of copying this class, please, just use this project: https://github.com/SchibstedSpain/Barista it's easier to maintain it :路) By the way, this line is written there to fail the compilation. Feel free to remove the whole class and depend on Barista :路) |
Thanks @tomhermann!
Thank you! This is awesome. Will GRANT_BUTTON_INDEX = 1 be consistent across different locale, device, etc..?
@bindzer as far as we know (and we test the app lots of times a day), yes :路) BTW, we don't work with RTL languages... if you find any issue, mention me and we'll fix it asap! Or propose a solution if possible, hihi! Thanks :路)
Thank you. This solved a huge problem I was having.
Not a big deal, but you'll make a lawyer happy if you add a free-to-use-for-commercial-purposes license to the gist :)
Wep @everyone! We added this class to Barista, our tool above Espresso and UiAutomator to make instrumental tests green: https://github.com/SchibstedSpain/Barista By the way, @autonomousapps Barista has a License so you can use wherever you want 馃帀
Thanks for your suggestions, that made this class better :路) Now, let's move to PR's! :路D
Wep @knezmilos13! Please, open a issue in Barista: https://github.com/SchibstedSpain/Barista we will manage all issues about this class there :路)
Please upgrade to androidx
I'm not really sure what the use-case is for this. Is it to grant your tests permission before they run? If so, then the GrantPermissionRule would be a better option.
If this is intended to be used as part of tests, then I'd remove the try/catch block and hasNeededPermission check, as those are both going to result in false positives. Edit: And probably a lot of other code in this. Really, the upshot anything that would keep the test from failing if the button is not found should be removed.
Hey @inhaledesign! All this work is now part of Barista, a framework over Espresso to test Android apps in no time. Feel free to open the discussion there: https://github.com/AdevintaSpain/Barista
Thanks for your feedback, though!
Thanks for the gist! Worked great with a minor alteration: line 22 should not be passing the context to the hasNeededPermission() method.