UiAutomationPermissionGranter.java

package androidx.test.runner.permission;

import android.app.UiAutomation;
import android.content.Context;
import android.content.pm.PackageManager;
import android.util.Log;
import androidx.annotation.NonNull;
import androidx.annotation.RequiresApi;
import androidx.annotation.RestrictTo;
import androidx.annotation.RestrictTo.Scope;
import androidx.test.internal.platform.content.PermissionGranter;
import androidx.test.platform.app.InstrumentationRegistry;
import java.util.Collections;
import java.util.LinkedHashSet;
import java.util.Set;

/**
 * A {@link PermissionGranter} that uses {@link
 * android.app.UiAutomation#grantRuntimePermission(String, String)}
 *
 * @hide
 */
@RestrictTo(Scope.LIBRARY_GROUP)
@RequiresApi(28)
public class UiAutomationPermissionGranter implements PermissionGranter {
  private static final String TAG = "UiAutomationPermGranter";
  private final Set<String> permissionsToGrant = new LinkedHashSet<>();

  @Override
  public void addPermissions(@NonNull String... permissions) {
    Collections.addAll(permissionsToGrant, permissions);
  }

  @Override
  public void requestPermissions() {
    Context targetContext = InstrumentationRegistry.getInstrumentation().getTargetContext();
    UiAutomation uiAutomation = InstrumentationRegistry.getInstrumentation().getUiAutomation();
    for (String permission : permissionsToGrant) {
      if (!isPermissionGranted(targetContext, permission)) {
        Log.i(
            TAG,
            String.format(
                "Attempting to grant %s to %s", permission, targetContext.getPackageName()));
        uiAutomation.grantRuntimePermission(targetContext.getPackageName(), permission);
      } else {
        Log.i(TAG, "Permission: " + permission + " is already granted!");
      }
    }
  }

  private boolean isPermissionGranted(Context targetContext, String permission) {
    return targetContext.checkCallingOrSelfPermission(permission)
        == PackageManager.PERMISSION_GRANTED;
  }
}