diff options
Diffstat (limited to 'src/android/jar/src/org/qtproject/qt5/android')
3 files changed, 20 insertions, 282 deletions
diff --git a/src/android/jar/src/org/qtproject/qt5/android/QtLayout.java b/src/android/jar/src/org/qtproject/qt5/android/QtLayout.java index 5bf1b2ff4b..e59ac39d9f 100644 --- a/src/android/jar/src/org/qtproject/qt5/android/QtLayout.java +++ b/src/android/jar/src/org/qtproject/qt5/android/QtLayout.java @@ -106,111 +106,34 @@ public class QtLayout extends ViewGroup final WindowManager windowManager = activity.getWindowManager(); Display display; - int appWidth = 0; - int appHeight = 0; - - int insetLeft = 0; - int insetTop = 0; + final WindowInsets rootInsets = getRootWindowInsets(); int maxWidth = 0; int maxHeight = 0; - double xdpi = 0; - double ydpi = 0; - double scaledDensity = 0; - double density = 0; - if (android.os.Build.VERSION.SDK_INT < Build.VERSION_CODES.R) { - display = windowManager.getDefaultDisplay(); - - final DisplayMetrics appMetrics = new DisplayMetrics(); - display.getMetrics(appMetrics); - - final WindowInsets rootInsets = getRootWindowInsets(); - - insetLeft = rootInsets.getStableInsetLeft(); - insetTop = rootInsets.getStableInsetTop(); - - int insetsWidth = rootInsets.getStableInsetRight() + rootInsets.getStableInsetLeft(); - int insetsHeight = rootInsets.getStableInsetTop() + rootInsets.getStableInsetBottom(); + display = windowManager.getDefaultDisplay(); - appWidth = appMetrics.widthPixels - insetsWidth; - appHeight = appMetrics.heightPixels - insetsHeight; - - final DisplayMetrics maxMetrics = new DisplayMetrics(); - display.getRealMetrics(maxMetrics); - - maxWidth = maxMetrics.widthPixels; - maxHeight = maxMetrics.heightPixels; - - density = appMetrics.density; - xdpi = appMetrics.xdpi; - ydpi = appMetrics.ydpi; - scaledDensity = appMetrics.scaledDensity; + final DisplayMetrics maxMetrics = new DisplayMetrics(); + display.getRealMetrics(maxMetrics); + maxWidth = maxMetrics.widthPixels; + maxHeight = maxMetrics.heightPixels; } else { - // after API 30 use getCurrentWindowMetrics for application metrics - // getMaximumWindowMetrics for the screen metrics - // resource configuration for density as best practice - // and the resource display metrics for the rest display = activity.getDisplay(); - final WindowMetrics appMetrics = windowManager.getCurrentWindowMetrics(); final WindowMetrics maxMetrics = windowManager.getMaximumWindowMetrics(); - - final WindowInsets windowInsets = appMetrics.getWindowInsets(); - Insets insets = windowInsets.getInsetsIgnoringVisibility(WindowInsets.Type.navigationBars() - | WindowInsets.Type.displayCutout()); - - insetLeft = insets.left; - insetTop = insets.top; - - int insetsWidth = insets.right + insets.left; - int insetsHeight = insets.top + insets.bottom; - - if (h == maxMetrics.getBounds().height()) { - //when h == maxheight the system is ignoring insets - insetsWidth = insetsHeight = insetLeft = insetTop = 0; - } - - appWidth = appMetrics.getBounds().width() - insetsWidth; - appHeight = appMetrics.getBounds().height() - insetsHeight; - maxWidth = maxMetrics.getBounds().width(); maxHeight = maxMetrics.getBounds().height(); - - final Resources resources = activity.getResources(); - final Configuration configuration = resources.getConfiguration(); - density = configuration.densityDpi / (float) DisplayMetrics.DENSITY_DEFAULT; - - final DisplayMetrics displayMetrics = resources.getDisplayMetrics(); - xdpi = displayMetrics.xdpi; - ydpi = displayMetrics.ydpi; - density = displayMetrics.density; - scaledDensity = displayMetrics.scaledDensity; } + final DisplayMetrics displayMetrics = activity.getResources().getDisplayMetrics(); + double xdpi = displayMetrics.xdpi; + double ydpi = displayMetrics.ydpi; + double density = displayMetrics.density; + double scaledDensity = displayMetrics.scaledDensity; float refreshRate = display.getRefreshRate(); - if ((appWidth > appHeight) != (w > h)) { - // This is an intermediate state during display rotation. - // The new size is still reported for old orientation, while - // realMetrics contain sizes for new orientation. Setting - // such parameters will produce inconsistent results, so - // we just skip them. - // We will have another onSizeChanged() with normal values - // a bit later. - return; - } - - final int flag = - activity.getWindow().getAttributes().flags & WindowManager.LayoutParams.FLAG_FULLSCREEN; - if (flag == WindowManager.LayoutParams.FLAG_FULLSCREEN) { - // immersive mode uses the whole screen - appWidth = maxWidth; - appHeight = maxHeight; - } - - QtNative.setApplicationDisplayMetrics(maxWidth, maxHeight, appWidth, appHeight, + QtNative.setApplicationDisplayMetrics(maxWidth, maxHeight, w, h, xdpi,ydpi,scaledDensity, density, refreshRate); diff --git a/src/android/jar/src/org/qtproject/qt5/android/QtMessageDialogHelper.java b/src/android/jar/src/org/qtproject/qt5/android/QtMessageDialogHelper.java index a3bbff4e1a..e84c5d75de 100644 --- a/src/android/jar/src/org/qtproject/qt5/android/QtMessageDialogHelper.java +++ b/src/android/jar/src/org/qtproject/qt5/android/QtMessageDialogHelper.java @@ -109,7 +109,8 @@ public class QtMessageDialogHelper try { TypedValue typedValue = new TypedValue(); m_theme.resolveAttribute(android.R.attr.alertDialogIcon, typedValue, true); - return m_activity.getResources().getDrawable(typedValue.resourceId); + return m_activity.getResources().getDrawable(typedValue.resourceId, + m_activity.getTheme()); } catch (Exception e) { e.printStackTrace(); } @@ -119,7 +120,8 @@ public class QtMessageDialogHelper { case 1: // Information try { - return m_activity.getResources().getDrawable(android.R.drawable.ic_dialog_info); + return m_activity.getResources().getDrawable(android.R.drawable.ic_dialog_info, + m_activity.getTheme()); } catch (Exception e) { e.printStackTrace(); } @@ -133,14 +135,16 @@ public class QtMessageDialogHelper // break; case 3: // Critical try { - return m_activity.getResources().getDrawable(android.R.drawable.ic_dialog_alert); + return m_activity.getResources().getDrawable(android.R.drawable.ic_dialog_alert, + m_activity.getTheme()); } catch (Exception e) { e.printStackTrace(); } break; case 4: // Question try { - return m_activity.getResources().getDrawable(android.R.drawable.ic_menu_help); + return m_activity.getResources().getDrawable(android.R.drawable.ic_menu_help, + m_activity.getTheme()); } catch (Exception e) { e.printStackTrace(); } 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 6cd091aab6..41ba50e964 100644 --- a/src/android/jar/src/org/qtproject/qt5/android/QtNative.java +++ b/src/android/jar/src/org/qtproject/qt5/android/QtNative.java @@ -45,8 +45,6 @@ import java.io.FileNotFoundException; import java.util.ArrayList; import java.util.Objects; import java.util.concurrent.Semaphore; -import java.io.IOException; -import java.util.HashMap; import android.app.Activity; import android.app.Service; @@ -115,9 +113,6 @@ public class QtNative private static Boolean m_tabletEventSupported = null; private static boolean m_usePrimaryClip = false; public static QtThread m_qtThread = new QtThread(); - private static HashMap<String, Uri> m_cachedUris = new HashMap<String, Uri>(); - private static ArrayList<String> m_knownDirs = new ArrayList<String>(); - private static final String NoPermissionErrorMessage = "No permissions to open Uri"; private static final Runnable runPendingCppRunnablesRunnable = new Runnable() { @Override @@ -244,190 +239,6 @@ public class QtNative } } - public static int openFdForContentUrl(Context context, String contentUrl, String openMode) - { - Uri uri = m_cachedUris.get(contentUrl); - if (uri == null) - uri = getUriWithValidPermission(context, contentUrl, openMode); - int error = -1; - - if (uri == null) { - Log.e(QtTAG, "openFdForContentUrl(): " + NoPermissionErrorMessage); - return error; - } - - try { - ContentResolver resolver = context.getContentResolver(); - ParcelFileDescriptor fdDesc = resolver.openFileDescriptor(uri, openMode); - return fdDesc.detachFd(); - } catch (FileNotFoundException e) { - e.printStackTrace(); - } catch (IllegalArgumentException e) { - Log.e(QtTAG, "openFdForContentUrl(): Invalid Uri"); - e.printStackTrace(); - } catch (SecurityException e) { - Log.e(QtTAG, NoPermissionErrorMessage); - } - return error; - } - - public static long getSize(Context context, String contentUrl) - { - long size = -1; - Uri uri = m_cachedUris.get(contentUrl); - if (uri == null) - uri = getUriWithValidPermission(context, contentUrl, "r"); - - if (uri == null) { - Log.e(QtTAG, NoPermissionErrorMessage); - return size; - } else if (!m_cachedUris.containsKey(contentUrl)) { - m_cachedUris.put(contentUrl, uri); - } - - try { - ContentResolver resolver = context.getContentResolver(); - Cursor cur = resolver.query(uri, new String[] { DocumentsContract.Document.COLUMN_SIZE }, null, null, null); - if (cur != null) { - if (cur.moveToFirst()) - size = cur.getLong(0); - cur.close(); - } - return size; - } catch (IllegalArgumentException e) { - Log.e(QtTAG, "getSize(): Invalid Uri"); - e.printStackTrace(); - } catch (UnsupportedOperationException e) { - Log.e(QtTAG, "getSize(): Unsupported operation for given Uri"); - e.printStackTrace(); - } catch (SecurityException e) { - Log.e(QtTAG, NoPermissionErrorMessage); - } - return size; - } - - public static boolean checkFileExists(Context context, String contentUrl) - { - boolean exists = false; - Uri uri = m_cachedUris.get(contentUrl); - if (uri == null) - uri = getUriWithValidPermission(context, contentUrl, "r"); - if (uri == null) { - Log.e(QtTAG, NoPermissionErrorMessage); - return exists; - } else { - if (!m_cachedUris.containsKey(contentUrl)) - m_cachedUris.put(contentUrl, uri); - } - - 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"); - e.printStackTrace(); - } catch (UnsupportedOperationException e) { - Log.e(QtTAG, "checkFileExists(): Unsupported operation for given Uri"); - e.printStackTrace(); - } catch (SecurityException e) { - Log.e(QtTAG, NoPermissionErrorMessage); - } - return exists; - } - - public static boolean checkIfWritable(Context context, String contentUrl) - { - return getUriWithValidPermission(context, contentUrl, "w") != null; - } - - public static boolean checkIfDir(Context context, String contentUrl) - { - boolean isDir = false; - Uri uri = m_cachedUris.get(contentUrl); - if (m_knownDirs.contains(contentUrl)) - return true; - if (uri == null) { - uri = getUriWithValidPermission(context, contentUrl, "r"); - } - if (uri == null) { - Log.e(QtTAG, NoPermissionErrorMessage); - return isDir; - } else { - if (!m_cachedUris.containsKey(contentUrl)) - m_cachedUris.put(contentUrl, uri); - } - - try { - final List<String> paths = uri.getPathSegments(); - // getTreeDocumentId will throw an exception if it is not a directory so check manually - if (!paths.get(0).equals("tree")) - return false; - ContentResolver resolver = context.getContentResolver(); - Uri docUri = DocumentsContract.buildDocumentUriUsingTree(uri, DocumentsContract.getTreeDocumentId(uri)); - if (!docUri.toString().startsWith(uri.toString())) - return false; - Cursor cur = resolver.query(docUri, new String[] { DocumentsContract.Document.COLUMN_MIME_TYPE }, null, null, null); - if (cur != null) { - if (cur.moveToFirst()) { - final String dirStr = new String(DocumentsContract.Document.MIME_TYPE_DIR); - isDir = cur.getString(0).equals(dirStr); - if (isDir) - m_knownDirs.add(contentUrl); - } - cur.close(); - } - return isDir; - } catch (IllegalArgumentException e) { - Log.e(QtTAG, "checkIfDir(): Invalid Uri"); - e.printStackTrace(); - } catch (UnsupportedOperationException e) { - Log.e(QtTAG, "checkIfDir(): Unsupported operation for given Uri"); - e.printStackTrace(); - } catch (SecurityException e) { - Log.e(QtTAG, NoPermissionErrorMessage); - } - return false; - } - public static String[] listContentsFromTreeUri(Context context, String contentUrl) - { - Uri treeUri = Uri.parse(contentUrl); - final ArrayList<String> results = new ArrayList<String>(); - if (treeUri == null) { - Log.e(QtTAG, "listContentsFromTreeUri(): Invalid uri"); - return results.toArray(new String[results.size()]); - } - final ContentResolver resolver = context.getContentResolver(); - final Uri docUri = DocumentsContract.buildDocumentUriUsingTree(treeUri, - DocumentsContract.getTreeDocumentId(treeUri)); - final Uri childrenUri = DocumentsContract.buildChildDocumentsUriUsingTree(docUri, - DocumentsContract.getDocumentId(docUri)); - Cursor c = null; - final String dirStr = new String(DocumentsContract.Document.MIME_TYPE_DIR); - try { - c = resolver.query(childrenUri, new String[] { - DocumentsContract.Document.COLUMN_DOCUMENT_ID, DocumentsContract.Document.COLUMN_DISPLAY_NAME, DocumentsContract.Document.COLUMN_MIME_TYPE }, null, null, null); - while (c.moveToNext()) { - final String fileString = c.getString(1); - if (!m_cachedUris.containsKey(contentUrl + "/" + fileString)) { - m_cachedUris.put(contentUrl + "/" + fileString, - DocumentsContract.buildDocumentUriUsingTree(treeUri, c.getString(0))); - } - results.add(fileString); - if (c.getString(2).equals(dirStr)) - m_knownDirs.add(contentUrl + "/" + fileString); - } - c.close(); - } catch (Exception e) { - Log.w(QtTAG, "Failed query: " + e); - return results.toArray(new String[results.size()]); - } - return results.toArray(new String[results.size()]); - } // this method loads full path libs public static void loadQtLibraries(final ArrayList<String> libraries) { |