package com.openfarmanager.android.filesystem.commands; import android.annotation.TargetApi; import android.content.UriPermission; import android.net.Uri; import android.os.Build; import android.provider.DocumentsContract; import com.openfarmanager.android.App; import com.openfarmanager.android.core.AbstractCommand; import com.openfarmanager.android.model.exeptions.SdcardPermissionException; import java.io.File; import java.util.List; /** * @author Vlad Namashko. */ public abstract class AbstractPermissionCommand implements AbstractCommand { protected boolean checkVersion() { return Build.VERSION.SDK_INT >= 21; } @TargetApi(Build.VERSION_CODES.LOLLIPOP) protected boolean checkForPermissionAndGetDestinationUrl (String sdCardPath, String currentPath) { List<UriPermission> persistedUriPermissions = App.sInstance.getContentResolver().getPersistedUriPermissions(); if (persistedUriPermissions != null && persistedUriPermissions.size() > 0 && persistedUriPermissions.get(0).isWritePermission()) { UriPermission permission = persistedUriPermissions.get(0); Uri uri = permission.getUri(); String subDir = currentPath.substring(sdCardPath.length()); if (subDir.startsWith(File.separator)) { subDir = subDir.substring(1); } Uri docUri = DocumentsContract.buildDocumentUriUsingTree(uri, DocumentsContract.getTreeDocumentId(Uri.parse(uri.getEncodedPath() + subDir.replace("/", "%2F")))); return executeCommand(docUri); } else { throw new SdcardPermissionException(); } } /** * Execute specific command with Storage Api. * * @param uri of destination directory. * @return <code>true</code> if command was successfully executed, <code>false</code> otherwise. */ protected abstract boolean executeCommand(Uri uri); }