From 5d0b4b0d11b2557b19e6bcc8dda41f4685c638d2 Mon Sep 17 00:00:00 2001 From: Brian Pellin Date: Sat, 21 Jan 2017 16:53:06 -0600 Subject: [PATCH] Make SAF changes work on older devices. --- .../compat/ContentResolverCompat.java | 52 +++++++++++++++++++ .../fileselect/FileSelectActivity.java | 9 ++-- 2 files changed, 57 insertions(+), 4 deletions(-) create mode 100644 app/src/main/java/com/keepassdroid/compat/ContentResolverCompat.java diff --git a/app/src/main/java/com/keepassdroid/compat/ContentResolverCompat.java b/app/src/main/java/com/keepassdroid/compat/ContentResolverCompat.java new file mode 100644 index 000000000..fdef1c6cb --- /dev/null +++ b/app/src/main/java/com/keepassdroid/compat/ContentResolverCompat.java @@ -0,0 +1,52 @@ +/* + * Copyright 2017 Brian Pellin. + * + * This file is part of KeePassDroid. + * + * KeePassDroid is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * KeePassDroid is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with KeePassDroid. If not, see . + * + */ +package com.keepassdroid.compat; + +import android.content.ContentResolver; +import android.net.Uri; + +import java.lang.reflect.Method; + +public class ContentResolverCompat { + public static boolean available; + private static Class contentResolver; + private static Method takePersistableUriPermission; + + static { + try { + contentResolver = ContentResolver.class; + takePersistableUriPermission = contentResolver.getMethod("takePersistableUriPermission", new Class[]{Uri.class, int.class}); + + available = true; + } catch (Exception e) { + available = false; + } + } + + public static void takePersistableUriPermission(ContentResolver resolver, Uri uri, int modeFlags) { + if (available) { + try { + takePersistableUriPermission.invoke(resolver, new Object[]{uri, modeFlags}); + } catch (Exception e) { + // Fail silently + } + } + } +} diff --git a/app/src/main/java/com/keepassdroid/fileselect/FileSelectActivity.java b/app/src/main/java/com/keepassdroid/fileselect/FileSelectActivity.java index 3e00a2c14..8cc2f2bd8 100644 --- a/app/src/main/java/com/keepassdroid/fileselect/FileSelectActivity.java +++ b/app/src/main/java/com/keepassdroid/fileselect/FileSelectActivity.java @@ -19,9 +19,9 @@ */ package com.keepassdroid.fileselect; -import android.annotation.SuppressLint; import android.app.Activity; import android.content.ActivityNotFoundException; +import android.content.ContentResolver; import android.content.Intent; import android.content.SharedPreferences; import android.net.Uri; @@ -54,6 +54,7 @@ import com.keepassdroid.PasswordActivity; import com.keepassdroid.ProgressTask; import com.keepassdroid.SetPasswordDialog; import com.keepassdroid.app.App; +import com.keepassdroid.compat.ContentResolverCompat; import com.keepassdroid.compat.StorageAF; import com.keepassdroid.database.edit.CreateDB; import com.keepassdroid.database.edit.FileOnFinish; @@ -358,7 +359,6 @@ public class FileSelectActivity extends Activity { }.execute(position); } - @SuppressLint("NewApi") @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); @@ -384,8 +384,9 @@ public class FileSelectActivity extends Activity { if (StorageAF.useStorageFramework(this)) { try { // try to persist read and write permissions - getContentResolver().takePersistableUriPermission(uri, Intent.FLAG_GRANT_READ_URI_PERMISSION); - getContentResolver().takePersistableUriPermission(uri, Intent.FLAG_GRANT_WRITE_URI_PERMISSION); + ContentResolver resolver = getContentResolver(); + ContentResolverCompat.takePersistableUriPermission(resolver, uri, Intent.FLAG_GRANT_READ_URI_PERMISSION); + ContentResolverCompat.takePersistableUriPermission(resolver, uri, Intent.FLAG_GRANT_WRITE_URI_PERMISSION); } catch (Exception e) { // nop }