diff options
Diffstat (limited to 'src/android/jar/src/org/qtproject/qt5/android/QtNative.java')
-rw-r--r-- | src/android/jar/src/org/qtproject/qt5/android/QtNative.java | 128 |
1 files changed, 116 insertions, 12 deletions
diff --git a/src/android/jar/src/org/qtproject/qt5/android/QtNative.java b/src/android/jar/src/org/qtproject/qt5/android/QtNative.java index c1c4d5559d..a8bf4c15e1 100644 --- a/src/android/jar/src/org/qtproject/qt5/android/QtNative.java +++ b/src/android/jar/src/org/qtproject/qt5/android/QtNative.java @@ -44,14 +44,17 @@ import java.io.File; import java.io.FileNotFoundException; import java.util.ArrayList; import java.util.concurrent.Semaphore; +import java.io.IOException; import android.app.Activity; import android.app.Service; +import android.content.ActivityNotFoundException; import android.content.Context; import android.content.ContentResolver; import android.content.Intent; import android.content.pm.PackageManager; import android.content.pm.ActivityInfo; +import android.content.UriPermission; import android.net.Uri; import android.os.Build; import android.os.Handler; @@ -68,11 +71,13 @@ import android.view.Menu; import android.view.MotionEvent; import android.view.View; import android.view.InputDevice; +import android.database.Cursor; import java.lang.reflect.Method; import java.security.KeyStore; import java.security.cert.X509Certificate; import java.util.Iterator; +import java.util.List; import javax.net.ssl.TrustManagerFactory; import javax.net.ssl.TrustManager; import javax.net.ssl.X509TrustManager; @@ -152,35 +157,134 @@ public class QtNative } } - public static boolean openURL(String url, String mime) + private static Uri getUriWithValidPermission(Context context, String uri, String openMode) { - boolean ok = true; + try { + List<UriPermission> permissions = context.getContentResolver().getPersistedUriPermissions(); + String uriStr = Uri.parse(uri).getPath(); + + for (int i = 0; i < permissions.size(); ++i) { + Uri iterUri = permissions.get(i).getUri(); + boolean isRightPermission = permissions.get(i).isReadPermission(); + + if (!openMode.equals("r")) + isRightPermission = permissions.get(i).isWritePermission(); + + if (iterUri.getPath().equals(uriStr) && isRightPermission) + return iterUri; + } + + return null; + } catch (SecurityException e) { + e.printStackTrace(); + return null; + } + } + + public static boolean openURL(Context context, String url, String mime) + { + Uri uri = getUriWithValidPermission(context, url, "r"); + + if (uri == null) { + Log.e(QtTAG, "openURL(): No permissions to open Uri"); + return false; + } try { - Uri uri = Uri.parse(url); Intent intent = new Intent(Intent.ACTION_VIEW, uri); + intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); if (!mime.isEmpty()) intent.setDataAndType(uri, mime); + activity().startActivity(intent); - } catch (Exception e) { + + return true; + } catch (IllegalArgumentException e) { + Log.e(QtTAG, "openURL(): Invalid Uri"); + return false; + } catch (UnsupportedOperationException e) { + Log.e(QtTAG, "openURL(): Unsupported operation for given Uri"); + return false; + } catch (ActivityNotFoundException e) { e.printStackTrace(); - ok = false; + return false; } - - return ok; } public static int openFdForContentUrl(Context context, String contentUrl, String openMode) { + Uri uri = getUriWithValidPermission(context, contentUrl, openMode); + int error = -1; + + if (uri == null) { + Log.e(QtTAG, "openFdForContentUrl(): No permissions to open Uri"); + return error; + } + try { ContentResolver resolver = context.getContentResolver(); - ParcelFileDescriptor fdDesc = resolver.openFileDescriptor(Uri.parse(contentUrl), openMode); + ParcelFileDescriptor fdDesc = resolver.openFileDescriptor(uri, openMode); return fdDesc.detachFd(); } catch (FileNotFoundException e) { - return -1; - } catch (SecurityException e) { - Log.e(QtTAG, "Exception when opening file", e); - return -1; + return error; + } catch (IllegalArgumentException e) { + Log.e(QtTAG, "openFdForContentUrl(): Invalid Uri"); + return error; + } + } + + public static long getSize(Context context, String contentUrl) + { + Uri uri = getUriWithValidPermission(context, contentUrl, "r"); + long size = -1; + + if (uri == null) { + Log.e(QtTAG, "getSize(): No permissions to open Uri"); + return size; + } + + try { + ContentResolver resolver = context.getContentResolver(); + Cursor cur = resolver.query(uri, null, null, null, null); + if (cur != null) { + if (cur.moveToFirst()) + size = cur.getLong(5); // size column + cur.close(); + } + return size; + } catch (IllegalArgumentException e) { + Log.e(QtTAG, "getSize(): Invalid Uri"); + return size; + } catch (UnsupportedOperationException e) { + Log.e(QtTAG, "getSize(): Unsupported operation for given Uri"); + return size; + } + } + + public static boolean checkFileExists(Context context, String contentUrl) + { + Uri uri = getUriWithValidPermission(context, contentUrl, "r"); + boolean exists = false; + + if (uri == null) { + Log.e(QtTAG, "checkFileExists(): No permissions to open Uri"); + return exists; + } + + try { + ContentResolver resolver = context.getContentResolver(); + Cursor cur = resolver.query(uri, null, null, null, null); + if (cur != null) { + exists = true; + cur.close(); + } + return exists; + } catch (IllegalArgumentException e) { + Log.e(QtTAG, "checkFileExists(): Invalid Uri"); + return exists; + } catch (UnsupportedOperationException e) { + Log.e(QtTAG, "checkFileExists(): Unsupported operation for given Uri"); + return false; } } |