aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorYuutaW <17158086+trumeet@users.noreply.github.com>2019-04-19 10:34:58 -0700
committerYuutaW <17158086+Trumeet@users.noreply.github.com>2019-04-19 10:34:58 -0700
commitdfed11731cef732e1767bddf43269d5bf14a7197 (patch)
tree82f13bbc30c25597d3548d702c08165db4e1d3e6
parente56c963435040fff497d92798ebbf2b16d63403f (diff)
downloadOhMySAF-dfed11731cef732e1767bddf43269d5bf14a7197.tar
OhMySAF-dfed11731cef732e1767bddf43269d5bf14a7197.tar.gz
OhMySAF-dfed11731cef732e1767bddf43269d5bf14a7197.tar.bz2
OhMySAF-dfed11731cef732e1767bddf43269d5bf14a7197.zip
feat(library): add an API to auto detect whatever the given uri is a file or tree
Signed-off-by: YuutaW <17158086+Trumeet@users.noreply.github.com>
-rw-r--r--app/src/main/java/moe/yuuta/ohmysafdemo/MainActivity.java58
-rw-r--r--ohmysaf/src/main/java/moe/yuuta/ohmysaf/OhMySAF.java23
2 files changed, 48 insertions, 33 deletions
diff --git a/app/src/main/java/moe/yuuta/ohmysafdemo/MainActivity.java b/app/src/main/java/moe/yuuta/ohmysafdemo/MainActivity.java
index fbea9ad..52b611d 100644
--- a/app/src/main/java/moe/yuuta/ohmysafdemo/MainActivity.java
+++ b/app/src/main/java/moe/yuuta/ohmysafdemo/MainActivity.java
@@ -9,7 +9,6 @@ import android.graphics.BitmapFactory;
import android.net.Uri;
import android.os.Bundle;
import android.os.ParcelFileDescriptor;
-import android.provider.DocumentsContract;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
@@ -24,6 +23,7 @@ import java.io.OutputStream;
import java.util.Arrays;
import moe.yuuta.ohmysaf.OhMySAF;
+import moe.yuuta.ohmysaf.SafFile;
public class MainActivity extends Activity implements View.OnClickListener {
private static final int RC_OPEN_DOC = 1;
@@ -32,8 +32,7 @@ public class MainActivity extends Activity implements View.OnClickListener {
private ImageView mImage;
private volatile Bitmap mBitmap;
- private volatile String mFileName;
- private Uri mUri;
+ private File mFile;
@Override
protected void onCreate(Bundle savedInstanceState) {
@@ -60,47 +59,40 @@ public class MainActivity extends Activity implements View.OnClickListener {
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
log("Activity result.....");
if (resultCode != RESULT_OK || data == null) return;
- mUri = data.getData();
+ final Uri mUri = data.getData();
log(mUri.toString());
+ mFile = OhMySAF.ohMyUri(this, mUri);
+ log("Name: " + mFile.getName() +
+ ", isFile: " + mFile.isFile() +
+ ", length: " + mFile.length() +
+ ", canWrite: " + mFile.canWrite() +
+ ", files: " + (mFile.isDirectory() ? Arrays.toString(mFile.list()) : "?"));
+ setTitle(mFile.getName());
switch (requestCode) {
case RC_OPEN_DOC:
- File dir1 = OhMySAF.ohMyFile(this, mUri);
- log("Name: " + dir1.getName() + ", length: " + dir1.length() +
- ", canWrite: " + dir1.canWrite());
- mFileName = dir1.getName();
- setTitle(mFileName);
- handleDocSelected(mUri);
+ handleDocSelected();
break;
case RC_CREATE_DOC:
- File dir2 = OhMySAF.ohMyFile(this, mUri);
- log("Name: " + dir2.getName() + ", length: " + dir2.length() +
- ", canWrite: " + dir2.canWrite());
- mFileName = dir2.getName();
- setTitle(mFileName);
- handleDocCreated(mUri);
+ handleDocCreated();
break;
case RC_OPEN_TREE:
- File dir = OhMySAF.ohMyTree(this, mUri);
- log("Name: " + dir.getName() + ", length: " + dir.length() +
- ", files: " + Arrays.toString(dir.listFiles()) +
- ", canWrite: " + dir.canWrite());
- mFileName = dir.getName();
- setTitle(mFileName);
+ mBitmap = null;
+ mImage.setImageBitmap(null);
break;
}
}
- private void handleDocCreated(@NonNull final Uri uri) {
+ private void handleDocCreated() {
new Thread(new Runnable() {
@Override
public void run() {
try {
- OutputStream stream = getContentResolver().openOutputStream(uri, "w");
+ OutputStream stream = getContentResolver().openOutputStream(((SafFile) mFile).getAndroidUri(), "w");
mBitmap.compress(Bitmap.CompressFormat.PNG, 100, stream);
stream.flush();
stream.close();
log("Write done");
- handleDocSelected(uri);
+ handleDocSelected();
} catch (IOException e) {
log("Write: " + e.getMessage());
}
@@ -108,13 +100,13 @@ public class MainActivity extends Activity implements View.OnClickListener {
}).start();
}
- private void handleDocSelected(@NonNull final Uri uri) {
+ private void handleDocSelected() {
new Thread(new Runnable() {
@Override
public void run() {
try {
ParcelFileDescriptor parcelFileDescriptor =
- getContentResolver().openFileDescriptor(uri, "r");
+ getContentResolver().openFileDescriptor(((SafFile) mFile).getAndroidUri(), "r");
FileDescriptor fileDescriptor = parcelFileDescriptor.getFileDescriptor();
mBitmap = BitmapFactory.decodeFileDescriptor(fileDescriptor);
parcelFileDescriptor.close();
@@ -181,26 +173,26 @@ public class MainActivity extends Activity implements View.OnClickListener {
Intent intentCreateDoc = new Intent(Intent.ACTION_CREATE_DOCUMENT);
intentCreateDoc.addCategory(Intent.CATEGORY_OPENABLE);
intentCreateDoc.setType("image/*");
- intentCreateDoc.putExtra(Intent.EXTRA_TITLE, "Copy_" + mFileName);
+ intentCreateDoc.putExtra(Intent.EXTRA_TITLE, "Copy_" + mFile.getName());
startActivityForResult(intentCreateDoc, RC_CREATE_DOC);
}
private void runDeleteDoc() {
try {
- DocumentsContract.deleteDocument(getContentResolver(), mUri);
+ mFile.delete();
log("Delete done");
- mFileName = null;
mBitmap = null;
- mUri = null;
+ mFile = null;
mImage.setImageBitmap(null);
setTitle(R.string.app_name);
- } catch (IOException e) {
+ } catch (Exception e) {
log("Delete: " + e.getMessage());
}
}
private void runTakePersistablePermission() {
- getContentResolver().takePersistableUriPermission(mUri, Intent.FLAG_GRANT_READ_URI_PERMISSION | Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
+ getContentResolver().takePersistableUriPermission(((SafFile) mFile).getAndroidUri(),
+ Intent.FLAG_GRANT_READ_URI_PERMISSION | Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
log("Done");
}
diff --git a/ohmysaf/src/main/java/moe/yuuta/ohmysaf/OhMySAF.java b/ohmysaf/src/main/java/moe/yuuta/ohmysaf/OhMySAF.java
index 94175ae..f38af8b 100644
--- a/ohmysaf/src/main/java/moe/yuuta/ohmysaf/OhMySAF.java
+++ b/ohmysaf/src/main/java/moe/yuuta/ohmysaf/OhMySAF.java
@@ -2,6 +2,8 @@ package moe.yuuta.ohmysaf;
import android.content.Context;
import android.net.Uri;
+import android.os.Build;
+import android.provider.DocumentsContract;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
@@ -23,4 +25,25 @@ public class OhMySAF {
if (file == null) return null;
return new SafFile(file);
}
+
+ /**
+ * Auto detect whatever the given uri is a tree uri or a file uri.
+ */
+ public static SafFile ohMyUri(@NonNull Context context, @NonNull Uri uri) {
+ if (isTreeUri(uri)) {
+ return ohMyTree(context, uri);
+ } else {
+ return ohMyFile(context, uri);
+ }
+ }
+
+ public static boolean isTreeUri(@NonNull Uri uri) {
+ if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) return false;
+ try {
+ DocumentsContract.getTreeDocumentId(uri);
+ return true;
+ } catch (IllegalArgumentException ignored) {
+ return false;
+ }
+ }
}