summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/android/jar/AndroidManifest.xml1
-rw-r--r--src/android/jar/src/org/qtproject/qt5/android/QtActivityDelegate.java106
-rw-r--r--src/android/jar/src/org/qtproject/qt5/android/QtLayout.java11
-rw-r--r--src/android/jar/src/org/qtproject/qt5/android/QtNative.java66
-rw-r--r--src/android/jar/src/org/qtproject/qt5/android/QtSurface.java103
-rw-r--r--src/corelib/global/qlogging.cpp2
-rw-r--r--src/corelib/kernel/qjni_p.h12
-rw-r--r--src/opengl/opengl.pro3
-rw-r--r--src/plugins/platforms/android/android.json (renamed from src/plugins/platforms/android/src/android.json)0
-rw-r--r--src/plugins/platforms/android/android.pro81
-rw-r--r--src/plugins/platforms/android/androidjniaccessibility.cpp (renamed from src/plugins/platforms/android/src/androidjniaccessibility.cpp)0
-rw-r--r--src/plugins/platforms/android/androidjniaccessibility.h (renamed from src/plugins/platforms/android/src/androidjniaccessibility.h)0
-rw-r--r--src/plugins/platforms/android/androidjniclipboard.cpp (renamed from src/plugins/platforms/android/src/androidjniclipboard.cpp)0
-rw-r--r--src/plugins/platforms/android/androidjniclipboard.h (renamed from src/plugins/platforms/android/src/androidjniclipboard.h)0
-rw-r--r--src/plugins/platforms/android/androidjniinput.cpp (renamed from src/plugins/platforms/android/src/androidjniinput.cpp)0
-rw-r--r--src/plugins/platforms/android/androidjniinput.h (renamed from src/plugins/platforms/android/src/androidjniinput.h)0
-rw-r--r--src/plugins/platforms/android/androidjnimain.cpp (renamed from src/plugins/platforms/android/src/androidjnimain.cpp)380
-rw-r--r--src/plugins/platforms/android/androidjnimain.h (renamed from src/plugins/platforms/android/src/androidjnimain.h)22
-rw-r--r--src/plugins/platforms/android/androidjnimenu.cpp (renamed from src/plugins/platforms/android/src/androidjnimenu.cpp)3
-rw-r--r--src/plugins/platforms/android/androidjnimenu.h (renamed from src/plugins/platforms/android/src/androidjnimenu.h)0
-rw-r--r--src/plugins/platforms/android/androidplatformplugin.cpp (renamed from src/plugins/platforms/android/src/androidplatformplugin.cpp)0
-rw-r--r--src/plugins/platforms/android/androidsurfaceclient.h (renamed from src/plugins/platforms/android/src/opengl/qandroidopenglplatformscreen.h)24
-rw-r--r--src/plugins/platforms/android/opengl/opengl.pro32
-rw-r--r--src/plugins/platforms/android/qandroidassetsfileenginehandler.cpp (renamed from src/plugins/platforms/android/src/qandroidassetsfileenginehandler.cpp)0
-rw-r--r--src/plugins/platforms/android/qandroidassetsfileenginehandler.h (renamed from src/plugins/platforms/android/src/qandroidassetsfileenginehandler.h)0
-rw-r--r--src/plugins/platforms/android/qandroidinputcontext.cpp (renamed from src/plugins/platforms/android/src/qandroidinputcontext.cpp)0
-rw-r--r--src/plugins/platforms/android/qandroidinputcontext.h (renamed from src/plugins/platforms/android/src/qandroidinputcontext.h)0
-rw-r--r--src/plugins/platforms/android/qandroidplatformaccessibility.cpp (renamed from src/plugins/platforms/android/src/qandroidplatformaccessibility.cpp)0
-rw-r--r--src/plugins/platforms/android/qandroidplatformaccessibility.h (renamed from src/plugins/platforms/android/src/qandroidplatformaccessibility.h)0
-rw-r--r--src/plugins/platforms/android/qandroidplatformbackingstore.cpp78
-rw-r--r--src/plugins/platforms/android/qandroidplatformbackingstore.h (renamed from src/plugins/platforms/android/src/opengl/qandroidopenglplatformscreen.cpp)31
-rw-r--r--src/plugins/platforms/android/qandroidplatformclipboard.cpp (renamed from src/plugins/platforms/android/src/qandroidplatformclipboard.cpp)0
-rw-r--r--src/plugins/platforms/android/qandroidplatformclipboard.h (renamed from src/plugins/platforms/android/src/qandroidplatformclipboard.h)0
-rw-r--r--src/plugins/platforms/android/qandroidplatformdialoghelpers.cpp (renamed from src/plugins/platforms/android/src/qandroidplatformdialoghelpers.cpp)0
-rw-r--r--src/plugins/platforms/android/qandroidplatformdialoghelpers.h (renamed from src/plugins/platforms/android/src/qandroidplatformdialoghelpers.h)0
-rw-r--r--src/plugins/platforms/android/qandroidplatformfontdatabase.cpp (renamed from src/plugins/platforms/android/src/qandroidplatformfontdatabase.cpp)0
-rw-r--r--src/plugins/platforms/android/qandroidplatformfontdatabase.h (renamed from src/plugins/platforms/android/src/qandroidplatformfontdatabase.h)0
-rw-r--r--src/plugins/platforms/android/qandroidplatformintegration.cpp (renamed from src/plugins/platforms/android/src/qandroidplatformintegration.cpp)157
-rw-r--r--src/plugins/platforms/android/qandroidplatformintegration.h (renamed from src/plugins/platforms/android/src/qandroidplatformintegration.h)41
-rw-r--r--src/plugins/platforms/android/qandroidplatformmenu.cpp (renamed from src/plugins/platforms/android/src/qandroidplatformmenu.cpp)0
-rw-r--r--src/plugins/platforms/android/qandroidplatformmenu.h (renamed from src/plugins/platforms/android/src/qandroidplatformmenu.h)0
-rw-r--r--src/plugins/platforms/android/qandroidplatformmenubar.cpp (renamed from src/plugins/platforms/android/src/qandroidplatformmenubar.cpp)0
-rw-r--r--src/plugins/platforms/android/qandroidplatformmenubar.h (renamed from src/plugins/platforms/android/src/qandroidplatformmenubar.h)0
-rw-r--r--src/plugins/platforms/android/qandroidplatformmenuitem.cpp (renamed from src/plugins/platforms/android/src/qandroidplatformmenuitem.cpp)0
-rw-r--r--src/plugins/platforms/android/qandroidplatformmenuitem.h (renamed from src/plugins/platforms/android/src/qandroidplatformmenuitem.h)0
-rw-r--r--src/plugins/platforms/android/qandroidplatformopenglcontext.cpp (renamed from src/plugins/platforms/android/src/opengl/qandroidopenglcontext.cpp)49
-rw-r--r--src/plugins/platforms/android/qandroidplatformopenglcontext.h (renamed from src/plugins/platforms/android/src/opengl/qandroidopenglcontext.h)22
-rw-r--r--src/plugins/platforms/android/qandroidplatformopenglwindow.cpp160
-rw-r--r--src/plugins/platforms/android/qandroidplatformopenglwindow.h (renamed from src/plugins/platforms/android/src/opengl/qandroidopenglplatformwindow.h)64
-rw-r--r--src/plugins/platforms/android/qandroidplatformrasterwindow.cpp78
-rw-r--r--src/plugins/platforms/android/qandroidplatformrasterwindow.h70
-rw-r--r--src/plugins/platforms/android/qandroidplatformscreen.cpp352
-rw-r--r--src/plugins/platforms/android/qandroidplatformscreen.h (renamed from src/plugins/platforms/android/src/raster/qandroidplatformscreen.h)68
-rw-r--r--src/plugins/platforms/android/qandroidplatformservices.cpp (renamed from src/plugins/platforms/android/src/qandroidplatformservices.cpp)0
-rw-r--r--src/plugins/platforms/android/qandroidplatformservices.h (renamed from src/plugins/platforms/android/src/qandroidplatformservices.h)0
-rw-r--r--src/plugins/platforms/android/qandroidplatformtheme.cpp (renamed from src/plugins/platforms/android/src/qandroidplatformtheme.cpp)0
-rw-r--r--src/plugins/platforms/android/qandroidplatformtheme.h (renamed from src/plugins/platforms/android/src/qandroidplatformtheme.h)0
-rw-r--r--src/plugins/platforms/android/qandroidplatformwindow.cpp (renamed from src/plugins/platforms/android/src/raster/qandroidplatformwindow.cpp)111
-rw-r--r--src/plugins/platforms/android/qandroidplatformwindow.h (renamed from src/plugins/platforms/android/src/raster/qandroidplatformwindow.h)39
-rw-r--r--src/plugins/platforms/android/qandroidsystemlocale.cpp (renamed from src/plugins/platforms/android/src/qandroidsystemlocale.cpp)0
-rw-r--r--src/plugins/platforms/android/qandroidsystemlocale.h (renamed from src/plugins/platforms/android/src/qandroidsystemlocale.h)0
-rw-r--r--src/plugins/platforms/android/raster/raster.pro19
-rw-r--r--src/plugins/platforms/android/src/opengl/qandroidopenglplatformwindow.cpp178
-rw-r--r--src/plugins/platforms/android/src/opengl/qeglfshooks_android.cpp161
-rw-r--r--src/plugins/platforms/android/src/raster/qandroidplatformscreen.cpp94
-rw-r--r--src/plugins/platforms/android/src/raster/raster.pri7
-rw-r--r--src/plugins/platforms/android/src/src.pri55
67 files changed, 1383 insertions, 1297 deletions
diff --git a/src/android/jar/AndroidManifest.xml b/src/android/jar/AndroidManifest.xml
index ebc6fcfea7..cef88f7f19 100644
--- a/src/android/jar/AndroidManifest.xml
+++ b/src/android/jar/AndroidManifest.xml
@@ -1,4 +1,5 @@
<?xml version='1.0' encoding='utf-8'?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android" android:versionCode="1" android:versionName="1.0" package="org.qtproject.qt5.android">
<supports-screens android:largeScreens="true" android:normalScreens="true" android:anyDensity="true" android:smallScreens="true"/>
+ <uses-sdk android:minSdkVersion="9" />
</manifest>
diff --git a/src/android/jar/src/org/qtproject/qt5/android/QtActivityDelegate.java b/src/android/jar/src/org/qtproject/qt5/android/QtActivityDelegate.java
index d8c560933f..6c71bed7bc 100644
--- a/src/android/jar/src/org/qtproject/qt5/android/QtActivityDelegate.java
+++ b/src/android/jar/src/org/qtproject/qt5/android/QtActivityDelegate.java
@@ -1,7 +1,7 @@
/****************************************************************************
**
+** Copyright (C) 2014 BogDan Vatra <bogdan@kde.org>
** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies).
-** Copyright (C) 2012 BogDan Vatra <bogdan@kde.org>
** Contact: http://www.qt-project.org/legal
**
** This file is part of the Android port of the Qt Toolkit.
@@ -73,6 +73,7 @@ import java.io.FileWriter;
import java.io.IOException;
import java.lang.reflect.Method;
import java.util.ArrayList;
+import java.util.HashMap;
import java.util.Iterator;
public class QtActivityDelegate
@@ -105,7 +106,7 @@ public class QtActivityDelegate
private int m_lastChar = 0;
private boolean m_fullScreen = false;
private boolean m_started = false;
- private QtSurface m_surface = null;
+ private HashMap<Integer, QtSurface> m_surfaces = null;
private QtLayout m_layout = null;
private QtEditText m_editText = null;
private InputMethodManager m_imm = null;
@@ -116,21 +117,6 @@ public class QtActivityDelegate
public boolean m_backKeyPressedSent = false;
- public QtLayout getQtLayout()
- {
- return m_layout;
- }
-
- public QtSurface getQtSurface()
- {
- return m_surface;
- }
-
- public void redrawWindow(int left, int top, int right, int bottom)
- {
- m_surface.drawBitmap(new Rect(left, top, right, bottom));
- }
-
public void setFullScreen(boolean enterFullScreen)
{
if (m_fullScreen == enterFullScreen)
@@ -175,6 +161,7 @@ public class QtActivityDelegate
}
}
}
+ m_layout.requestLayout();
}
@@ -233,7 +220,8 @@ public class QtActivityDelegate
{
if (m_imm == null)
return;
- if (height > m_surface.getHeight()*2/3)
+
+ if (height > m_layout.getHeight() * 2 / 3)
m_activity.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_UNCHANGED | WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE);
else
m_activity.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_UNCHANGED | WindowManager.LayoutParams.SOFT_INPUT_ADJUST_PAN);
@@ -330,7 +318,7 @@ public class QtActivityDelegate
{
if (m_imm == null)
return;
- m_imm.hideSoftInputFromWindow(m_editText.getWindowToken(), 0, new ResultReceiver( new Handler()){
+ m_imm.hideSoftInputFromWindow(m_editText.getWindowToken(), 0, new ResultReceiver(new Handler()) {
@Override
protected void onReceiveResult(int resultCode, Bundle resultData) {
switch (resultCode) {
@@ -358,7 +346,7 @@ public class QtActivityDelegate
if (size < 36 || size > 512) { // check size sanity
DisplayMetrics metrics = new DisplayMetrics();
a.getWindowManager().getDefaultDisplay().getMetrics(metrics);
- size = metrics.densityDpi/10*3;
+ size = metrics.densityDpi / 10 * 3;
if (size < 36)
size = 36;
@@ -626,13 +614,13 @@ public class QtActivityDelegate
m_applicationParameters += "\t-qmljsdebugger=" + qmljsdebugger;
}
- if (null == m_surface)
+ if (null == m_surfaces)
onCreate(null);
String nativeLibraryDir = QtNativeLibrariesDir.nativeLibrariesDir(m_activity);
- m_surface.applicationStarted( QtNative.startApplication(m_applicationParameters,
- m_environmentVariables,
- m_mainLib,
- nativeLibraryDir));
+ QtNative.startApplication(m_applicationParameters,
+ m_environmentVariables,
+ m_mainLib,
+ nativeLibraryDir);
m_started = true;
return true;
} catch (Exception e) {
@@ -657,14 +645,12 @@ public class QtActivityDelegate
metrics.xdpi, metrics.ydpi, metrics.scaledDensity);
}
m_layout = new QtLayout(m_activity);
- m_surface = new QtSurface(m_activity, 0);
m_editText = new QtEditText(m_activity, this);
m_imm = (InputMethodManager)m_activity.getSystemService(Context.INPUT_METHOD_SERVICE);
- m_layout.addView(m_surface, 0);
+ m_surfaces = new HashMap<Integer, QtSurface>();
m_activity.setContentView(m_layout,
- new ViewGroup.LayoutParams(ViewGroup.LayoutParams.FILL_PARENT,
- ViewGroup.LayoutParams.FILL_PARENT));
- m_layout.bringChildToFront(m_surface);
+ new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,
+ ViewGroup.LayoutParams.MATCH_PARENT));
m_activity.registerForContextMenu(m_layout);
int orientation = m_activity.getResources().getConfiguration().orientation;
@@ -704,18 +690,6 @@ public class QtActivityDelegate
}
}
- public void onRestoreInstanceState(Bundle savedInstanceState)
- {
- try {
- m_super_onRestoreInstanceState.invoke(m_activity, savedInstanceState);
- } catch (Exception e) {
- e.printStackTrace();
- }
- m_started = savedInstanceState.getBoolean("Started");
- if (m_started)
- m_surface.applicationStarted(true);
- }
-
public void onPause()
{
QtNative.updateApplicationState(ApplicationInactive);
@@ -768,6 +742,19 @@ public class QtActivityDelegate
}
outState.putBoolean("FullScreen", m_fullScreen);
outState.putBoolean("Started", m_started);
+ // It should never
+ }
+
+ public void onRestoreInstanceState(Bundle savedInstanceState)
+ {
+ try {
+ m_super_onRestoreInstanceState.invoke(m_activity, savedInstanceState);
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ m_started = savedInstanceState.getBoolean("Started");
+ // FIXME restore all surfaces
+
}
public boolean onKeyDown(int keyCode, KeyEvent event)
@@ -967,4 +954,39 @@ public class QtActivityDelegate
}
}
}
+
+ public void createSurface(int id, boolean onTop, int x, int y, int w, int h) {
+ if (m_surfaces.containsKey(id))
+ m_layout.removeView(m_surfaces.remove(id));
+
+ QtSurface surface = new QtSurface(m_activity, id, onTop);
+ if (w < 0 || h < 0) {
+ surface.setLayoutParams( new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,
+ ViewGroup.LayoutParams.MATCH_PARENT));
+ } else {
+ surface.setLayoutParams( new QtLayout.LayoutParams(w, h, x, y));
+ }
+
+ m_layout.addView(surface);
+ if (onTop)
+ m_layout.bringChildToFront(surface);
+ m_surfaces.put(id, surface);
+ }
+
+ public void setSurfaceGeometry(int id, int x, int y, int w, int h) {
+ if (!m_surfaces.containsKey(id)) {
+ Log.e(QtNative.QtTAG, "Surface " + id +" not found!");
+ return;
+ }
+ QtSurface surface = m_surfaces.get(id);
+ surface.setLayoutParams(new QtLayout.LayoutParams(w, h, x, y));
+ m_layout.requestLayout();
+ }
+
+ public void destroySurface(int id) {
+ if (m_surfaces.containsKey(id))
+ m_layout.removeView(m_surfaces.remove(id));
+ else
+ Log.e(QtNative.QtTAG, "Surface " + id +" not found!");
+ }
}
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 043dab5ce8..058b10750f 100644
--- a/src/android/jar/src/org/qtproject/qt5/android/QtLayout.java
+++ b/src/android/jar/src/org/qtproject/qt5/android/QtLayout.java
@@ -42,8 +42,10 @@
package org.qtproject.qt5.android;
+import android.app.Activity;
import android.content.Context;
import android.util.AttributeSet;
+import android.util.DisplayMetrics;
import android.view.View;
import android.view.ViewGroup;
@@ -65,6 +67,15 @@ public class QtLayout extends ViewGroup
}
@Override
+ protected void onSizeChanged (int w, int h, int oldw, int oldh)
+ {
+ DisplayMetrics metrics = new DisplayMetrics();
+ ((Activity) getContext()).getWindowManager().getDefaultDisplay().getMetrics(metrics);
+ QtNative.setApplicationDisplayMetrics(metrics.widthPixels,
+ metrics.heightPixels, w, h, metrics.xdpi, metrics.ydpi, metrics.scaledDensity);
+ }
+
+ @Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec)
{
int count = getChildCount();
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 57f3642b56..2437752545 100644
--- a/src/android/jar/src/org/qtproject/qt5/android/QtNative.java
+++ b/src/android/jar/src/org/qtproject/qt5/android/QtNative.java
@@ -1,7 +1,7 @@
/****************************************************************************
**
+** Copyright (C) 2014 BogDan Vatra <bogdan@kde.org>
** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies).
-** Copyright (C) 2012 BogDan Vatra <bogdan@kde.org>
** Contact: http://www.qt-project.org/legal
**
** This file is part of the Android port of the Qt Toolkit.
@@ -250,29 +250,10 @@ public class QtNative
}
}
- public static void pauseApplication()
- {
- synchronized (m_mainActivityMutex) {
- if (m_started)
- pauseQtApp();
- }
- }
- public static void resumeApplication()
- {
- synchronized (m_mainActivityMutex) {
- if (m_started) {
- resumeQtApp();
- updateWindow();
- }
- }
- }
// application methods
public static native void startQtApplication(String params, String env);
- public static native void startQtApp(String params, String env);
- public static native void pauseQtApp();
- public static native void resumeQtApp();
public static native boolean startQtAndroidPlugin();
public static native void quitQtAndroidPlugin();
public static native void terminateQt();
@@ -283,16 +264,6 @@ public class QtNative
m_activity.finish();
}
- private static void redrawSurface(final int left, final int top, final int right, final int bottom )
- {
- runAction(new Runnable() {
- @Override
- public void run() {
- m_activityDelegate.redrawWindow(left, top, right, bottom);
- }
- });
- }
-
//@ANDROID-9
static private int getAction(int index, MotionEvent event)
{
@@ -539,6 +510,36 @@ public class QtNative
return certificateArray;
}
+ private static void createSurface(final int id, final boolean onTop, final int x, final int y, final int w, final int h)
+ {
+ runAction(new Runnable() {
+ @Override
+ public void run() {
+ m_activityDelegate.createSurface(id, onTop, x, y, w, h);
+ }
+ });
+ }
+
+ private static void setSurfaceGeometry(final int id, final int x, final int y, final int w, final int h)
+ {
+ runAction(new Runnable() {
+ @Override
+ public void run() {
+ m_activityDelegate.setSurfaceGeometry(id, x, y, w, h);
+ }
+ });
+ }
+
+ private static void destroySurface(final int id)
+ {
+ runAction(new Runnable() {
+ @Override
+ public void run() {
+ m_activityDelegate.destroySurface(id);
+ }
+ });
+ }
+
// screen methods
public static native void setDisplayMetrics(int screenWidthPixels,
int screenHeightPixels,
@@ -567,10 +568,7 @@ public class QtNative
// keyboard methods
// surface methods
- public static native void destroySurface();
- public static native void setSurface(Object surface);
- public static native void lockSurface();
- public static native void unlockSurface();
+ public static native void setSurface(int id, Object surface, int w, int h);
// surface methods
// window methods
diff --git a/src/android/jar/src/org/qtproject/qt5/android/QtSurface.java b/src/android/jar/src/org/qtproject/qt5/android/QtSurface.java
index c499dc3898..f9f5f16845 100644
--- a/src/android/jar/src/org/qtproject/qt5/android/QtSurface.java
+++ b/src/android/jar/src/org/qtproject/qt5/android/QtSurface.java
@@ -1,7 +1,7 @@
/****************************************************************************
**
+** Copyright (C) 2014 BogDan Vatra <bogdan@kde.org>
** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies).
-** Copyright (C) 2012 BogDan Vatra <bogdan@kde.org>
** Contact: http://www.qt-project.org/legal
**
** This file is part of the Android port of the Qt Toolkit.
@@ -44,11 +44,7 @@ package org.qtproject.qt5.android;
import android.app.Activity;
import android.content.Context;
-import android.graphics.Bitmap;
-import android.graphics.Canvas;
-import android.graphics.Rect;
import android.graphics.PixelFormat;
-import android.util.DisplayMetrics;
import android.util.Log;
import android.view.GestureDetector;
import android.view.MotionEvent;
@@ -60,61 +56,34 @@ import java.lang.reflect.Method;
public class QtSurface extends SurfaceView implements SurfaceHolder.Callback
{
- private Bitmap m_bitmap = null;
- private boolean m_started = false;
- private boolean m_usesGL = false;
private GestureDetector m_gestureDetector;
private Object m_accessibilityDelegate = null;
+ private boolean m_onTop;
- public QtSurface(Context context, int id)
+ public QtSurface(Context context, int id, boolean onTop)
{
super(context);
setFocusable(false);
setFocusableInTouchMode(false);
-
+ m_onTop = onTop;
+ setZOrderMediaOverlay(onTop);
getHolder().addCallback(this);
+ getHolder().setFormat(PixelFormat.RGBA_8888);
getHolder().setType(SurfaceHolder.SURFACE_TYPE_GPU);
setId(id);
m_gestureDetector =
new GestureDetector(context, new GestureDetector.SimpleOnGestureListener() {
public void onLongPress(MotionEvent event) {
- if (!m_started)
- return;
QtNative.longPress(getId(), (int) event.getX(), (int) event.getY());
}
});
m_gestureDetector.setIsLongpressEnabled(true);
}
- public void applicationStarted(boolean usesGL)
- {
- m_started = true;
- m_usesGL = usesGL;
- if (getWidth() < 1 || getHeight() < 1)
- return;
- if (m_usesGL) {
- QtNative.setSurface(getHolder().getSurface());
- } else {
- QtNative.lockSurface();
- QtNative.setSurface(null);
- m_bitmap = Bitmap.createBitmap(getWidth(), getHeight(), Bitmap.Config.RGB_565);
- QtNative.setSurface(m_bitmap);
- QtNative.unlockSurface();
- }
- }
-
@Override
public void surfaceCreated(SurfaceHolder holder)
{
- DisplayMetrics metrics = new DisplayMetrics();
- ((Activity) getContext()).getWindowManager().getDefaultDisplay().getMetrics(metrics);
- QtNative.setApplicationDisplayMetrics(metrics.widthPixels,
- metrics.heightPixels, getWidth(), getHeight(), metrics.xdpi, metrics.ydpi, metrics.scaledDensity);
-
- if (m_usesGL)
- holder.setFormat(PixelFormat.RGBA_8888);
-
-
+ QtNative.setSurface(getId(), holder.getSurface(), getWidth(), getHeight());
// Initialize Accessibility
// The accessibility code depends on android API level 16, so dynamically resolve it
if (android.os.Build.VERSION.SDK_INT >= 16) {
@@ -158,71 +127,21 @@ public class QtSurface extends SurfaceView implements SurfaceHolder.Callback
@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width, int height)
{
- if (width<1 || height<1)
- return;
-
- DisplayMetrics metrics = new DisplayMetrics();
- ((Activity) getContext()).getWindowManager().getDefaultDisplay().getMetrics(metrics);
- QtNative.setApplicationDisplayMetrics(metrics.widthPixels,
- metrics.heightPixels,
- width,
- height,
- metrics.xdpi,
- metrics.ydpi,
- metrics.scaledDensity);
-
- if (!m_started)
+ if (width < 1 || height < 1)
return;
- if (m_usesGL) {
- QtNative.setSurface(holder.getSurface());
- } else {
- QtNative.lockSurface();
- QtNative.setSurface(null);
- m_bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.RGB_565);
- QtNative.setSurface(m_bitmap);
- QtNative.unlockSurface();
- QtNative.updateWindow();
- }
+ QtNative.setSurface(getId(), holder.getSurface(), width, height);
}
@Override
public void surfaceDestroyed(SurfaceHolder holder)
{
- if (m_usesGL) {
- QtNative.destroySurface();
- } else {
- if (!m_started)
- return;
-
- QtNative.lockSurface();
- QtNative.setSurface(null);
- QtNative.unlockSurface();
- }
- }
-
- public void drawBitmap(Rect rect)
- {
- if (!m_started)
- return;
- QtNative.lockSurface();
- if (null != m_bitmap) {
- try {
- Canvas cv = getHolder().lockCanvas(rect);
- cv.drawBitmap(m_bitmap, rect, rect, null);
- getHolder().unlockCanvasAndPost(cv);
- } catch (Exception e) {
- Log.e(QtNative.QtTAG, "Can't create main activity", e);
- }
- }
- QtNative.unlockSurface();
+ QtNative.setSurface(getId(), null, 0, 0);
}
@Override
public boolean onTouchEvent(MotionEvent event)
{
- if (!m_started)
- return false;
QtNative.sendTouchEvent(event, getId());
m_gestureDetector.onTouchEvent(event);
return true;
@@ -231,8 +150,6 @@ public class QtSurface extends SurfaceView implements SurfaceHolder.Callback
@Override
public boolean onTrackballEvent(MotionEvent event)
{
- if (!m_started)
- return false;
QtNative.sendTrackballEvent(event, getId());
return true;
}
diff --git a/src/corelib/global/qlogging.cpp b/src/corelib/global/qlogging.cpp
index cc20891c76..076582373e 100644
--- a/src/corelib/global/qlogging.cpp
+++ b/src/corelib/global/qlogging.cpp
@@ -871,7 +871,7 @@ static void android_default_message_handler(QtMsgType type,
const QMessageLogContext &context,
const QString &message)
{
- android_LogPriority priority;
+ android_LogPriority priority = ANDROID_LOG_DEBUG;
switch (type) {
case QtDebugMsg: priority = ANDROID_LOG_DEBUG; break;
case QtWarningMsg: priority = ANDROID_LOG_WARN; break;
diff --git a/src/corelib/kernel/qjni_p.h b/src/corelib/kernel/qjni_p.h
index ab98aec1bf..b1f0011b94 100644
--- a/src/corelib/kernel/qjni_p.h
+++ b/src/corelib/kernel/qjni_p.h
@@ -178,11 +178,13 @@ public:
jobject jobj = static_cast<jobject>(o);
if (!isSameObject(jobj)) {
d = QSharedPointer<QJNIObjectData>(new QJNIObjectData());
- QJNIEnvironmentPrivate env;
- d->m_jobject = env->NewGlobalRef(jobj);
- jclass objectClass = env->GetObjectClass(jobj);
- d->m_jclass = static_cast<jclass>(env->NewGlobalRef(objectClass));
- env->DeleteLocalRef(objectClass);
+ if (jobj) {
+ QJNIEnvironmentPrivate env;
+ d->m_jobject = env->NewGlobalRef(jobj);
+ jclass objectClass = env->GetObjectClass(jobj);
+ d->m_jclass = static_cast<jclass>(env->NewGlobalRef(objectClass));
+ env->DeleteLocalRef(objectClass);
+ }
}
return *this;
diff --git a/src/opengl/opengl.pro b/src/opengl/opengl.pro
index b01ca80829..4d9208d983 100644
--- a/src/opengl/opengl.pro
+++ b/src/opengl/opengl.pro
@@ -8,9 +8,6 @@ irix-cc*:QMAKE_CXXFLAGS += -no_prelink -ptused
QMAKE_DOCS = $$PWD/doc/qtopengl.qdocconf
-ANDROID_LIB_DEPENDENCY_REPLACEMENTS = \
- "plugins/platforms/android/libqtforandroid.so:plugins/platforms/android/libqtforandroidGL.so"
-
load(qt_module)
contains(QT_CONFIG, opengl):CONFIG += opengl
diff --git a/src/plugins/platforms/android/src/android.json b/src/plugins/platforms/android/android.json
index 6843bd3301..6843bd3301 100644
--- a/src/plugins/platforms/android/src/android.json
+++ b/src/plugins/platforms/android/android.json
diff --git a/src/plugins/platforms/android/android.pro b/src/plugins/platforms/android/android.pro
index aa5ab4ddbd..4d873dd986 100644
--- a/src/plugins/platforms/android/android.pro
+++ b/src/plugins/platforms/android/android.pro
@@ -1,3 +1,80 @@
-TEMPLATE = subdirs
+TARGET = qtforandroid
-SUBDIRS += raster opengl
+PLUGIN_TYPE = platforms
+
+# STATICPLUGIN needed because there's a Q_IMPORT_PLUGIN in androidjnimain.cpp
+# Yes, the plugin imports itself statically
+DEFINES += QT_STATICPLUGIN
+
+load(qt_plugin)
+
+!contains(ANDROID_PLATFORM, android-9) {
+ INCLUDEPATH += $$NDK_ROOT/platforms/android-9/arch-$$ANDROID_ARCHITECTURE/usr/include
+ LIBS += -L$$NDK_ROOT/platforms/android-9/arch-$$ANDROID_ARCHITECTURE/usr/lib -ljnigraphics -landroid
+} else {
+ LIBS += -ljnigraphics -landroid
+}
+
+QT += core-private gui-private platformsupport-private
+
+CONFIG += qpa/genericunixfontdatabase
+
+OTHER_FILES += $$PWD/android.json
+
+INCLUDEPATH += $$PWD
+
+SOURCES += $$PWD/androidplatformplugin.cpp \
+ $$PWD/androidjnimain.cpp \
+ $$PWD/androidjniaccessibility.cpp \
+ $$PWD/androidjniinput.cpp \
+ $$PWD/androidjnimenu.cpp \
+ $$PWD/androidjniclipboard.cpp \
+ $$PWD/qandroidplatformintegration.cpp \
+ $$PWD/qandroidplatformservices.cpp \
+ $$PWD/qandroidassetsfileenginehandler.cpp \
+ $$PWD/qandroidinputcontext.cpp \
+ $$PWD/qandroidplatformaccessibility.cpp \
+ $$PWD/qandroidplatformfontdatabase.cpp \
+ $$PWD/qandroidplatformdialoghelpers.cpp \
+ $$PWD/qandroidplatformclipboard.cpp \
+ $$PWD/qandroidplatformtheme.cpp \
+ $$PWD/qandroidplatformmenubar.cpp \
+ $$PWD/qandroidplatformmenu.cpp \
+ $$PWD/qandroidplatformmenuitem.cpp \
+ $$PWD/qandroidsystemlocale.cpp \
+ $$PWD/qandroidplatformscreen.cpp \
+ $$PWD/qandroidplatformwindow.cpp \
+ $$PWD/qandroidplatformopenglwindow.cpp \
+ $$PWD/qandroidplatformrasterwindow.cpp \
+ $$PWD/qandroidplatformbackingstore.cpp \
+ $$PWD/qandroidplatformopenglcontext.cpp
+
+HEADERS += $$PWD/qandroidplatformintegration.h \
+ $$PWD/androidjnimain.h \
+ $$PWD/androidjniaccessibility.h \
+ $$PWD/androidjniinput.h \
+ $$PWD/androidjnimenu.h \
+ $$PWD/androidjniclipboard.h \
+ $$PWD/qandroidplatformservices.h \
+ $$PWD/qandroidassetsfileenginehandler.h \
+ $$PWD/qandroidinputcontext.h \
+ $$PWD/qandroidplatformaccessibility.h \
+ $$PWD/qandroidplatformfontdatabase.h \
+ $$PWD/qandroidplatformclipboard.h \
+ $$PWD/qandroidplatformdialoghelpers.h \
+ $$PWD/qandroidplatformtheme.h \
+ $$PWD/qandroidplatformmenubar.h \
+ $$PWD/qandroidplatformmenu.h \
+ $$PWD/qandroidplatformmenuitem.h \
+ $$PWD/qandroidsystemlocale.h \
+ $$PWD/androidsurfaceclient.h \
+ $$PWD/qandroidplatformscreen.h \
+ $$PWD/qandroidplatformwindow.h \
+ $$PWD/qandroidplatformopenglwindow.h \
+ $$PWD/qandroidplatformrasterwindow.h \
+ $$PWD/qandroidplatformbackingstore.h \
+ $$PWD/qandroidplatformopenglcontext.h
+
+#Non-standard install directory, QTBUG-29859
+DESTDIR = $$DESTDIR/android
+target.path = $${target.path}/android
diff --git a/src/plugins/platforms/android/src/androidjniaccessibility.cpp b/src/plugins/platforms/android/androidjniaccessibility.cpp
index b987c49c9c..b987c49c9c 100644
--- a/src/plugins/platforms/android/src/androidjniaccessibility.cpp
+++ b/src/plugins/platforms/android/androidjniaccessibility.cpp
diff --git a/src/plugins/platforms/android/src/androidjniaccessibility.h b/src/plugins/platforms/android/androidjniaccessibility.h
index e708138c33..e708138c33 100644
--- a/src/plugins/platforms/android/src/androidjniaccessibility.h
+++ b/src/plugins/platforms/android/androidjniaccessibility.h
diff --git a/src/plugins/platforms/android/src/androidjniclipboard.cpp b/src/plugins/platforms/android/androidjniclipboard.cpp
index 05270ac374..05270ac374 100644
--- a/src/plugins/platforms/android/src/androidjniclipboard.cpp
+++ b/src/plugins/platforms/android/androidjniclipboard.cpp
diff --git a/src/plugins/platforms/android/src/androidjniclipboard.h b/src/plugins/platforms/android/androidjniclipboard.h
index 15cd93202e..15cd93202e 100644
--- a/src/plugins/platforms/android/src/androidjniclipboard.h
+++ b/src/plugins/platforms/android/androidjniclipboard.h
diff --git a/src/plugins/platforms/android/src/androidjniinput.cpp b/src/plugins/platforms/android/androidjniinput.cpp
index 55d44b7377..55d44b7377 100644
--- a/src/plugins/platforms/android/src/androidjniinput.cpp
+++ b/src/plugins/platforms/android/androidjniinput.cpp
diff --git a/src/plugins/platforms/android/src/androidjniinput.h b/src/plugins/platforms/android/androidjniinput.h
index a78c7519db..a78c7519db 100644
--- a/src/plugins/platforms/android/src/androidjniinput.h
+++ b/src/plugins/platforms/android/androidjniinput.h
diff --git a/src/plugins/platforms/android/src/androidjnimain.cpp b/src/plugins/platforms/android/androidjnimain.cpp
index 3064e5d4e2..ee62c002d8 100644
--- a/src/plugins/platforms/android/src/androidjnimain.cpp
+++ b/src/plugins/platforms/android/androidjnimain.cpp
@@ -1,7 +1,7 @@
/****************************************************************************
**
+** Copyright (C) 2014 BogDan Vatra <bogdan@kde.org>
** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies).
-** Copyright (C) 2012 BogDan Vatra <bogdan@kde.org>
** Contact: http://www.qt-project.org/legal
**
** This file is part of the plugins of the Qt Toolkit.
@@ -53,6 +53,7 @@
#include <qdebug.h>
#include <qglobal.h>
#include <qobjectdefs.h>
+#include <QtCore/private/qjni_p.h>
#include <stdlib.h>
#include "androidjnimain.h"
@@ -73,14 +74,6 @@
#include <qpa/qwindowsysteminterface.h>
-#ifdef ANDROID_PLUGIN_OPENGL
-# include "qandroidopenglplatformwindow.h"
-#endif
-
-#include <android/native_window_jni.h>
-
-static jmethodID m_redrawSurfaceMethodID = 0;
-
Q_IMPORT_PLUGIN(QAndroidPlatformIntegrationPlugin)
static JavaVM *m_javaVM = NULL;
@@ -90,6 +83,9 @@ static jmethodID m_loadClassMethodID = NULL;
static AAssetManager *m_assetManager = NULL;
static jobject m_resourcesObj;
static jobject m_activityObject = NULL;
+static jmethodID m_createSurfaceMethodID = 0;
+static jmethodID m_setSurfaceGeometryMethodID = 0;
+static jmethodID m_destroySurfaceMethodID = 0;
static bool m_activityActive = true; // defaults to true because when the platform plugin is
// initialized, QtActivity::onResume() has already been called
@@ -110,17 +106,19 @@ static Main m_main = NULL;
static void *m_mainLibraryHnd = NULL;
static QList<QByteArray> m_applicationParams;
-#ifndef ANDROID_PLUGIN_OPENGL
-static jobject m_surface = NULL;
-#else
-static EGLNativeWindowType m_nativeWindow = 0;
-static QSemaphore m_waitForWindowSemaphore;
-static bool m_waitForWindow = false;
-#endif
+struct SurfaceData
+{
+ ~SurfaceData() { delete surface; }
+ QJNIObjectPrivate *surface = 0;
+ AndroidSurfaceClient *client = 0;
+};
+
+QHash<int, AndroidSurfaceClient *> m_surfaces;
+static QMutex m_surfacesMutex;
+static int m_surfaceId = 1;
static QSemaphore m_quitAppSemaphore;
-static QMutex m_surfaceMutex(QMutex::Recursive);
static QSemaphore m_pauseApplicationSemaphore;
static QMutex m_pauseApplicationMutex;
@@ -140,128 +138,18 @@ static const char m_qtTag[] = "Qt";
static const char m_classErrorMsg[] = "Can't find class \"%s\"";
static const char m_methodErrorMsg[] = "Can't find method \"%s%s\"";
-static inline void checkPauseApplication()
-{
- m_pauseApplicationMutex.lock();
- if (m_pauseApplication) {
- m_pauseApplicationMutex.unlock();
- m_pauseApplicationSemaphore.acquire(); // wait until surface is created
-
- m_pauseApplicationMutex.lock();
- m_pauseApplication = false;
- m_pauseApplicationMutex.unlock();
-
- //FIXME
-// QWindowSystemInterface::handleScreenAvailableGeometryChange(0);
-// QWindowSystemInterface::handleScreenGeometryChange(0);
- } else {
- m_pauseApplicationMutex.unlock();
- }
-}
-
namespace QtAndroid
{
-#ifndef ANDROID_PLUGIN_OPENGL
- void flushImage(const QPoint &pos, const QImage &image, const QRect &destinationRect)
- {
- checkPauseApplication();
- QMutexLocker locker(&m_surfaceMutex);
- if (!m_surface)
- return;
- AttachedJNIEnv env;
- if (!env.jniEnv)
- return;
-
- int bpp = 2;
- AndroidBitmapInfo info;
- int ret;
-
- if ((ret = AndroidBitmap_getInfo(env.jniEnv, m_surface, &info)) < 0) {
- qWarning() << "AndroidBitmap_getInfo() failed ! error=" << ret;
- m_javaVM->DetachCurrentThread();
- return;
- }
-
- if (info.format != ANDROID_BITMAP_FORMAT_RGB_565) {
- qWarning() << "Bitmap format is not RGB_565!";
- m_javaVM->DetachCurrentThread();
- return;
- }
-
- void *pixels;
- unsigned char *screenBits;
- if ((ret = AndroidBitmap_lockPixels(env.jniEnv, m_surface, &pixels)) < 0) {
- qWarning() << "AndroidBitmap_lockPixels() failed! error=" << ret;
- m_javaVM->DetachCurrentThread();
- return;
- }
-
- screenBits = static_cast<unsigned char *>(pixels);
- int sbpl = info.stride;
- int swidth = info.width;
- int sheight = info.height;
-
- unsigned sposx = pos.x() + destinationRect.x();
- unsigned sposy = pos.y() + destinationRect.y();
-
- screenBits += sposy * sbpl;
-
- unsigned ibpl = image.bytesPerLine();
- unsigned iposx = destinationRect.x();
- unsigned iposy = destinationRect.y();
-
- const unsigned char *imageBits = static_cast<const unsigned char *>(image.bits());
- imageBits += iposy * ibpl;
-
- unsigned width = swidth - sposx < unsigned(destinationRect.width())
- ? (swidth-sposx)
- : destinationRect.width();
- unsigned height = sheight - sposy < unsigned(destinationRect.height())
- ? (sheight - sposy)
- : destinationRect.height();
-
- for (unsigned y = 0; y < height; y++) {
- memcpy(screenBits + y*sbpl + sposx*bpp,
- imageBits + y*ibpl + iposx*bpp,
- width*bpp);
- }
- AndroidBitmap_unlockPixels(env.jniEnv, m_surface);
-
- env.jniEnv->CallStaticVoidMethod(m_applicationClass,
- m_redrawSurfaceMethodID,
- jint(destinationRect.left()),
- jint(destinationRect.top()),
- jint(destinationRect.right() + 1),
- jint(destinationRect.bottom() + 1));
-#warning FIXME dirty hack, figure out why it needs to add 1 to right and bottom !!!!
- }
-
-#else // for #ifndef ANDROID_PLUGIN_OPENGL
- EGLNativeWindowType nativeWindow(bool waitForWindow)
- {
- m_surfaceMutex.lock();
- if (!m_nativeWindow && waitForWindow) {
- m_waitForWindow = true;
- m_surfaceMutex.unlock();
- m_waitForWindowSemaphore.acquire();
- m_waitForWindow = false;
- return m_nativeWindow;
- }
- m_surfaceMutex.unlock();
- return m_nativeWindow;
- }
-#endif
-
void setAndroidPlatformIntegration(QAndroidPlatformIntegration *androidPlatformIntegration)
{
- m_surfaceMutex.lock();
+ m_surfacesMutex.lock();
m_androidPlatformIntegration = androidPlatformIntegration;
- m_surfaceMutex.unlock();
+ m_surfacesMutex.unlock();
}
QAndroidPlatformIntegration *androidPlatformIntegration()
{
- QMutexLocker locker(&m_surfaceMutex);
+ QMutexLocker locker(&m_surfacesMutex);
return m_androidPlatformIntegration;
}
@@ -353,14 +241,14 @@ namespace QtAndroid
jobject createBitmap(QImage img, JNIEnv *env)
{
- if (img.format() != QImage::Format_ARGB32 && img.format() != QImage::Format_RGB16)
- img = img.convertToFormat(QImage::Format_ARGB32);
+ if (img.format() != QImage::Format_RGBA8888 && img.format() != QImage::Format_RGB16)
+ img = img.convertToFormat(QImage::Format_RGBA8888);
jobject bitmap = env->CallStaticObjectMethod(m_bitmapClass,
m_createBitmapMethodID,
img.width(),
img.height(),
- img.format() == QImage::Format_ARGB32
+ img.format() == QImage::Format_RGBA8888
? m_ARGB_8888_BitmapConfigValue
: m_RGB_565_BitmapConfigValue);
if (!bitmap)
@@ -393,6 +281,21 @@ namespace QtAndroid
return bitmap;
}
+ jobject createBitmap(int width, int height, QImage::Format format, JNIEnv *env)
+ {
+ if (format != QImage::Format_RGBA8888
+ && format != QImage::Format_RGB16)
+ return 0;
+
+ return env->CallStaticObjectMethod(m_bitmapClass,
+ m_createBitmapMethodID,
+ width,
+ height,
+ format == QImage::Format_RGB16
+ ? m_RGB_565_BitmapConfigValue
+ : m_ARGB_8888_BitmapConfigValue);
+ }
+
jobject createBitmapDrawable(jobject bitmap, JNIEnv *env)
{
if (!bitmap)
@@ -418,25 +321,74 @@ namespace QtAndroid
{
return m_qtTag;
}
+
+ int createSurface(AndroidSurfaceClient *client, const QRect &geometry, bool onTop)
+ {
+ QJNIEnvironmentPrivate env;
+ if (!env)
+ return 0;
+
+ m_surfacesMutex.lock();
+ int surfaceId = m_surfaceId++;
+ m_surfaces[surfaceId] = client;
+ m_surfacesMutex.unlock();
+
+ jint x = 0, y = 0, w = -1, h = -1;
+ if (!geometry.isNull()) {
+ x = geometry.x();
+ y = geometry.y();
+ w = std::max(geometry.width(), 1);
+ h = std::max(geometry.height(), 1);
+ }
+ env->CallStaticVoidMethod(m_applicationClass,
+ m_createSurfaceMethodID,
+ surfaceId,
+ jboolean(onTop),
+ x, y, w, h);
+ return surfaceId;
+ }
+
+ void setSurfaceGeometry(int surfaceId, const QRect &geometry)
+ {
+ QJNIEnvironmentPrivate env;
+ if (!env)
+ return;
+ jint x = 0, y = 0, w = -1, h = -1;
+ if (!geometry.isNull()) {
+ x = geometry.x();
+ y = geometry.y();
+ w = geometry.width();
+ h = geometry.height();
+ }
+ env->CallStaticVoidMethod(m_applicationClass,
+ m_setSurfaceGeometryMethodID,
+ surfaceId,
+ x, y, w, h);
+ }
+
+ void destroySurface(int surfaceId)
+ {
+ QMutexLocker lock(&m_surfacesMutex);
+ const auto &it = m_surfaces.find(surfaceId);
+ if (it == m_surfaces.end())
+ return;
+
+ m_surfaces.remove(surfaceId);
+ QJNIEnvironmentPrivate env;
+ if (!env)
+ return;
+
+ env->CallStaticVoidMethod(m_applicationClass,
+ m_destroySurfaceMethodID,
+ surfaceId);
+ }
}
static jboolean startQtAndroidPlugin(JNIEnv* /*env*/, jobject /*object*//*, jobject applicationAssetManager*/)
{
-#ifndef ANDROID_PLUGIN_OPENGL
- m_surface = 0;
-#else
- m_nativeWindow = 0;
- m_waitForWindow = false;
-#endif
-
m_androidPlatformIntegration = 0;
m_androidAssetsFileEngineHandler = new AndroidAssetsFileEngineHandler();
-
-#ifdef ANDROID_PLUGIN_OPENGL
return true;
-#else
- return false;
-#endif
}
static void *startMainMethod(void */*data*/)
@@ -512,54 +464,16 @@ static jboolean startQtApplication(JNIEnv *env, jobject /*object*/, jstring para
return pthread_create(&appThread, NULL, startMainMethod, NULL) == 0;
}
-static void pauseQtApp(JNIEnv */*env*/, jobject /*thiz*/)
-{
- m_surfaceMutex.lock();
- m_pauseApplicationMutex.lock();
-
- if (m_androidPlatformIntegration)
- m_androidPlatformIntegration->pauseApp();
- m_pauseApplication = true;
-
- m_pauseApplicationMutex.unlock();
- m_surfaceMutex.unlock();
-}
-
-static void resumeQtApp(JNIEnv */*env*/, jobject /*thiz*/)
-{
- m_surfaceMutex.lock();
- m_pauseApplicationMutex.lock();
- if (m_androidPlatformIntegration)
- m_androidPlatformIntegration->resumeApp();
-
- if (m_pauseApplication)
- m_pauseApplicationSemaphore.release();
-
- m_pauseApplicationMutex.unlock();
- m_surfaceMutex.unlock();
-}
static void quitQtAndroidPlugin(JNIEnv *env, jclass /*clazz*/)
{
-#ifndef ANDROID_PLUGIN_OPENGL
- if (m_surface) {
- env->DeleteGlobalRef(m_surface);
- m_surface = 0;
- }
-#else
Q_UNUSED(env);
-#endif
-
m_androidPlatformIntegration = 0;
delete m_androidAssetsFileEngineHandler;
}
static void terminateQt(JNIEnv *env, jclass /*clazz*/)
{
-#ifndef ANDROID_PLUGIN_OPENGL
- if (m_surface)
- env->DeleteGlobalRef(m_surface);
-#endif
env->DeleteGlobalRef(m_applicationClass);
env->DeleteGlobalRef(m_classLoaderObject);
env->DeleteGlobalRef(m_resourcesObj);
@@ -568,76 +482,19 @@ static void terminateQt(JNIEnv *env, jclass /*clazz*/)
env->DeleteGlobalRef(m_ARGB_8888_BitmapConfigValue);
env->DeleteGlobalRef(m_RGB_565_BitmapConfigValue);
env->DeleteGlobalRef(m_bitmapDrawableClass);
+ m_androidPlatformIntegration = 0;
+ delete m_androidAssetsFileEngineHandler;
}
-static void setSurface(JNIEnv *env, jobject /*thiz*/, jobject jSurface)
-{
-#ifndef ANDROID_PLUGIN_OPENGL
- if (m_surface)
- env->DeleteGlobalRef(m_surface);
- m_surface = env->NewGlobalRef(jSurface);
-#else
- m_surfaceMutex.lock();
- EGLNativeWindowType nativeWindow = ANativeWindow_fromSurface(env, jSurface);
- bool sameNativeWindow = (nativeWindow != 0 && nativeWindow == m_nativeWindow);
-
- m_nativeWindow = nativeWindow;
- if (m_waitForWindow)
- m_waitForWindowSemaphore.release();
-
- if (m_androidPlatformIntegration) {
- // Use the desktop size.
- // On some devices, the getters for the native window size gives wrong values
- QSize size = QAndroidPlatformIntegration::defaultDesktopSize();
-
- QPlatformScreen *screen = m_androidPlatformIntegration->screen();
- QRect geometry(QPoint(0, 0), size);
- if (screen) {
- QWindowSystemInterface::handleScreenAvailableGeometryChange(screen->screen(), geometry);
- QWindowSystemInterface::handleScreenGeometryChange(screen->screen(), geometry);
- }
-
- if (!sameNativeWindow) {
- m_surfaceMutex.unlock();
- m_androidPlatformIntegration->surfaceChanged();
- } else {
- // Resize all top level windows, since they share the same surface
- foreach (QWindow *w, QGuiApplication::topLevelWindows()) {
- QAndroidOpenGLPlatformWindow *window =
- static_cast<QAndroidOpenGLPlatformWindow *>(w->handle());
-
- if (window != 0) {
- window->lock();
- window->scheduleResize(size);
-
- QWindowSystemInterface::handleExposeEvent(window->window(),
- QRegion(window->window()->geometry()));
- window->unlock();
- }
- }
-
- m_surfaceMutex.unlock();
- }
-
- } else {
- m_surfaceMutex.unlock();
- }
-#endif // for #ifndef ANDROID_PLUGIN_OPENGL
-}
-
-static void destroySurface(JNIEnv *env, jobject /*thiz*/)
+static void setSurface(JNIEnv *env, jobject /*thiz*/, jint id, jobject jSurface, jint w, jint h)
{
-#ifndef ANDROID_PLUGIN_OPENGL
- if (m_surface) {
- env->DeleteGlobalRef(m_surface);
- m_surface = 0;
+ QMutexLocker lock(&m_surfacesMutex);
+ const auto &it = m_surfaces.find(id);
+ if (it == m_surfaces.end()) {
+ qWarning()<<"Can't find surface" << id;
+ return;
}
-#else
- Q_UNUSED(env);
- m_nativeWindow = 0;
- if (m_androidPlatformIntegration != 0)
- m_androidPlatformIntegration->invalidateNativeSurface();
-#endif
+ it.value()->surfaceChanged(env, jSurface, w, h);
}
static void setDisplayMetrics(JNIEnv */*env*/, jclass /*clazz*/,
@@ -660,16 +517,6 @@ static void setDisplayMetrics(JNIEnv */*env*/, jclass /*clazz*/,
}
}
-static void lockSurface(JNIEnv */*env*/, jobject /*thiz*/)
-{
- m_surfaceMutex.lock();
-}
-
-static void unlockSurface(JNIEnv */*env*/, jobject /*thiz*/)
-{
- m_surfaceMutex.unlock();
-}
-
static void updateWindow(JNIEnv */*env*/, jobject /*thiz*/)
{
if (!m_androidPlatformIntegration)
@@ -680,12 +527,8 @@ static void updateWindow(JNIEnv */*env*/, jobject /*thiz*/)
QWindowSystemInterface::handleExposeEvent(w, QRegion(w->geometry()));
}
-#ifndef ANDROID_PLUGIN_OPENGL
QAndroidPlatformScreen *screen = static_cast<QAndroidPlatformScreen *>(m_androidPlatformIntegration->screen());
QMetaObject::invokeMethod(screen, "setDirty", Qt::QueuedConnection, Q_ARG(QRect,screen->geometry()));
-#else
- qWarning("updateWindow: Dirty screen not implemented yet on OpenGL");
-#endif
}
static void updateApplicationState(JNIEnv */*env*/, jobject /*thiz*/, jint state)
@@ -734,15 +577,10 @@ static void handleOrientationChanged(JNIEnv */*env*/, jobject /*thiz*/, jint new
static JNINativeMethod methods[] = {
{"startQtAndroidPlugin", "()Z", (void *)startQtAndroidPlugin},
{"startQtApplication", "(Ljava/lang/String;Ljava/lang/String;)V", (void *)startQtApplication},
- {"pauseQtApp", "()V", (void *)pauseQtApp},
- {"resumeQtApp", "()V", (void *)resumeQtApp},
{"quitQtAndroidPlugin", "()V", (void *)quitQtAndroidPlugin},
{"terminateQt", "()V", (void *)terminateQt},
{"setDisplayMetrics", "(IIIIDDD)V", (void *)setDisplayMetrics},
- {"setSurface", "(Ljava/lang/Object;)V", (void *)setSurface},
- {"destroySurface", "()V", (void *)destroySurface},
- {"lockSurface", "()V", (void *)lockSurface},
- {"unlockSurface", "()V", (void *)unlockSurface},
+ {"setSurface", "(ILjava/lang/Object;II)V", (void *)setSurface},
{"updateWindow", "()V", (void *)updateWindow},
{"updateApplicationState", "(I)V", (void *)updateApplicationState},
{"handleOrientationChanged", "(II)V", (void *)handleOrientationChanged}
@@ -795,7 +633,9 @@ static int registerNatives(JNIEnv *env)
return JNI_FALSE;
}
- GET_AND_CHECK_STATIC_METHOD(m_redrawSurfaceMethodID, m_applicationClass, "redrawSurface", "(IIII)V");
+ GET_AND_CHECK_STATIC_METHOD(m_createSurfaceMethodID, m_applicationClass, "createSurface", "(IZIIII)V");
+ GET_AND_CHECK_STATIC_METHOD(m_setSurfaceGeometryMethodID, m_applicationClass, "setSurfaceGeometry", "(IIIII)V");
+ GET_AND_CHECK_STATIC_METHOD(m_destroySurfaceMethodID, m_applicationClass, "destroySurface", "(I)V");
jmethodID methodID;
GET_AND_CHECK_STATIC_METHOD(methodID, m_applicationClass, "activity", "()Landroid/app/Activity;");
diff --git a/src/plugins/platforms/android/src/androidjnimain.h b/src/plugins/platforms/android/androidjnimain.h
index 11d3573404..24287df474 100644
--- a/src/plugins/platforms/android/src/androidjnimain.h
+++ b/src/plugins/platforms/android/androidjnimain.h
@@ -1,7 +1,7 @@
/****************************************************************************
**
+** Copyright (C) 2014 BogDan Vatra <bogdan@kde.org>
** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies).
-** Copyright (C) 2012 BogDan Vatra <bogdan@kde.org>
** Contact: http://www.qt-project.org/legal
**
** This file is part of the plugins of the Qt Toolkit.
@@ -45,16 +45,11 @@
#include <android/log.h>
-#ifdef ANDROID_PLUGIN_OPENGL
-# include <EGL/eglplatform.h>
-#endif
-
-#include <QtCore/qsize.h>
-
#include <jni.h>
#include <android/asset_manager.h>
-class QImage;
+#include <QImage>
+
class QRect;
class QPoint;
class QThread;
@@ -62,6 +57,7 @@ class QAndroidPlatformIntegration;
class QWidget;
class QString;
class QWindow;
+class AndroidSurfaceClient;
namespace QtAndroid
{
@@ -69,11 +65,10 @@ namespace QtAndroid
void setAndroidPlatformIntegration(QAndroidPlatformIntegration *androidPlatformIntegration);
void setQtThread(QThread *thread);
-#ifndef ANDROID_PLUGIN_OPENGL
- void flushImage(const QPoint &pos, const QImage &image, const QRect &rect);
-#else
- EGLNativeWindowType nativeWindow(bool waitToCreate = true);
-#endif
+
+ int createSurface(AndroidSurfaceClient * client, const QRect &geometry, bool onTop);
+ void setSurfaceGeometry(int surfaceId, const QRect &geometry);
+ void destroySurface(int surfaceId);
QWindow *topLevelWindowAt(const QPoint &globalPos);
int desktopWidthPixels();
@@ -91,6 +86,7 @@ namespace QtAndroid
void hideStatusBar();
jobject createBitmap(QImage img, JNIEnv *env = 0);
+ jobject createBitmap(int width, int height, QImage::Format format, JNIEnv *env);
jobject createBitmapDrawable(jobject bitmap, JNIEnv *env = 0);
struct AttachedJNIEnv
diff --git a/src/plugins/platforms/android/src/androidjnimenu.cpp b/src/plugins/platforms/android/androidjnimenu.cpp
index dbdd7c9b8e..db9249e7fe 100644
--- a/src/plugins/platforms/android/src/androidjnimenu.cpp
+++ b/src/plugins/platforms/android/androidjnimenu.cpp
@@ -143,6 +143,9 @@ namespace QtAndroidMenu
void setActiveTopLevelWindow(QWindow *window)
{
Qt::WindowFlags flags = window ? window->flags() : Qt::WindowFlags();
+ if (!window)
+ return;
+
bool isNonRegularWindow = flags & (Qt::Desktop | Qt::Popup | Qt::Dialog | Qt::Sheet) & ~Qt::Window;
if (isNonRegularWindow)
return;
diff --git a/src/plugins/platforms/android/src/androidjnimenu.h b/src/plugins/platforms/android/androidjnimenu.h
index 7c5422f67b..7c5422f67b 100644
--- a/src/plugins/platforms/android/src/androidjnimenu.h
+++ b/src/plugins/platforms/android/androidjnimenu.h
diff --git a/src/plugins/platforms/android/src/androidplatformplugin.cpp b/src/plugins/platforms/android/androidplatformplugin.cpp
index 2cf5aa1e01..2cf5aa1e01 100644
--- a/src/plugins/platforms/android/src/androidplatformplugin.cpp
+++ b/src/plugins/platforms/android/androidplatformplugin.cpp
diff --git a/src/plugins/platforms/android/src/opengl/qandroidopenglplatformscreen.h b/src/plugins/platforms/android/androidsurfaceclient.h
index e9251592aa..254e47123b 100644
--- a/src/plugins/platforms/android/src/opengl/qandroidopenglplatformscreen.h
+++ b/src/plugins/platforms/android/androidsurfaceclient.h
@@ -1,6 +1,6 @@
/****************************************************************************
**
-** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies).
+** Copyright (C) 2014 BogDan Vatra <bogdan@kde.org>
** Contact: http://www.qt-project.org/legal
**
** This file is part of the plugins of the Qt Toolkit.
@@ -39,22 +39,20 @@
**
****************************************************************************/
-#ifndef QANDROIDOPENGLPLATFORMSCREEN_H
-#define QANDROIDOPENGLPLATFORMSCREEN_H
+#ifndef ANDROIDSURFACECLIENT_H
+#define ANDROIDSURFACECLIENT_H
+#include <QMutex>
+#include <jni.h>
-#include "qeglfsscreen.h"
-
-QT_BEGIN_NAMESPACE
-
-class QAndroidOpenGLPlatformScreen : public QEglFSScreen
+class AndroidSurfaceClient
{
public:
- QAndroidOpenGLPlatformScreen(EGLDisplay display);
+ virtual void surfaceChanged(JNIEnv *jniEnv, jobject surface, int w, int h) = 0;
+ void lockSurface() { m_surfaceMutex.lock(); }
+ void unlockSurface() { m_surfaceMutex.unlock(); }
protected:
- void topWindowChanged(QPlatformWindow *window);
+ QMutex m_surfaceMutex;
};
-QT_END_NAMESPACE
-
-#endif // QANDROIDOPENGLPLATFORMSCREEN_H
+#endif // ANDROIDSURFACECLIENT_H
diff --git a/src/plugins/platforms/android/opengl/opengl.pro b/src/plugins/platforms/android/opengl/opengl.pro
deleted file mode 100644
index ea050ca3a0..0000000000
--- a/src/plugins/platforms/android/opengl/opengl.pro
+++ /dev/null
@@ -1,32 +0,0 @@
-TARGET = qtforandroidGL
-
-PLUGIN_TYPE = platforms
-load(qt_plugin)
-
-# STATICPLUGIN needed because there's a Q_IMPORT_PLUGIN in androidjnimain.cpp
-# Yes, the plugin imports itself statically
-DEFINES += QT_STATICPLUGIN ANDROID_PLUGIN_OPENGL
-
-!equals(ANDROID_PLATFORM, android-9) {
- INCLUDEPATH += $$NDK_ROOT/platforms/android-9/arch-$$ANDROID_ARCHITECTURE/usr/include
- LIBS += -L$$NDK_ROOT/platforms/android-9/arch-$$ANDROID_ARCHITECTURE/usr/lib -ljnigraphics -landroid
-} else {
- LIBS += -ljnigraphics -landroid
-}
-
-EGLFS_PLATFORM_HOOKS_SOURCES = $$PWD/../src/opengl/qeglfshooks_android.cpp
-
-INCLUDEPATH += $$PWD/../src/opengl/
-
-HEADERS += \
- $$PWD/../src/opengl/qandroidopenglcontext.h \
- $$PWD/../src/opengl/qandroidopenglplatformwindow.h \
- $$PWD/../src/opengl/qandroidopenglplatformscreen.h
-
-SOURCES += \
- $$PWD/../src/opengl/qandroidopenglcontext.cpp \
- $$PWD/../src/opengl/qandroidopenglplatformwindow.cpp \
- $$PWD/../src/opengl/qandroidopenglplatformscreen.cpp
-
-include($$PWD/../../eglfs/eglfs.pri)
-include($$PWD/../src/src.pri)
diff --git a/src/plugins/platforms/android/src/qandroidassetsfileenginehandler.cpp b/src/plugins/platforms/android/qandroidassetsfileenginehandler.cpp
index 95844fc649..95844fc649 100644
--- a/src/plugins/platforms/android/src/qandroidassetsfileenginehandler.cpp
+++ b/src/plugins/platforms/android/qandroidassetsfileenginehandler.cpp
diff --git a/src/plugins/platforms/android/src/qandroidassetsfileenginehandler.h b/src/plugins/platforms/android/qandroidassetsfileenginehandler.h
index 7bd560886c..7bd560886c 100644
--- a/src/plugins/platforms/android/src/qandroidassetsfileenginehandler.h
+++ b/src/plugins/platforms/android/qandroidassetsfileenginehandler.h
diff --git a/src/plugins/platforms/android/src/qandroidinputcontext.cpp b/src/plugins/platforms/android/qandroidinputcontext.cpp
index 326972e71e..326972e71e 100644
--- a/src/plugins/platforms/android/src/qandroidinputcontext.cpp
+++ b/src/plugins/platforms/android/qandroidinputcontext.cpp
diff --git a/src/plugins/platforms/android/src/qandroidinputcontext.h b/src/plugins/platforms/android/qandroidinputcontext.h
index 041bd0dc49..041bd0dc49 100644
--- a/src/plugins/platforms/android/src/qandroidinputcontext.h
+++ b/src/plugins/platforms/android/qandroidinputcontext.h
diff --git a/src/plugins/platforms/android/src/qandroidplatformaccessibility.cpp b/src/plugins/platforms/android/qandroidplatformaccessibility.cpp
index 229368345b..229368345b 100644
--- a/src/plugins/platforms/android/src/qandroidplatformaccessibility.cpp
+++ b/src/plugins/platforms/android/qandroidplatformaccessibility.cpp
diff --git a/src/plugins/platforms/android/src/qandroidplatformaccessibility.h b/src/plugins/platforms/android/qandroidplatformaccessibility.h
index 1b87f11919..1b87f11919 100644
--- a/src/plugins/platforms/android/src/qandroidplatformaccessibility.h
+++ b/src/plugins/platforms/android/qandroidplatformaccessibility.h
diff --git a/src/plugins/platforms/android/qandroidplatformbackingstore.cpp b/src/plugins/platforms/android/qandroidplatformbackingstore.cpp
new file mode 100644
index 0000000000..1df7ce3179
--- /dev/null
+++ b/src/plugins/platforms/android/qandroidplatformbackingstore.cpp
@@ -0,0 +1,78 @@
+/****************************************************************************
+**
+** Copyright (C) 2014 BogDan Vatra <bogdan@kde.org>
+** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies).
+** Contact: http://www.qt-project.org/legal
+**
+** This file is part of the plugins of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and Digia. For licensing terms and
+** conditions see http://qt.digia.com/licensing. For further information
+** use the contact form at http://qt.digia.com/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Digia gives you certain additional
+** rights. These rights are described in the Digia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "qandroidplatformbackingstore.h"
+#include "qandroidplatformscreen.h"
+#include "qandroidplatformrasterwindow.h"
+#include <qpa/qplatformscreen.h>
+
+QT_BEGIN_NAMESPACE
+
+QAndroidPlatformBackingStore::QAndroidPlatformBackingStore(QWindow *window)
+ : QPlatformBackingStore(window)
+{
+ Q_ASSERT(window->handle());
+ (static_cast<QAndroidPlatformRasterWindow *>(window->handle()))->setBackingStore(this);
+}
+
+QPaintDevice *QAndroidPlatformBackingStore::paintDevice()
+{
+ return &m_image;
+}
+
+void QAndroidPlatformBackingStore::flush(QWindow *window, const QRegion &region, const QPoint &offset)
+{
+ Q_UNUSED(window);
+ Q_UNUSED(offset);
+
+ (static_cast<QAndroidPlatformRasterWindow *>(window->handle()))->repaint(region);
+}
+
+void QAndroidPlatformBackingStore::resize(const QSize &size, const QRegion &staticContents)
+{
+ Q_UNUSED(staticContents);
+
+ if (m_image.size() != size)
+ m_image = QImage(size, window()->screen()->handle()->format());
+}
+
+QT_END_NAMESPACE
diff --git a/src/plugins/platforms/android/src/opengl/qandroidopenglplatformscreen.cpp b/src/plugins/platforms/android/qandroidplatformbackingstore.h
index de4075feff..e6ea3dcce0 100644
--- a/src/plugins/platforms/android/src/opengl/qandroidopenglplatformscreen.cpp
+++ b/src/plugins/platforms/android/qandroidplatformbackingstore.h
@@ -1,5 +1,6 @@
/****************************************************************************
**
+** Copyright (C) 2014 BogDan Vatra <bogdan@kde.org>
** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies).
** Contact: http://www.qt-project.org/legal
**
@@ -39,23 +40,27 @@
**
****************************************************************************/
-#include "qandroidopenglplatformscreen.h"
-#include "qandroidopenglplatformwindow.h"
-#include "androidjnimenu.h"
+#ifndef QANDROIDPLATFORMBACKINGSTORE_H
+#define QANDROIDPLATFORMBACKINGSTORE_H
+
+#include <qpa/qplatformbackingstore.h>
+#include <qpa/qwindowsysteminterface.h>
QT_BEGIN_NAMESPACE
-QAndroidOpenGLPlatformScreen::QAndroidOpenGLPlatformScreen(EGLDisplay display)
- : QEglFSScreen(display)
+class QAndroidPlatformBackingStore : public QPlatformBackingStore
{
-}
+public:
+ explicit QAndroidPlatformBackingStore(QWindow *window);
+ virtual QPaintDevice *paintDevice();
+ virtual void flush(QWindow *window, const QRegion &region, const QPoint &offset);
+ virtual void resize(const QSize &size, const QRegion &staticContents);
+ const QImage image() { return m_image; }
-void QAndroidOpenGLPlatformScreen::topWindowChanged(QPlatformWindow *window)
-{
- QtAndroidMenu::setActiveTopLevelWindow(window->window());
- QAndroidOpenGLPlatformWindow *platformWindow = static_cast<QAndroidOpenGLPlatformWindow *>(window);
- if (platformWindow != 0)
- platformWindow->updateStatusBarVisibility();
-}
+protected:
+ QImage m_image;
+};
QT_END_NAMESPACE
+
+#endif // QANDROIDPLATFORMBACKINGSTORE_H
diff --git a/src/plugins/platforms/android/src/qandroidplatformclipboard.cpp b/src/plugins/platforms/android/qandroidplatformclipboard.cpp
index bc48b4935b..bc48b4935b 100644
--- a/src/plugins/platforms/android/src/qandroidplatformclipboard.cpp
+++ b/src/plugins/platforms/android/qandroidplatformclipboard.cpp
diff --git a/src/plugins/platforms/android/src/qandroidplatformclipboard.h b/src/plugins/platforms/android/qandroidplatformclipboard.h
index 644f326934..644f326934 100644
--- a/src/plugins/platforms/android/src/qandroidplatformclipboard.h
+++ b/src/plugins/platforms/android/qandroidplatformclipboard.h
diff --git a/src/plugins/platforms/android/src/qandroidplatformdialoghelpers.cpp b/src/plugins/platforms/android/qandroidplatformdialoghelpers.cpp
index 4c91e76e0f..4c91e76e0f 100644
--- a/src/plugins/platforms/android/src/qandroidplatformdialoghelpers.cpp
+++ b/src/plugins/platforms/android/qandroidplatformdialoghelpers.cpp
diff --git a/src/plugins/platforms/android/src/qandroidplatformdialoghelpers.h b/src/plugins/platforms/android/qandroidplatformdialoghelpers.h
index 88ec91d936..88ec91d936 100644
--- a/src/plugins/platforms/android/src/qandroidplatformdialoghelpers.h
+++ b/src/plugins/platforms/android/qandroidplatformdialoghelpers.h
diff --git a/src/plugins/platforms/android/src/qandroidplatformfontdatabase.cpp b/src/plugins/platforms/android/qandroidplatformfontdatabase.cpp
index 7f68b44ed8..7f68b44ed8 100644
--- a/src/plugins/platforms/android/src/qandroidplatformfontdatabase.cpp
+++ b/src/plugins/platforms/android/qandroidplatformfontdatabase.cpp
diff --git a/src/plugins/platforms/android/src/qandroidplatformfontdatabase.h b/src/plugins/platforms/android/qandroidplatformfontdatabase.h
index 3cbfe95d36..3cbfe95d36 100644
--- a/src/plugins/platforms/android/src/qandroidplatformfontdatabase.h
+++ b/src/plugins/platforms/android/qandroidplatformfontdatabase.h
diff --git a/src/plugins/platforms/android/src/qandroidplatformintegration.cpp b/src/plugins/platforms/android/qandroidplatformintegration.cpp
index ae3e257d3c..2fc6b987ab 100644
--- a/src/plugins/platforms/android/src/qandroidplatformintegration.cpp
+++ b/src/plugins/platforms/android/qandroidplatformintegration.cpp
@@ -40,35 +40,32 @@
****************************************************************************/
#include "qandroidplatformintegration.h"
-#include "qabstracteventdispatcher.h"
-#include "androidjnimain.h"
-#include <QtGui/qguiapplication.h>
-#include <qpa/qwindowsysteminterface.h>
+
+#include <QGuiApplication>
+#include <QOpenGLContext>
#include <QThread>
+
+#include <QtPlatformSupport/private/qgenericunixeventdispatcher_p.h>
+
+#include <qpa/qwindowsysteminterface.h>
#include <qpa/qplatformwindow.h>
+
+#warning sort the headers
+#include "androidjnimain.h"
+#include "qabstracteventdispatcher.h"
+#include "qandroidplatformrasterwindow.h"
+#include "qandroidplatformopenglwindow.h"
+#include "qandroidplatformbackingstore.h"
#include "qandroidplatformservices.h"
#include "qandroidplatformfontdatabase.h"
#include "qandroidplatformclipboard.h"
#include "qandroidplatformaccessibility.h"
-#include <QtPlatformSupport/private/qgenericunixeventdispatcher_p.h>
-
-#ifndef ANDROID_PLUGIN_OPENGL
-# include "qandroidplatformscreen.h"
-# include "qandroidplatformwindow.h"
-# include <QtPlatformSupport/private/qfbbackingstore_p.h>
-#else
-# include "qeglfswindow.h"
-# include "androidjnimenu.h"
-# include "qandroidopenglcontext.h"
-# include "qandroidopenglplatformwindow.h"
-# include "qandroidopenglplatformscreen.h"
-# include "qeglfshooks.h"
-# include <QtGui/qopenglcontext.h>
-#endif
-
+#include "qandroidplatformopenglcontext.h"
+#include "qandroidplatformscreen.h"
#include "qandroidplatformtheme.h"
#include "qandroidsystemlocale.h"
+
QT_BEGIN_NAMESPACE
int QAndroidPlatformIntegration::m_defaultGeometryWidth = 320;
@@ -102,12 +99,21 @@ QAndroidPlatformIntegration::QAndroidPlatformIntegration(const QStringList &para
m_androidPlatformNativeInterface = new QAndroidPlatformNativeInterface();
-#ifndef ANDROID_PLUGIN_OPENGL
+ if (!eglBindAPI(EGL_OPENGL_ES_API))
+ qFatal("Could not bind GL_ES API");
+
+ m_eglDisplay = eglGetDisplay(EGL_DEFAULT_DISPLAY);
+ if (m_eglDisplay == EGL_NO_DISPLAY)
+ qFatal("Could not open egl display");
+
+ EGLint major, minor;
+ if (!eglInitialize(m_eglDisplay, &major, &minor))
+ qFatal("Could not initialize egl display");
+
m_primaryScreen = new QAndroidPlatformScreen();
screenAdded(m_primaryScreen);
m_primaryScreen->setPhysicalSize(QSize(m_defaultPhysicalSizeWidth, m_defaultPhysicalSizeHeight));
m_primaryScreen->setGeometry(QRect(0, 0, m_defaultGeometryWidth, m_defaultGeometryHeight));
-#endif
m_mainThread = QThread::currentThread();
QtAndroid::setAndroidPlatformIntegration(this);
@@ -124,83 +130,53 @@ bool QAndroidPlatformIntegration::hasCapability(Capability cap) const
switch (cap) {
case ThreadedPixmaps: return true;
case ApplicationState: return true;
- case NativeWidgets: return false;
+ case NativeWidgets: return true;
+ case OpenGL: return true;
+ case ThreadedOpenGL: return true;
default:
-#ifndef ANDROID_PLUGIN_OPENGL
- return QPlatformIntegration::hasCapability(cap);
-#else
- return QEglFSIntegration::hasCapability(cap);
-#endif
+ return QPlatformIntegration::hasCapability(cap);
}
}
-#ifndef ANDROID_PLUGIN_OPENGL
QPlatformBackingStore *QAndroidPlatformIntegration::createPlatformBackingStore(QWindow *window) const
{
- return new QFbBackingStore(window);
+ return new QAndroidPlatformBackingStore(window);
}
-QPlatformWindow *QAndroidPlatformIntegration::createPlatformWindow(QWindow *window) const
+QPlatformOpenGLContext *QAndroidPlatformIntegration::createPlatformOpenGLContext(QOpenGLContext *context) const
{
- QAndroidPlatformWindow *platformWindow = new QAndroidPlatformWindow(window);
- platformWindow->setWindowState(window->windowState());
-
- return platformWindow;
+ QSurfaceFormat format(context->format());
+ format.setAlphaBufferSize(8);
+ format.setRedBufferSize(8);
+ format.setGreenBufferSize(8);
+ format.setBlueBufferSize(8);
+ return new QAndroidPlatformOpenGLContext(format, context->shareHandle(), m_eglDisplay);
}
-QAbstractEventDispatcher *QAndroidPlatformIntegration::createEventDispatcher() const
-{
- return createUnixEventDispatcher();
-}
-#else // !ANDROID_PLUGIN_OPENGL
QPlatformWindow *QAndroidPlatformIntegration::createPlatformWindow(QWindow *window) const
{
- QAndroidOpenGLPlatformWindow *platformWindow = new QAndroidOpenGLPlatformWindow(window);
- platformWindow->create();
- platformWindow->requestActivateWindow();
- platformWindow->setWindowState(window->windowState());
- QtAndroidMenu::setActiveTopLevelWindow(window);
-
- return platformWindow;
+ if (window->surfaceType() == QSurface::RasterSurface)
+ return new QAndroidPlatformRasterWindow(window);
+ else
+ return new QAndroidPlatformOpenGLWindow(window, m_eglDisplay);
}
-void QAndroidPlatformIntegration::invalidateNativeSurface()
-{
- foreach (QWindow *w, QGuiApplication::topLevelWindows()) {
- QAndroidOpenGLPlatformWindow *window =
- static_cast<QAndroidOpenGLPlatformWindow *>(w->handle());
- if (window != 0)
- window->invalidateSurface();
- }
-}
-
-void QAndroidPlatformIntegration::surfaceChanged()
-{
- QAndroidOpenGLPlatformWindow::updateStaticNativeWindow();
- foreach (QWindow *w, QGuiApplication::topLevelWindows()) {
- QAndroidOpenGLPlatformWindow *window =
- static_cast<QAndroidOpenGLPlatformWindow *>(w->handle());
- if (window != 0)
- window->resetSurface();
- }
-}
-
-QPlatformOpenGLContext *QAndroidPlatformIntegration::createPlatformOpenGLContext(QOpenGLContext *context) const
+QAbstractEventDispatcher *QAndroidPlatformIntegration::createEventDispatcher() const
{
- return new QAndroidOpenGLContext(this,
- QEglFSHooks::hooks()->surfaceFormatFor(context->format()),
- context->shareHandle(),
- display());
+ return createUnixEventDispatcher();
}
-#endif // ANDROID_PLUGIN_OPENGL
QAndroidPlatformIntegration::~QAndroidPlatformIntegration()
{
+ if (m_eglDisplay != EGL_NO_DISPLAY)
+ eglTerminate(m_eglDisplay);
+
delete m_androidPlatformNativeInterface;
delete m_androidFDB;
delete m_androidSystemLocale;
QtAndroid::setAndroidPlatformIntegration(NULL);
}
+
QPlatformFontDatabase *QAndroidPlatformIntegration::fontDatabase() const
{
return m_androidFDB;
@@ -295,8 +271,6 @@ QPlatformAccessibility *QAndroidPlatformIntegration::accessibility() const
}
#endif
-
-#ifndef ANDROID_PLUGIN_OPENGL
void QAndroidPlatformIntegration::setDesktopSize(int width, int height)
{
if (m_primaryScreen)
@@ -308,36 +282,5 @@ void QAndroidPlatformIntegration::setDisplayMetrics(int width, int height)
if (m_primaryScreen)
QMetaObject::invokeMethod(m_primaryScreen, "setPhysicalSize", Qt::AutoConnection, Q_ARG(QSize, QSize(width, height)));
}
-#else
-void QAndroidPlatformIntegration::setDesktopSize(int width, int height)
-{
- m_defaultGeometryWidth = width;
- m_defaultGeometryHeight = height;
-}
-
-void QAndroidPlatformIntegration::setDisplayMetrics(int width, int height)
-{
- m_defaultPhysicalSizeWidth = width;
- m_defaultPhysicalSizeHeight = height;
-}
-
-QEglFSScreen *QAndroidPlatformIntegration::createScreen() const
-{
- return new QAndroidOpenGLPlatformScreen(display());
-}
-
-#endif
-
-void QAndroidPlatformIntegration::pauseApp()
-{
- if (QAbstractEventDispatcher::instance(m_mainThread))
- QAbstractEventDispatcher::instance(m_mainThread)->interrupt();
-}
-
-void QAndroidPlatformIntegration::resumeApp()
-{
- if (QAbstractEventDispatcher::instance(m_mainThread))
- QAbstractEventDispatcher::instance(m_mainThread)->wakeUp();
-}
QT_END_NAMESPACE
diff --git a/src/plugins/platforms/android/src/qandroidplatformintegration.h b/src/plugins/platforms/android/qandroidplatformintegration.h
index bd08ad694c..a6cba7ac16 100644
--- a/src/plugins/platforms/android/src/qandroidplatformintegration.h
+++ b/src/plugins/platforms/android/qandroidplatformintegration.h
@@ -47,14 +47,11 @@
#include <qpa/qplatformnativeinterface.h>
#include <QtWidgets/QAction>
+#include <EGL/egl.h>
#include <jni.h>
#include "qandroidinputcontext.h"
-#ifndef ANDROID_PLUGIN_OPENGL
-# include "qandroidplatformscreen.h"
-#else
-# include "qeglfsintegration.h"
-#endif
+#include "qandroidplatformscreen.h"
QT_BEGIN_NAMESPACE
@@ -63,10 +60,6 @@ class QAndroidPlatformServices;
class QAndroidSystemLocale;
class QPlatformAccessibility;
-#ifdef ANDROID_PLUGIN_OPENGL
-class QAndroidOpenGLPlatformWindow;
-#endif
-
class QAndroidPlatformNativeInterface: public QPlatformNativeInterface
{
public:
@@ -75,12 +68,7 @@ public:
QHash<int, QFont> m_fonts;
};
-class QAndroidPlatformIntegration
-#ifndef ANDROID_PLUGIN_OPENGL
- : public QPlatformIntegration
-#else
- : public QEglFSIntegration
-#endif
+class QAndroidPlatformIntegration : public QPlatformIntegration
{
friend class QAndroidPlatformScreen;
@@ -90,17 +78,11 @@ public:
bool hasCapability(QPlatformIntegration::Capability cap) const;
-#ifndef ANDROID_PLUGIN_OPENGL
- QPlatformBackingStore *createPlatformBackingStore(QWindow *window) const;
QPlatformWindow *createPlatformWindow(QWindow *window) const;
+ QPlatformBackingStore *createPlatformBackingStore(QWindow *window) const;
+ QPlatformOpenGLContext *createPlatformOpenGLContext(QOpenGLContext *context) const;
QAbstractEventDispatcher *createEventDispatcher() const;
QAndroidPlatformScreen *screen() { return m_primaryScreen; }
-#else
- QPlatformWindow *createPlatformWindow(QWindow *window) const;
- void invalidateNativeSurface();
- void surfaceChanged();
- QPlatformOpenGLContext *createPlatformOpenGLContext(QOpenGLContext *context) const;
-#endif
virtual void setDesktopSize(int width, int height);
virtual void setDisplayMetrics(int width, int height);
@@ -121,13 +103,11 @@ public:
#endif
QVariant styleHint(StyleHint hint) const;
- Qt::WindowState defaultWindowState(Qt::WindowFlags flags) const Q_DECL_OVERRIDE;
+ Qt::WindowState defaultWindowState(Qt::WindowFlags flags) const;
QStringList themeNames() const;
QPlatformTheme *createPlatformTheme(const QString &name) const;
- void pauseApp();
- void resumeApp();
static void setDefaultDisplayMetrics(int gw, int gh, int sw, int sh);
static void setDefaultDesktopSize(int gw, int gh);
static void setScreenOrientation(Qt::ScreenOrientation currentOrientation,
@@ -141,19 +121,12 @@ public:
QTouchDevice *touchDevice() const { return m_touchDevice; }
void setTouchDevice(QTouchDevice *touchDevice) { m_touchDevice = touchDevice; }
-#ifdef ANDROID_PLUGIN_OPENGL
- QEglFSScreen *createScreen() const;
-#endif
-
private:
-
- friend class QEglFSAndroidHooks;
+ EGLDisplay m_eglDisplay;
QTouchDevice *m_touchDevice;
-#ifndef ANDROID_PLUGIN_OPENGL
QAndroidPlatformScreen *m_primaryScreen;
-#endif
QThread *m_mainThread;
diff --git a/src/plugins/platforms/android/src/qandroidplatformmenu.cpp b/src/plugins/platforms/android/qandroidplatformmenu.cpp
index 1ecabb25e2..1ecabb25e2 100644
--- a/src/plugins/platforms/android/src/qandroidplatformmenu.cpp
+++ b/src/plugins/platforms/android/qandroidplatformmenu.cpp
diff --git a/src/plugins/platforms/android/src/qandroidplatformmenu.h b/src/plugins/platforms/android/qandroidplatformmenu.h
index 305b64168a..305b64168a 100644
--- a/src/plugins/platforms/android/src/qandroidplatformmenu.h
+++ b/src/plugins/platforms/android/qandroidplatformmenu.h
diff --git a/src/plugins/platforms/android/src/qandroidplatformmenubar.cpp b/src/plugins/platforms/android/qandroidplatformmenubar.cpp
index 134062fb32..134062fb32 100644
--- a/src/plugins/platforms/android/src/qandroidplatformmenubar.cpp
+++ b/src/plugins/platforms/android/qandroidplatformmenubar.cpp
diff --git a/src/plugins/platforms/android/src/qandroidplatformmenubar.h b/src/plugins/platforms/android/qandroidplatformmenubar.h
index 56915335c2..56915335c2 100644
--- a/src/plugins/platforms/android/src/qandroidplatformmenubar.h
+++ b/src/plugins/platforms/android/qandroidplatformmenubar.h
diff --git a/src/plugins/platforms/android/src/qandroidplatformmenuitem.cpp b/src/plugins/platforms/android/qandroidplatformmenuitem.cpp
index bd37834d2a..bd37834d2a 100644
--- a/src/plugins/platforms/android/src/qandroidplatformmenuitem.cpp
+++ b/src/plugins/platforms/android/qandroidplatformmenuitem.cpp
diff --git a/src/plugins/platforms/android/src/qandroidplatformmenuitem.h b/src/plugins/platforms/android/qandroidplatformmenuitem.h
index 5861e8e195..5861e8e195 100644
--- a/src/plugins/platforms/android/src/qandroidplatformmenuitem.h
+++ b/src/plugins/platforms/android/qandroidplatformmenuitem.h
diff --git a/src/plugins/platforms/android/src/opengl/qandroidopenglcontext.cpp b/src/plugins/platforms/android/qandroidplatformopenglcontext.cpp
index 6431914812..d99cafe6b7 100644
--- a/src/plugins/platforms/android/src/opengl/qandroidopenglcontext.cpp
+++ b/src/plugins/platforms/android/qandroidplatformopenglcontext.cpp
@@ -1,5 +1,6 @@
/****************************************************************************
**
+** Copyright (C) 2014 BogDan Vatra <bogdan@kde.org>
** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies).
** Contact: http://www.qt-project.org/legal
**
@@ -39,49 +40,30 @@
**
****************************************************************************/
-#include "qandroidopenglcontext.h"
-#include "qandroidopenglplatformwindow.h"
-#include "qandroidplatformintegration.h"
-
-#include <QtCore/qdebug.h>
-#include <qpa/qwindowsysteminterface.h>
+#include "qandroidplatformopenglcontext.h"
+#include "qandroidplatformopenglwindow.h"
+#include <QSurface>
#include <QtGui/private/qopenglcontext_p.h>
QT_BEGIN_NAMESPACE
-QAndroidOpenGLContext::QAndroidOpenGLContext(const QAndroidPlatformIntegration *integration,
- const QSurfaceFormat &format,
- QPlatformOpenGLContext *share,
- EGLDisplay display,
- EGLenum eglApi)
- : QEglFSContext(format, share, display, eglApi)
- , m_platformIntegration(integration)
+QAndroidPlatformOpenGLContext::QAndroidPlatformOpenGLContext(const QSurfaceFormat &format, QPlatformOpenGLContext *share, EGLDisplay display)
+ :QEGLPlatformContext(format, share, display, EGL_OPENGL_ES_API)
{
}
-void QAndroidOpenGLContext::swapBuffers(QPlatformSurface *surface)
+void QAndroidPlatformOpenGLContext::swapBuffers(QPlatformSurface *surface)
{
- QEglFSContext::swapBuffers(surface);
+ QEGLPlatformContext::swapBuffers(surface);
- if (surface->surface()->surfaceClass() == QSurface::Window) {
- QAndroidOpenGLPlatformWindow *window = static_cast<QAndroidOpenGLPlatformWindow *>(surface);
- window->lock();
- QSize size = window->scheduledResize();
- if (size.isValid()) {
- QRect geometry(QPoint(0, 0), size);
- window->setGeometry(geometry);
- QWindowSystemInterface::handleGeometryChange(window->window(), geometry);
- QWindowSystemInterface::handleExposeEvent(window->window(), QRegion(geometry));
- window->scheduleResize(QSize());
- }
- window->unlock();
- }
+ if (surface->surface()->surfaceClass() == QSurface::Window)
+ static_cast<QAndroidPlatformOpenGLWindow *>(surface)->checkNativeSurface(eglConfig());
}
-bool QAndroidOpenGLContext::makeCurrent(QPlatformSurface *surface)
+bool QAndroidPlatformOpenGLContext::makeCurrent(QPlatformSurface *surface)
{
- bool ret = QEglFSContext::makeCurrent(surface);
+ bool ret = QEGLPlatformContext::makeCurrent(surface);
const char *rendererString = reinterpret_cast<const char *>(glGetString(GL_RENDERER));
if (rendererString != 0 && qstrncmp(rendererString, "Android Emulator", 16) == 0) {
@@ -92,4 +74,11 @@ bool QAndroidOpenGLContext::makeCurrent(QPlatformSurface *surface)
return ret;
}
+EGLSurface QAndroidPlatformOpenGLContext::eglSurfaceForPlatformSurface(QPlatformSurface *surface)
+{
+ if (surface->surface()->surfaceClass() == QSurface::Window)
+ return static_cast<QAndroidPlatformOpenGLWindow *>(surface)->eglSurface(eglConfig());
+ return EGL_NO_SURFACE;
+}
+
QT_END_NAMESPACE
diff --git a/src/plugins/platforms/android/src/opengl/qandroidopenglcontext.h b/src/plugins/platforms/android/qandroidplatformopenglcontext.h
index c419ae8392..29e5f596d5 100644
--- a/src/plugins/platforms/android/src/opengl/qandroidopenglcontext.h
+++ b/src/plugins/platforms/android/qandroidplatformopenglcontext.h
@@ -1,5 +1,6 @@
/****************************************************************************
**
+** Copyright (C) 2014 BogDan Vatra <bogdan@kde.org>
** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies).
** Contact: http://www.qt-project.org/legal
**
@@ -39,31 +40,24 @@
**
****************************************************************************/
-#ifndef QANDROIDOPENGLCONTEXT_H
-#define QANDROIDOPENGLCONTEXT_H
+#ifndef QANDROIDPLATFORMOPENGLCONTEXT_H
+#define QANDROIDPLATFORMOPENGLCONTEXT_H
-#include <QtCore/qreadwritelock.h>
-#include "qeglfscontext.h"
+#include <QtPlatformSupport/private/qeglplatformcontext_p.h>
QT_BEGIN_NAMESPACE
-class QAndroidPlatformIntegration;
-class QAndroidOpenGLContext : public QEglFSContext
+class QAndroidPlatformOpenGLContext : public QEGLPlatformContext
{
public:
- QAndroidOpenGLContext(const QAndroidPlatformIntegration *integration,
- const QSurfaceFormat &format,
- QPlatformOpenGLContext *share,
- EGLDisplay display,
- EGLenum eglApi = EGL_OPENGL_ES_API);
-
+ QAndroidPlatformOpenGLContext(const QSurfaceFormat &format, QPlatformOpenGLContext *share, EGLDisplay display);
void swapBuffers(QPlatformSurface *surface);
bool makeCurrent(QPlatformSurface *surface);
private:
- const QAndroidPlatformIntegration *m_platformIntegration;
+ virtual EGLSurface eglSurfaceForPlatformSurface(QPlatformSurface *surface);
};
QT_END_NAMESPACE
-#endif // QANDROIDOPENGLCONTEXT_H
+#endif // QANDROIDPLATFORMOPENGLCONTEXT_H
diff --git a/src/plugins/platforms/android/qandroidplatformopenglwindow.cpp b/src/plugins/platforms/android/qandroidplatformopenglwindow.cpp
new file mode 100644
index 0000000000..498f59be88
--- /dev/null
+++ b/src/plugins/platforms/android/qandroidplatformopenglwindow.cpp
@@ -0,0 +1,160 @@
+/****************************************************************************
+**
+** Copyright (C) 2014 BogDan Vatra <bogdan@kde.org>
+** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies).
+** Contact: http://www.qt-project.org/legal
+**
+** This file is part of the plugins of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and Digia. For licensing terms and
+** conditions see http://qt.digia.com/licensing. For further information
+** use the contact form at http://qt.digia.com/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Digia gives you certain additional
+** rights. These rights are described in the Digia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "qandroidplatformopenglwindow.h"
+
+#include "androidjnimain.h"
+
+#include <QSurfaceFormat>
+
+#include <qpa/qwindowsysteminterface.h>
+
+#include <android/native_window.h>
+#include <android/native_window_jni.h>
+
+#warning remove me
+#include <QDebug>
+
+QT_BEGIN_NAMESPACE
+
+QAndroidPlatformOpenGLWindow::QAndroidPlatformOpenGLWindow(QWindow *window, EGLDisplay display)
+ :QAndroidPlatformWindow(window), m_eglDisplay(display)
+{
+ lockSurface();
+ m_nativeSurfaceId = QtAndroid::createSurface(this, geometry(), bool(window->flags() & Qt::WindowStaysOnTopHint));
+ m_surfaceWaitCondition.wait(&m_surfaceMutex);
+ unlockSurface();
+}
+
+QAndroidPlatformOpenGLWindow::~QAndroidPlatformOpenGLWindow()
+{
+ m_surfaceWaitCondition.wakeOne();
+ lockSurface();
+ if (m_nativeSurfaceId != -1)
+ QtAndroid::destroySurface(m_nativeSurfaceId);
+ clearEgl();
+ unlockSurface();
+}
+
+void QAndroidPlatformOpenGLWindow::setGeometry(const QRect &rect)
+{
+ if (rect == geometry())
+ return;
+
+ qDebug() << rect;
+ QAndroidPlatformWindow::setGeometry(rect);
+ QtAndroid::setSurfaceGeometry(m_nativeSurfaceId, rect);
+}
+
+EGLSurface QAndroidPlatformOpenGLWindow::eglSurface(EGLConfig config)
+{
+ QMutexLocker lock(&m_surfaceMutex);
+ if (m_eglSurface == EGL_NO_SURFACE) {
+ m_surfaceMutex.unlock();
+ checkNativeSurface(config);
+ m_surfaceMutex.lock();
+ }
+ return m_eglSurface;
+}
+
+void QAndroidPlatformOpenGLWindow::checkNativeSurface(EGLConfig config)
+{
+ QMutexLocker lock(&m_surfaceMutex);
+ qDebug() << geometry() << m_changedAndroidSurface.isValid();
+ if (m_nativeSurfaceId == -1 || !m_changedAndroidSurface.isValid())
+ return;
+
+ createEgl(config);
+
+ // we've create another surface, the window should be repainted
+ QWindowSystemInterface::handleExposeEvent(window(), QRegion(geometry()));
+}
+
+void QAndroidPlatformOpenGLWindow::createEgl(EGLConfig config)
+{
+ clearEgl();
+ m_androidSurface = QJNIObjectPrivate();
+ m_androidSurface = m_changedAndroidSurface;
+ m_changedAndroidSurface = QJNIObjectPrivate();
+ QJNIEnvironmentPrivate env;
+ m_nativeWindow = ANativeWindow_fromSurface(env, m_androidSurface.object());
+ if (m_nativeWindow)
+ ANativeWindow_acquire(m_nativeWindow);
+
+ m_eglSurface = eglCreateWindowSurface(m_eglDisplay, config, m_nativeWindow, NULL);
+ if (m_eglSurface == EGL_NO_SURFACE) {
+ EGLint error = eglGetError();
+ eglTerminate(m_eglDisplay);
+ qFatal("EGL Error : Could not create the egl surface: error = 0x%x\n", error);
+ }
+}
+
+void QAndroidPlatformOpenGLWindow::clearEgl()
+{
+ eglMakeCurrent(m_eglDisplay, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT);
+ if (m_eglSurface != EGL_NO_SURFACE) {
+ eglDestroySurface(m_eglDisplay, m_eglSurface);
+ m_eglSurface = EGL_NO_SURFACE;
+ }
+
+ if (m_nativeWindow) {
+ ANativeWindow_release(m_nativeWindow);
+ m_nativeWindow = 0;
+ }
+}
+
+void QAndroidPlatformOpenGLWindow::surfaceChanged(JNIEnv *jniEnv, jobject surface, int w, int h)
+{
+ Q_UNUSED(jniEnv);
+ Q_UNUSED(w);
+ Q_UNUSED(h);
+ qDebug() << w << h;
+ lockSurface();
+ m_changedAndroidSurface = surface;
+ m_surfaceWaitCondition.wakeOne();
+ unlockSurface();
+
+ // repaint the window
+ QWindowSystemInterface::handleExposeEvent(window(), QRegion(geometry()));
+}
+
+QT_END_NAMESPACE
diff --git a/src/plugins/platforms/android/src/opengl/qandroidopenglplatformwindow.h b/src/plugins/platforms/android/qandroidplatformopenglwindow.h
index e4ff0444d4..820453ab01 100644
--- a/src/plugins/platforms/android/src/opengl/qandroidopenglplatformwindow.h
+++ b/src/plugins/platforms/android/qandroidplatformopenglwindow.h
@@ -1,5 +1,6 @@
/****************************************************************************
**
+** Copyright (C) 2014 BogDan Vatra <bogdan@kde.org>
** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies).
** Contact: http://www.qt-project.org/legal
**
@@ -39,53 +40,44 @@
**
****************************************************************************/
-#ifndef QANDROIDOPENGLPLATFORMWINDOW_H
-#define QANDROIDOPENGLPLATFORMWINDOW_H
+#ifndef QANDROIDPLATFORMOPENGLWINDOW_H
+#define QANDROIDPLATFORMOPENGLWINDOW_H
-#include "qeglfswindow.h"
-#include <QtCore/qmutex.h>
-#include <QtCore/qreadwritelock.h>
+#include <EGL/egl.h>
+#include <QWaitCondition>
+#include <QtCore/private/qjni_p.h>
+
+#include "androidsurfaceclient.h"
+#include "qandroidplatformwindow.h"
QT_BEGIN_NAMESPACE
-class QAndroidOpenGLPlatformWindow : public QEglFSWindow
+class QAndroidPlatformOpenGLWindow : public QAndroidPlatformWindow, public AndroidSurfaceClient
{
public:
- QAndroidOpenGLPlatformWindow(QWindow *window);
- ~QAndroidOpenGLPlatformWindow();
-
- QSize scheduledResize() const { return m_scheduledResize; }
- void scheduleResize(const QSize &size) { m_scheduledResize = size; }
-
- void lock() { m_lock.lock(); }
- void unlock() { m_lock.unlock(); }
-
- bool isExposed() const;
+ explicit QAndroidPlatformOpenGLWindow(QWindow *window, EGLDisplay display);
+ ~QAndroidPlatformOpenGLWindow();
- void raise();
+ void setGeometry(const QRect &rect);
+ EGLSurface eglSurface(EGLConfig config);
- void invalidateSurface();
- void resetSurface();
- void setWindowState(Qt::WindowState state);
+ void checkNativeSurface(EGLConfig config);
- void setVisible(bool visible);
-
- void destroy();
-
- static void updateStaticNativeWindow();
- void updateStatusBarVisibility();
+protected:
+ virtual void surfaceChanged(JNIEnv *jniEnv, jobject surface, int w, int h);
+ void createEgl(EGLConfig config);
+ void clearEgl();
private:
- QSize m_scheduledResize;
- QMutex m_lock;
- Qt::WindowState m_state;
-
- static QReadWriteLock m_staticSurfaceLock;
- static EGLSurface m_staticSurface;
- static EGLNativeWindowType m_staticNativeWindow;
- static QBasicAtomicInt m_referenceCount;
+ EGLDisplay m_eglDisplay;
+ EGLSurface m_eglSurface = EGL_NO_SURFACE;
+ EGLNativeWindowType m_nativeWindow = nullptr;
+
+ int m_nativeSurfaceId = -1;
+ QJNIObjectPrivate m_androidSurface;
+ QJNIObjectPrivate m_changedAndroidSurface;
+ QWaitCondition m_surfaceWaitCondition;
};
QT_END_NAMESPACE
-
-#endif // QANDROIDOPENGLPLATFORMWINDOW_H
+#endif // QANDROIDPLATFORMOPENGLWINDOW_H
diff --git a/src/plugins/platforms/android/qandroidplatformrasterwindow.cpp b/src/plugins/platforms/android/qandroidplatformrasterwindow.cpp
new file mode 100644
index 0000000000..113a69427d
--- /dev/null
+++ b/src/plugins/platforms/android/qandroidplatformrasterwindow.cpp
@@ -0,0 +1,78 @@
+/****************************************************************************
+**
+** Copyright (C) 2014 BogDan Vatra <bogdan@kde.org>
+** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies).
+** Contact: http://www.qt-project.org/legal
+**
+** This file is part of the plugins of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and Digia. For licensing terms and
+** conditions see http://qt.digia.com/licensing. For further information
+** use the contact form at http://qt.digia.com/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Digia gives you certain additional
+** rights. These rights are described in the Digia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "qandroidplatformrasterwindow.h"
+
+#include "qandroidplatformscreen.h"
+
+QT_BEGIN_NAMESPACE
+
+QAndroidPlatformRasterWindow::QAndroidPlatformRasterWindow(QWindow *window)
+ :QAndroidPlatformWindow(window)
+{
+
+}
+
+void QAndroidPlatformRasterWindow::repaint(const QRegion &region)
+{
+ QRect currentGeometry = geometry();
+
+ QRect dirtyClient = region.boundingRect();
+ QRect dirtyRegion(currentGeometry.left() + dirtyClient.left(),
+ currentGeometry.top() + dirtyClient.top(),
+ dirtyClient.width(),
+ dirtyClient.height());
+ QRect mOldGeometryLocal = m_oldGeometry;
+ m_oldGeometry = currentGeometry;
+ // If this is a move, redraw the previous location
+ if (mOldGeometryLocal != currentGeometry)
+ platformScreen()->setDirty(mOldGeometryLocal);
+ platformScreen()->setDirty(dirtyRegion);
+}
+
+void QAndroidPlatformRasterWindow::setGeometry(const QRect &rect)
+{
+ m_oldGeometry = geometry();
+ QAndroidPlatformWindow::setGeometry(rect);
+}
+
+QT_END_NAMESPACE
diff --git a/src/plugins/platforms/android/qandroidplatformrasterwindow.h b/src/plugins/platforms/android/qandroidplatformrasterwindow.h
new file mode 100644
index 0000000000..50c0d497af
--- /dev/null
+++ b/src/plugins/platforms/android/qandroidplatformrasterwindow.h
@@ -0,0 +1,70 @@
+/****************************************************************************
+**
+** Copyright (C) 2014 BogDan Vatra <bogdan@kde.org>
+** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies).
+** Contact: http://www.qt-project.org/legal
+**
+** This file is part of the plugins of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and Digia. For licensing terms and
+** conditions see http://qt.digia.com/licensing. For further information
+** use the contact form at http://qt.digia.com/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Digia gives you certain additional
+** rights. These rights are described in the Digia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QANDROIDPLATFORMRASTERWINDOW_H
+#define QANDROIDPLATFORMRASTERWINDOW_H
+
+#include "qandroidplatformwindow.h"
+QT_BEGIN_NAMESPACE
+
+class QAndroidPlatformBackingStore;
+class QAndroidPlatformRasterWindow : public QObject, public QAndroidPlatformWindow
+{
+ Q_OBJECT
+public:
+ QAndroidPlatformRasterWindow(QWindow *window);
+
+ void setBackingStore(QAndroidPlatformBackingStore *store) { m_backingStore = store; }
+ QAndroidPlatformBackingStore *backingStore() const { return m_backingStore; }
+ void repaint(const QRegion&region);
+
+public slots:
+ void setGeometry(const QRect &rect);
+
+private:
+ QAndroidPlatformBackingStore *m_backingStore = nullptr;
+ QRect m_oldGeometry;
+
+};
+
+QT_END_NAMESPACE
+#endif // QANDROIDPLATFORMRASTERWINDOW_H
diff --git a/src/plugins/platforms/android/qandroidplatformscreen.cpp b/src/plugins/platforms/android/qandroidplatformscreen.cpp
new file mode 100644
index 0000000000..4f956f7a4f
--- /dev/null
+++ b/src/plugins/platforms/android/qandroidplatformscreen.cpp
@@ -0,0 +1,352 @@
+/****************************************************************************
+**
+** Copyright (C) 2014 BogDan Vatra <bogdan@kde.org>
+** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies).
+** Contact: http://www.qt-project.org/legal
+**
+** This file is part of the plugins of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and Digia. For licensing terms and
+** conditions see http://qt.digia.com/licensing. For further information
+** use the contact form at http://qt.digia.com/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Digia gives you certain additional
+** rights. These rights are described in the Digia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include <QDebug>
+#include <QTime>
+
+#include <qpa/qwindowsysteminterface.h>
+
+#include "qandroidplatformscreen.h"
+#include "qandroidplatformbackingstore.h"
+#include "qandroidplatformintegration.h"
+#include "androidjnimain.h"
+#include "androidjnimenu.h"
+#include "qandroidplatformrasterwindow.h"
+
+#include <android/bitmap.h>
+
+QT_BEGIN_NAMESPACE
+
+#warning REMOVE ME
+class ScopedProfiler
+{
+public:
+ ScopedProfiler(const QString &msg)
+ {
+ m_msg = msg;
+ }
+ ~ScopedProfiler()
+ {
+ qDebug() << m_msg << m_timer.elapsed();
+ }
+
+private:
+ QTime m_timer;
+ QString m_msg;
+};
+
+#define PROFILE_SCOPE ScopedProfiler ___sp___(__func__)
+
+QAndroidPlatformScreen::QAndroidPlatformScreen():QObject(),QPlatformScreen()
+{
+ m_geometry = QRect(0, 0, QAndroidPlatformIntegration::m_defaultGeometryWidth, QAndroidPlatformIntegration::m_defaultGeometryHeight);
+ // Raster only apps should set QT_ANDROID_RASTER_IMAGE_DEPTH to 16
+ // is way much faster than 32
+ if (qgetenv("QT_ANDROID_RASTER_IMAGE_DEPTH").toInt() == 16) {
+ m_format = QImage::Format_RGB16;
+ m_depth = 16;
+ } else {
+ m_format = QImage::Format_RGBA8888;
+ m_depth = 32;
+ }
+ m_physicalSize.setHeight(QAndroidPlatformIntegration::m_defaultPhysicalSizeHeight);
+ m_physicalSize.setWidth(QAndroidPlatformIntegration::m_defaultPhysicalSizeWidth);
+ m_redrawTimer.setSingleShot(true);
+ m_redrawTimer.setInterval(0);
+ connect(&m_redrawTimer, SIGNAL(timeout()), this, SLOT(doRedraw()));
+}
+
+QAndroidPlatformScreen::~QAndroidPlatformScreen()
+{
+ if (m_id != -1) {
+ QtAndroid::destroySurface(m_id);
+ m_surfaceWaitCondition.wakeOne();
+ if (m_bitmap)
+ QtAndroid::AttachedJNIEnv().jniEnv->DeleteGlobalRef(m_bitmap);
+ }
+}
+
+QWindow *QAndroidPlatformScreen::topWindow() const
+{
+ foreach (QAndroidPlatformWindow *w, m_windowStack)
+ if (w->window()->type() == Qt::Window || w->window()->type() == Qt::Dialog)
+ return w->window();
+ return 0;
+}
+
+QWindow *QAndroidPlatformScreen::topLevelAt(const QPoint &p) const
+{
+ foreach (QAndroidPlatformWindow *w, m_windowStack) {
+ if (w->geometry().contains(p, false) && w->window()->isVisible())
+ return w->window();
+ }
+ return 0;
+}
+
+void QAndroidPlatformScreen::addWindow(QAndroidPlatformWindow *window)
+{
+ m_windowStack.prepend(window);
+ if (window->isRaster())
+ setDirty(window->geometry());
+
+ QWindow *w = topWindow();
+ QWindowSystemInterface::handleWindowActivated(w);
+ topWindowChanged(w);
+}
+
+void QAndroidPlatformScreen::removeWindow(QAndroidPlatformWindow *window)
+{
+ m_windowStack.removeOne(window);
+ if (window->isRaster()) {
+ setDirty(window->geometry());
+ }
+ QWindow *w = topWindow();
+ QWindowSystemInterface::handleWindowActivated(w);
+ topWindowChanged(w);
+}
+
+void QAndroidPlatformScreen::raise(QAndroidPlatformWindow *window)
+{
+ int index = m_windowStack.indexOf(window);
+ if (index <= 0)
+ return;
+ m_windowStack.move(index, 0);
+ if (window->isRaster()) {
+ setDirty(window->geometry());
+ }
+ QWindow *w = topWindow();
+ QWindowSystemInterface::handleWindowActivated(w);
+ topWindowChanged(w);
+}
+
+void QAndroidPlatformScreen::lower(QAndroidPlatformWindow *window)
+{
+ int index = m_windowStack.indexOf(window);
+ if (index == -1 || index == (m_windowStack.size() - 1))
+ return;
+ m_windowStack.move(index, m_windowStack.size() - 1);
+ if (window->isRaster()) {
+ setDirty(window->geometry());
+ }
+ QWindow *w = topWindow();
+ QWindowSystemInterface::handleWindowActivated(w);
+ topWindowChanged(w);
+}
+
+void QAndroidPlatformScreen::scheduleUpdate()
+{
+ if (!m_redrawTimer.isActive())
+ m_redrawTimer.start();
+}
+
+void QAndroidPlatformScreen::setDirty(const QRect &rect)
+{
+ QRect intersection = rect.intersected(m_geometry);
+ QPoint screenOffset = m_geometry.topLeft();
+ m_repaintRegion += intersection.translated(-screenOffset); // global to local translation
+ scheduleUpdate();
+}
+
+void QAndroidPlatformScreen::setPhysicalSize(const QSize &size)
+{
+ m_physicalSize = size;
+}
+
+void QAndroidPlatformScreen::setGeometry(const QRect &rect)
+{
+ QMutexLocker lock(&m_surfaceMutex);
+ if (m_geometry == rect)
+ return;
+
+ m_geometry = rect;
+ QWindowSystemInterface::handleScreenGeometryChange(QPlatformScreen::screen(), geometry());
+ QWindowSystemInterface::handleScreenAvailableGeometryChange(QPlatformScreen::screen(), availableGeometry());
+ resizeMaximizedWindows();
+
+ if (m_id != -1) {
+ if (m_bitmap) {
+ QtAndroid::AttachedJNIEnv().jniEnv->DeleteGlobalRef(m_bitmap);
+ m_bitmap = 0;
+ }
+ QtAndroid::setSurfaceGeometry(m_id, rect);
+ }
+}
+
+void QAndroidPlatformScreen::topWindowChanged(QWindow *w)
+{
+ QtAndroidMenu::setActiveTopLevelWindow(w);
+
+ if (w != 0) {
+ QAndroidPlatformWindow *platformWindow = static_cast<QAndroidPlatformWindow *>(w->handle());
+ if (platformWindow != 0)
+ platformWindow->updateStatusBarVisibility();
+ }
+}
+
+void QAndroidPlatformScreen::doRedraw()
+{
+ PROFILE_SCOPE;
+
+ if (m_repaintRegion.isEmpty())
+ return;
+
+ QVector<QRect> rects = m_repaintRegion.rects();
+
+ QMutexLocker lock(&m_surfaceMutex);
+ if (m_id == -1) {
+ m_id = QtAndroid::createSurface(this, m_geometry, true);
+ m_surfaceWaitCondition.wait(&m_surfaceMutex);
+ }
+
+ if (!m_bitmap || !m_surface.isValid())
+ return;
+
+ QJNIEnvironmentPrivate env;
+ if (!env)
+ return;
+
+ int ret;
+ void *pixels;
+
+ if ((ret = AndroidBitmap_lockPixels(env, m_bitmap, &pixels)) < 0) {
+ qWarning() << "AndroidBitmap_lockPixels() failed! error=" << ret;
+ return;
+ }
+
+ QImage mScreenImage(reinterpret_cast<uchar *>(pixels), m_bitmapWidth, m_bitmapHeight, m_bitmapStride, m_format);
+ QPainter mCompositePainter(&mScreenImage);
+
+ for (int rectIndex = 0; rectIndex < rects.size(); rectIndex++) {
+ QRegion visibleRegion = rects[rectIndex];
+ foreach (QAndroidPlatformWindow *window, m_windowStack) {
+ if (!window->window()->isVisible()
+ || !window->isRaster())
+ continue;
+
+ foreach (const QRect &rect, visibleRegion.rects()) {
+ QRect targetRect = window->geometry();
+ targetRect &= rect;
+
+ if (targetRect.isNull())
+ continue;
+
+ visibleRegion -= targetRect;
+ QRect windowRect = targetRect.translated(-window->geometry().topLeft());
+ QAndroidPlatformBackingStore *backingStore = static_cast<QAndroidPlatformRasterWindow *>(window)->backingStore();
+ if (backingStore)
+ mCompositePainter.drawImage(targetRect, backingStore->image(), windowRect);
+ }
+ }
+
+ foreach (const QRect &rect, visibleRegion.rects())
+ mCompositePainter.fillRect(rect, Qt::transparent);
+ }
+
+
+ QRect br = m_repaintRegion.boundingRect();
+ m_repaintRegion = QRegion();
+ AndroidBitmap_unlockPixels(env, m_bitmap);
+
+ QJNIObjectPrivate jrect("android.graphics.Rect", "(IIII)V",
+ jint(br.left()),
+ jint(br.top()),
+ jint(br.right() + 1),
+ jint(br.bottom() + 1));
+
+ QJNIObjectPrivate canvas = m_surface.callObjectMethod("lockCanvas",
+ "(Landroid/graphics/Rect;)Landroid/graphics/Canvas;",
+ jrect.object());
+ if (!canvas.isValid()) {
+ qWarning() << "Can't lockCanvas";
+ return;
+ }
+ canvas.callMethod<void>("drawBitmap",
+ "(Landroid/graphics/Bitmap;Landroid/graphics/Rect;Landroid/graphics/Rect;Landroid/graphics/Paint;)V",
+ m_bitmap, jrect.object(), jrect.object(), jobject(0));
+
+ m_surface.callMethod<void>("unlockCanvasAndPost", "(Landroid/graphics/Canvas;)V", canvas.object());
+}
+
+QDpi QAndroidPlatformScreen::logicalDpi() const
+{
+ qreal lDpi = QtAndroid::scaledDensity() * 72;
+ return QDpi(lDpi, lDpi);
+}
+
+Qt::ScreenOrientation QAndroidPlatformScreen::orientation() const
+{
+ return QAndroidPlatformIntegration::m_orientation;
+}
+
+Qt::ScreenOrientation QAndroidPlatformScreen::nativeOrientation() const
+{
+ return QAndroidPlatformIntegration::m_nativeOrientation;
+}
+
+void QAndroidPlatformScreen::surfaceChanged(JNIEnv *env, jobject surface, int w, int h)
+{
+ lockSurface();
+ m_surface = surface;
+
+ if (surface && w && h) {
+ if (w != m_bitmapWidth || h != m_bitmapHeight) {
+ if (m_bitmap)
+ env->DeleteGlobalRef(m_bitmap);
+ m_bitmap = env->NewGlobalRef(QtAndroid::createBitmap(w, h, m_format, env));
+ AndroidBitmapInfo info;
+ int res = AndroidBitmap_getInfo(env, m_bitmap, &info);
+ Q_ASSERT(res > -1);
+ m_bitmapStride = info.stride;
+ m_bitmapWidth = info.width;
+ m_bitmapHeight = info.height;
+ }
+ } else {
+ if (m_bitmap) {
+ env->DeleteGlobalRef(m_bitmap);
+ m_bitmap = 0;
+ }
+ }
+ unlockSurface();
+ m_surfaceWaitCondition.wakeOne();
+}
+
+QT_END_NAMESPACE
diff --git a/src/plugins/platforms/android/src/raster/qandroidplatformscreen.h b/src/plugins/platforms/android/qandroidplatformscreen.h
index 9f8807b995..2310b31a51 100644
--- a/src/plugins/platforms/android/src/raster/qandroidplatformscreen.h
+++ b/src/plugins/platforms/android/qandroidplatformscreen.h
@@ -1,6 +1,7 @@
/****************************************************************************
**
-** Copyright (C) 2012 BogDan Vatra <bogdan@kde.org>
+** Copyright (C) 2014 BogDan Vatra <bogdan@kde.org>
+** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies).
** Contact: http://www.qt-project.org/legal
**
** This file is part of the plugins of the Qt Toolkit.
@@ -42,21 +43,78 @@
#ifndef QANDROIDPLATFORMSCREEN_H
#define QANDROIDPLATFORMSCREEN_H
-#include <QtPlatformSupport/private/qfbscreen_p.h>
+#include <qpa/qplatformscreen.h>
+#include <QList>
+#include <QPainter>
+#include <QTimer>
+#include <QWaitCondition>
+#include <QtCore/private/qjni_p.h>
-class QAndroidPlatformScreen: public QFbScreen
+#include "androidsurfaceclient.h"
+
+QT_BEGIN_NAMESPACE
+
+class QAndroidPlatformWindow;
+class QAndroidPlatformBackingStore;
+
+class QAndroidPlatformScreen: public QObject, public QPlatformScreen, public AndroidSurfaceClient
{
Q_OBJECT
public:
QAndroidPlatformScreen();
+ ~QAndroidPlatformScreen();
+
+ QRect geometry() const { return m_geometry; }
+ int depth() const { return m_depth; }
+ QImage::Format format() const { return m_format; }
+ QSizeF physicalSize() const { return m_physicalSize; }
+
+ inline QWindow *topWindow() const;
+ QWindow *topLevelAt(const QPoint & p) const;
+
+ // compositor api
+ void addWindow(QAndroidPlatformWindow *window);
+ void removeWindow(QAndroidPlatformWindow *window);
+ void raise(QAndroidPlatformWindow *window);
+ void lower(QAndroidPlatformWindow *window);
+
+ void scheduleUpdate();
void topWindowChanged(QWindow *w);
+
+public slots:
+ void setDirty(const QRect &rect);
+ void setPhysicalSize(const QSize &size);
+ void setGeometry(const QRect &rect);
+
+protected:
+ typedef QList<QAndroidPlatformWindow *> WindowStackType;
+ WindowStackType m_windowStack;
+ QRegion m_repaintRegion;
+ QTimer m_redrawTimer;
+
+ QRect m_geometry;
+ int m_depth;
+ QImage::Format m_format;
+ QSizeF m_physicalSize;
+
+private:
QDpi logicalDpi() const;
Qt::ScreenOrientation orientation() const;
Qt::ScreenOrientation nativeOrientation() const;
+ void surfaceChanged(JNIEnv *env, jobject surface, int w, int h);
-public slots:
- QRegion doRedraw();
+private slots:
+ void doRedraw();
+private:
+ int m_id = -1;
+ QJNIObjectPrivate m_surface;
+ jobject m_bitmap = nullptr;
+ QWaitCondition m_surfaceWaitCondition;
+ int m_bitmapStride = -1;
+ int m_bitmapWidth = -1;
+ int m_bitmapHeight = -1;
};
+QT_END_NAMESPACE
#endif
diff --git a/src/plugins/platforms/android/src/qandroidplatformservices.cpp b/src/plugins/platforms/android/qandroidplatformservices.cpp
index 0df882f1f0..0df882f1f0 100644
--- a/src/plugins/platforms/android/src/qandroidplatformservices.cpp
+++ b/src/plugins/platforms/android/qandroidplatformservices.cpp
diff --git a/src/plugins/platforms/android/src/qandroidplatformservices.h b/src/plugins/platforms/android/qandroidplatformservices.h
index 8368b19043..8368b19043 100644
--- a/src/plugins/platforms/android/src/qandroidplatformservices.h
+++ b/src/plugins/platforms/android/qandroidplatformservices.h
diff --git a/src/plugins/platforms/android/src/qandroidplatformtheme.cpp b/src/plugins/platforms/android/qandroidplatformtheme.cpp
index 308bb70faf..308bb70faf 100644
--- a/src/plugins/platforms/android/src/qandroidplatformtheme.cpp
+++ b/src/plugins/platforms/android/qandroidplatformtheme.cpp
diff --git a/src/plugins/platforms/android/src/qandroidplatformtheme.h b/src/plugins/platforms/android/qandroidplatformtheme.h
index ec259a9b0a..ec259a9b0a 100644
--- a/src/plugins/platforms/android/src/qandroidplatformtheme.h
+++ b/src/plugins/platforms/android/qandroidplatformtheme.h
diff --git a/src/plugins/platforms/android/src/raster/qandroidplatformwindow.cpp b/src/plugins/platforms/android/qandroidplatformwindow.cpp
index 7ff18526d9..7c2dfd6bac 100644
--- a/src/plugins/platforms/android/src/raster/qandroidplatformwindow.cpp
+++ b/src/plugins/platforms/android/qandroidplatformwindow.cpp
@@ -1,6 +1,7 @@
/****************************************************************************
**
-** Copyright (C) 2012 BogDan Vatra <bogdan@kde.org>
+** Copyright (C) 2014 BogDan Vatra <bogdan@kde.org>
+** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies).
** Contact: http://www.qt-project.org/legal
**
** This file is part of the plugins of the Qt Toolkit.
@@ -40,63 +41,117 @@
****************************************************************************/
#include "qandroidplatformwindow.h"
+#include "qandroidplatformopenglcontext.h"
+#include "qandroidplatformscreen.h"
#include "androidjnimain.h"
#include <qpa/qwindowsysteminterface.h>
+QT_BEGIN_NAMESPACE
+
QAndroidPlatformWindow::QAndroidPlatformWindow(QWindow *window)
- : QFbWindow(window)
+ : QPlatformWindow(window)
{
+ m_windowFlags = Qt::Widget;
+ m_windowState = Qt::WindowNoState;
+ static QAtomicInt winIdGenerator(1);
+ m_windowId = winIdGenerator.fetchAndAddRelaxed(1);
+ setWindowState(window->windowState());
}
-void QAndroidPlatformWindow::setGeometry(const QRect &rect)
+void QAndroidPlatformWindow::lower()
{
- QFbWindow::setGeometry(rect);
+ platformScreen()->lower(this);
}
-void QAndroidPlatformWindow::propagateSizeHints()
+void QAndroidPlatformWindow::raise()
{
- //shut up warning from default implementation
+ updateStatusBarVisibility();
+ platformScreen()->raise(this);
}
-void QAndroidPlatformWindow::updateStatusBarVisibility()
+void QAndroidPlatformWindow::setGeometry(const QRect &rect)
{
- Qt::WindowFlags flags = window()->flags();
- bool isNonRegularWindow = flags & (Qt::Popup | Qt::Dialog | Qt::Sheet) & ~Qt::Window;
- if (!isNonRegularWindow) {
- if (mWindowState & Qt::WindowFullScreen)
- QtAndroid::hideStatusBar();
- else if (mWindowState & Qt::WindowMaximized)
- QtAndroid::showStatusBar();
- }
+ QWindowSystemInterface::handleGeometryChange(window(), rect);
+ QPlatformWindow::setGeometry(rect);
}
-void QAndroidPlatformWindow::raise()
+void QAndroidPlatformWindow::setVisible(bool visible)
{
- updateStatusBarVisibility();
- QFbWindow::raise();
+ if (visible)
+ updateStatusBarVisibility();
+
+ if (visible) {
+ if (m_windowState & Qt::WindowFullScreen)
+ setGeometry(platformScreen()->geometry());
+ else if (m_windowState & Qt::WindowMaximized)
+ setGeometry(platformScreen()->availableGeometry());
+ }
+
+ QPlatformWindow::setVisible(visible);
+
+ if (visible)
+ platformScreen()->addWindow(this);
+ else
+ platformScreen()->removeWindow(this);
+
+ // The Android Activity is activated before Qt is initialized, causing the application state to
+ // never be set to 'active'. We explicitly set this state when the first window becomes visible.
+ if (visible)
+ QtAndroid::setApplicationActive();
}
void QAndroidPlatformWindow::setWindowState(Qt::WindowState state)
{
- if (mWindowState == state)
+ if (m_windowState == state)
return;
+ QPlatformWindow::setWindowState(state);
+ m_windowState = state;
+
if (window()->isVisible())
updateStatusBarVisibility();
+}
- QFbWindow::setWindowState(state);
+void QAndroidPlatformWindow::setWindowFlags(Qt::WindowFlags flags)
+{
+ if (m_windowFlags == flags)
+ return;
+
+ m_windowFlags = flags;
}
-void QAndroidPlatformWindow::setVisible(bool visible)
+Qt::WindowFlags QAndroidPlatformWindow::windowFlags() const
{
- if (visible)
- updateStatusBarVisibility();
+ return m_windowFlags;
+}
- QFbWindow::setVisible(visible);
+QAndroidPlatformScreen *QAndroidPlatformWindow::platformScreen() const
+{
+ return static_cast<QAndroidPlatformScreen *>(window()->screen()->handle());
+}
- // The Android Activity is activated before Qt is initialized, causing the application state to
- // never be set to 'active'. We explicitly set this state when the first window becomes visible.
- if (visible)
- QtAndroid::setApplicationActive();
+void QAndroidPlatformWindow::propagateSizeHints()
+{
+ //shut up warning from default implementation
}
+
+void QAndroidPlatformWindow::requestActivateWindow()
+{
+ platformScreen()->topWindowChanged(window());
+}
+
+void QAndroidPlatformWindow::updateStatusBarVisibility()
+{
+ Qt::WindowFlags flags = window()->flags();
+ bool isNonRegularWindow = flags & (Qt::Popup | Qt::Dialog | Qt::Sheet) & ~Qt::Window;
+ if (!isNonRegularWindow) {
+ if (m_windowState & Qt::WindowFullScreen)
+ QtAndroid::hideStatusBar();
+ else if (m_windowState & Qt::WindowMaximized)
+ QtAndroid::showStatusBar();
+ }
+}
+
+
+QT_END_NAMESPACE
diff --git a/src/plugins/platforms/android/src/raster/qandroidplatformwindow.h b/src/plugins/platforms/android/qandroidplatformwindow.h
index 9e3f203201..db3cb35368 100644
--- a/src/plugins/platforms/android/src/raster/qandroidplatformwindow.h
+++ b/src/plugins/platforms/android/qandroidplatformwindow.h
@@ -1,6 +1,7 @@
/****************************************************************************
**
-** Copyright (C) 2012 BogDan Vatra <bogdan@kde.org>
+** Copyright (C) 2014 BogDan Vatra <bogdan@kde.org>
+** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies).
** Contact: http://www.qt-project.org/legal
**
** This file is part of the plugins of the Qt Toolkit.
@@ -42,23 +43,45 @@
#ifndef ANDROIDPLATFORMWINDOW_H
#define ANDROIDPLATFORMWINDOW_H
#include <qobject.h>
-#include <QtPlatformSupport/private/qfbwindow_p.h>
+#include <qrect.h>
+#include <qpa/qplatformwindow.h>
-class QAndroidPlatformWindow: public QObject, public QFbWindow
+QT_BEGIN_NAMESPACE
+
+class QAndroidPlatformScreen;
+
+class QAndroidPlatformWindow: public QPlatformWindow
{
- Q_OBJECT
public:
explicit QAndroidPlatformWindow(QWindow *window);
- void propagateSizeHints();
-
+ void lower();
void raise();
- void setWindowState(Qt::WindowState state);
+
void setVisible(bool visible);
+
+ void setWindowState(Qt::WindowState state);
+ void setWindowFlags(Qt::WindowFlags flags);
+ Qt::WindowFlags windowFlags() const;
+
+ WId winId() const { return m_windowId; }
+
+ QAndroidPlatformScreen *platformScreen() const;
+
+ void propagateSizeHints();
+ void requestActivateWindow();
void updateStatusBarVisibility();
+ inline bool isRaster() const { return window()->surfaceType() == QSurface::RasterSurface; }
-public slots:
+protected:
void setGeometry(const QRect &rect);
+
+protected:
+ Qt::WindowFlags m_windowFlags;
+ Qt::WindowState m_windowState;
+
+ WId m_windowId;
};
+QT_END_NAMESPACE
#endif // ANDROIDPLATFORMWINDOW_H
diff --git a/src/plugins/platforms/android/src/qandroidsystemlocale.cpp b/src/plugins/platforms/android/qandroidsystemlocale.cpp
index a20f970a44..a20f970a44 100644
--- a/src/plugins/platforms/android/src/qandroidsystemlocale.cpp
+++ b/src/plugins/platforms/android/qandroidsystemlocale.cpp
diff --git a/src/plugins/platforms/android/src/qandroidsystemlocale.h b/src/plugins/platforms/android/qandroidsystemlocale.h
index fc2f6fad98..fc2f6fad98 100644
--- a/src/plugins/platforms/android/src/qandroidsystemlocale.h
+++ b/src/plugins/platforms/android/qandroidsystemlocale.h
diff --git a/src/plugins/platforms/android/raster/raster.pro b/src/plugins/platforms/android/raster/raster.pro
deleted file mode 100644
index 53d8ee7a2b..0000000000
--- a/src/plugins/platforms/android/raster/raster.pro
+++ /dev/null
@@ -1,19 +0,0 @@
-TARGET = qtforandroid
-
-PLUGIN_TYPE = platforms
-
-# STATICPLUGIN needed because there's a Q_IMPORT_PLUGIN in androidjnimain.cpp
-# Yes, the plugin imports itself statically
-DEFINES += QT_STATICPLUGIN
-
-load(qt_plugin)
-
-!contains(ANDROID_PLATFORM, android-9) {
- INCLUDEPATH += $$NDK_ROOT/platforms/android-9/arch-$$ANDROID_ARCHITECTURE/usr/include
- LIBS += -L$$NDK_ROOT/platforms/android-9/arch-$$ANDROID_ARCHITECTURE/usr/lib -ljnigraphics -landroid
-} else {
- LIBS += -ljnigraphics -landroid
-}
-
-include($$PWD/../src/src.pri)
-include($$PWD/../src/raster/raster.pri)
diff --git a/src/plugins/platforms/android/src/opengl/qandroidopenglplatformwindow.cpp b/src/plugins/platforms/android/src/opengl/qandroidopenglplatformwindow.cpp
deleted file mode 100644
index 6ed805174b..0000000000
--- a/src/plugins/platforms/android/src/opengl/qandroidopenglplatformwindow.cpp
+++ /dev/null
@@ -1,178 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies).
-** Contact: http://www.qt-project.org/legal
-**
-** This file is part of the plugins of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and Digia. For licensing terms and
-** conditions see http://qt.digia.com/licensing. For further information
-** use the contact form at http://qt.digia.com/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 2.1 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 2.1 requirements
-** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
-**
-** In addition, as a special exception, Digia gives you certain additional
-** rights. These rights are described in the Digia Qt LGPL Exception
-** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 3.0 as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU General Public License version 3.0 requirements will be
-** met: http://www.gnu.org/copyleft/gpl.html.
-**
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#include "qandroidopenglplatformwindow.h"
-#include "androidjnimain.h"
-#include "qandroidplatformintegration.h"
-#include <qpa/qwindowsysteminterface.h>
-
-QT_BEGIN_NAMESPACE
-
-EGLSurface QAndroidOpenGLPlatformWindow::m_staticSurface = 0;
-EGLNativeWindowType QAndroidOpenGLPlatformWindow::m_staticNativeWindow = 0;
-QReadWriteLock QAndroidOpenGLPlatformWindow::m_staticSurfaceLock;
-QBasicAtomicInt QAndroidOpenGLPlatformWindow::m_referenceCount = Q_BASIC_ATOMIC_INITIALIZER(0);
-
-QAndroidOpenGLPlatformWindow::QAndroidOpenGLPlatformWindow(QWindow *window)
- : QEglFSWindow(window)
- , m_state(Qt::WindowNoState)
-{
-}
-
-QAndroidOpenGLPlatformWindow::~QAndroidOpenGLPlatformWindow()
-{
- destroy();
-}
-
-bool QAndroidOpenGLPlatformWindow::isExposed() const
-{
- return QtAndroid::nativeWindow(false) != 0 && QEglFSWindow::isExposed();
-}
-
-void QAndroidOpenGLPlatformWindow::invalidateSurface()
-{
- QWindowSystemInterface::handleExposeEvent(window(), QRegion()); // Obscure event
- QWindowSystemInterface::flushWindowSystemEvents();
-
- m_window = 0;
- m_surface = 0;
-
- if (!m_referenceCount.deref()){
- QWriteLocker locker(&m_staticSurfaceLock);
-
- EGLDisplay display = (static_cast<QEglFSScreen *>(window()->screen()->handle()))->display();
- eglDestroySurface(display, m_staticSurface);
-
- m_staticSurface = 0;
- m_staticNativeWindow = 0;
- }
-}
-
-void QAndroidOpenGLPlatformWindow::updateStaticNativeWindow()
-{
- QWriteLocker locker(&m_staticSurfaceLock);
- m_staticNativeWindow = QtAndroid::nativeWindow(false);
-}
-
-void QAndroidOpenGLPlatformWindow::resetSurface()
-{
- // Only add a reference if we're not already holding one, otherwise we're just updating
- // the native window pointer
- if (m_window == 0)
- m_referenceCount.ref();
-
- if (m_staticSurface == 0) {
- QWriteLocker locker(&m_staticSurfaceLock);
- QEglFSWindow::resetSurface();
- m_staticSurface = m_surface;
- m_staticNativeWindow = m_window;
- } else {
- QReadLocker locker(&m_staticSurfaceLock);
- m_window = m_staticNativeWindow;
- m_surface = m_staticSurface;
- }
-
- {
- lock();
- // Use the desktop size.
- // On some devices, the getters for the native window size gives wrong values
- scheduleResize(QAndroidPlatformIntegration::defaultDesktopSize());
- QWindowSystemInterface::handleExposeEvent(window(), QRegion(geometry())); // Expose event
- unlock();
- }
-
- QWindowSystemInterface::flushWindowSystemEvents();
-}
-
-void QAndroidOpenGLPlatformWindow::destroy()
-{
- if (!m_referenceCount.deref()) {
- QEglFSWindow::destroy();
- } else {
- m_window = 0;
- m_surface = 0;
- }
-}
-
-void QAndroidOpenGLPlatformWindow::updateStatusBarVisibility()
-{
- Qt::WindowFlags flags = window()->flags();
- bool isNonRegularWindow = flags & (Qt::Popup | Qt::Dialog | Qt::Sheet) & ~Qt::Window;
- if (!isNonRegularWindow) {
- if (m_state & Qt::WindowFullScreen)
- QtAndroid::hideStatusBar();
- else if (m_state & Qt::WindowMaximized)
- QtAndroid::showStatusBar();
- }
-}
-
-void QAndroidOpenGLPlatformWindow::raise()
-{
- updateStatusBarVisibility();
-}
-
-void QAndroidOpenGLPlatformWindow::setWindowState(Qt::WindowState state)
-{
- if (m_state == state)
- return;
-
- m_state = state;
- if (window()->isVisible())
- updateStatusBarVisibility();
-}
-
-void QAndroidOpenGLPlatformWindow::setVisible(bool visible)
-{
- if (visible)
- updateStatusBarVisibility();
-
- QEglFSWindow::setVisible(visible);
-
- // The Android Activity is activated before Qt is initialized, causing the application state to
- // never be set to 'active'. We explicitly set this state when the first window becomes visible.
- if (visible)
- QtAndroid::setApplicationActive();
-
- QWindowSystemInterface::handleExposeEvent(window(), QRegion(geometry())); // Expose event
- QWindowSystemInterface::flushWindowSystemEvents();
-}
-
-QT_END_NAMESPACE
diff --git a/src/plugins/platforms/android/src/opengl/qeglfshooks_android.cpp b/src/plugins/platforms/android/src/opengl/qeglfshooks_android.cpp
deleted file mode 100644
index 278cd553f4..0000000000
--- a/src/plugins/platforms/android/src/opengl/qeglfshooks_android.cpp
+++ /dev/null
@@ -1,161 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2012 Digia Plc and/or its subsidiary(-ies).
-** Contact: http://www.qt-project.org/legal
-**
-** This file is part of the plugins of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and Digia. For licensing terms and
-** conditions see http://qt.digia.com/licensing. For further information
-** use the contact form at http://qt.digia.com/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 2.1 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 2.1 requirements
-** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
-**
-** In addition, as a special exception, Digia gives you certain additional
-** rights. These rights are described in the Digia Qt LGPL Exception
-** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 3.0 as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU General Public License version 3.0 requirements will be
-** met: http://www.gnu.org/copyleft/gpl.html.
-**
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#include "qeglfshooks.h"
-#include "androidjnimain.h"
-#include "qandroidplatformintegration.h"
-
-#include <android/native_window.h>
-#include <jni.h>
-
-QT_BEGIN_NAMESPACE
-
-class QEglFSAndroidHooks: public QEglFSHooks
-{
-public:
- void platformInit();
- void platformDestroy();
- EGLNativeDisplayType platformDisplay() const;
- QSize screenSize() const;
- QSizeF physicalScreenSize() const;
- QDpi logicalDpi() const;
- Qt::ScreenOrientation orientation() const;
- Qt::ScreenOrientation nativeOrientation() const;
- int screenDepth() const;
- QSurfaceFormat surfaceFormatFor(const QSurfaceFormat &inputFormat) const;
- EGLNativeWindowType createNativeWindow(QPlatformWindow *platformWindow, const QSize &size, const QSurfaceFormat &format);
- void destroyNativeWindow(EGLNativeWindowType window);
- bool hasCapability(QPlatformIntegration::Capability cap) const;
- QEglFSCursor *createCursor(QEglFSScreen *screen) const;
-};
-
-void QEglFSAndroidHooks::platformInit()
-{
-}
-
-void QEglFSAndroidHooks::platformDestroy()
-{
-}
-
-EGLNativeDisplayType QEglFSAndroidHooks::platformDisplay() const
-{
- return EGL_DEFAULT_DISPLAY;
-}
-
-QSize QEglFSAndroidHooks::screenSize() const
-{
- return QAndroidPlatformIntegration::defaultDesktopSize();
-}
-
-QSizeF QEglFSAndroidHooks::physicalScreenSize() const
-{
- return QSizeF(QAndroidPlatformIntegration::m_defaultPhysicalSizeWidth, QAndroidPlatformIntegration::m_defaultPhysicalSizeHeight);
-}
-
-QDpi QEglFSAndroidHooks::logicalDpi() const
-{
- qreal lDpi = QtAndroid::scaledDensity() * 72;
- return QDpi(lDpi, lDpi);
-}
-
-Qt::ScreenOrientation QEglFSAndroidHooks::orientation() const
-{
- return QAndroidPlatformIntegration::m_orientation;
-}
-
-Qt::ScreenOrientation QEglFSAndroidHooks::nativeOrientation() const
-{
- return QAndroidPlatformIntegration::m_nativeOrientation;
-}
-
-EGLNativeWindowType QEglFSAndroidHooks::createNativeWindow(QPlatformWindow *platformWindow, const QSize &size, const QSurfaceFormat &format)
-{
- Q_UNUSED(platformWindow);
- Q_UNUSED(size);
- Q_UNUSED(format);
- ANativeWindow *window = QtAndroid::nativeWindow();
- if (window != 0)
- ANativeWindow_acquire(window);
-
- return window;
-}
-
-void QEglFSAndroidHooks::destroyNativeWindow(EGLNativeWindowType window)
-{
- if (window != 0)
- ANativeWindow_release(window);
-}
-
-bool QEglFSAndroidHooks::hasCapability(QPlatformIntegration::Capability capability) const
-{
- switch (capability) {
- case QPlatformIntegration::OpenGL: return true;
- case QPlatformIntegration::ThreadedOpenGL: return true;
- default: return false;
- };
-}
-
-int QEglFSAndroidHooks::screenDepth() const
-{
- // ### Hardcoded
- return 32;
-}
-
-QSurfaceFormat QEglFSAndroidHooks::surfaceFormatFor(const QSurfaceFormat &inputFormat) const
-{
- QSurfaceFormat ret(inputFormat);
- ret.setAlphaBufferSize(8);
- ret.setRedBufferSize(8);
- ret.setGreenBufferSize(8);
- ret.setBlueBufferSize(8);
- return ret;
-}
-
-QEglFSCursor *QEglFSAndroidHooks::createCursor(QEglFSScreen *screen) const
-{
- Q_UNUSED(screen);
- return 0;
-}
-
-static QEglFSAndroidHooks eglFSAndroidHooks;
-QEglFSHooks *platformHooks = &eglFSAndroidHooks;
-
-QT_END_NAMESPACE
diff --git a/src/plugins/platforms/android/src/raster/qandroidplatformscreen.cpp b/src/plugins/platforms/android/src/raster/qandroidplatformscreen.cpp
deleted file mode 100644
index 2e59c307c3..0000000000
--- a/src/plugins/platforms/android/src/raster/qandroidplatformscreen.cpp
+++ /dev/null
@@ -1,94 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2012 BogDan Vatra <bogdan@kde.org>
-** Contact: http://www.qt-project.org/legal
-**
-** This file is part of the plugins of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and Digia. For licensing terms and
-** conditions see http://qt.digia.com/licensing. For further information
-** use the contact form at http://qt.digia.com/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 2.1 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 2.1 requirements
-** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
-**
-** In addition, as a special exception, Digia gives you certain additional
-** rights. These rights are described in the Digia Qt LGPL Exception
-** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 3.0 as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU General Public License version 3.0 requirements will be
-** met: http://www.gnu.org/copyleft/gpl.html.
-**
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#include "qandroidplatformscreen.h"
-#include "qandroidplatformintegration.h"
-#include "androidjnimain.h"
-#include "androidjnimenu.h"
-#include "qandroidplatformwindow.h"
-
-QAndroidPlatformScreen::QAndroidPlatformScreen():QFbScreen()
-{
- mGeometry = QRect(0, 0, QAndroidPlatformIntegration::m_defaultGeometryWidth, QAndroidPlatformIntegration::m_defaultGeometryHeight);
- mFormat = QImage::Format_RGB16;
- mDepth = 16;
- mPhysicalSize.setHeight(QAndroidPlatformIntegration::m_defaultPhysicalSizeHeight);
- mPhysicalSize.setWidth(QAndroidPlatformIntegration::m_defaultPhysicalSizeWidth);
- initializeCompositor();
-}
-
-void QAndroidPlatformScreen::topWindowChanged(QWindow *w)
-{
- QtAndroidMenu::setActiveTopLevelWindow(w);
-
- if (w != 0) {
- QAndroidPlatformWindow *platformWindow = static_cast<QAndroidPlatformWindow *>(w->handle());
- if (platformWindow != 0)
- platformWindow->updateStatusBarVisibility();
- }
-}
-
-QRegion QAndroidPlatformScreen::doRedraw()
-{
- QRegion touched;
- touched = QFbScreen::doRedraw();
- if (touched.isEmpty())
- return touched;
-
- QtAndroid::flushImage(mGeometry.topLeft(), *mScreenImage, touched.boundingRect());
- return touched;
-}
-
-QDpi QAndroidPlatformScreen::logicalDpi() const
-{
- qreal lDpi = QtAndroid::scaledDensity() * 72;
- return QDpi(lDpi, lDpi);
-}
-
-Qt::ScreenOrientation QAndroidPlatformScreen::orientation() const
-{
- return QAndroidPlatformIntegration::m_orientation;
-}
-
-Qt::ScreenOrientation QAndroidPlatformScreen::nativeOrientation() const
-{
- return QAndroidPlatformIntegration::m_nativeOrientation;
-}
diff --git a/src/plugins/platforms/android/src/raster/raster.pri b/src/plugins/platforms/android/src/raster/raster.pri
deleted file mode 100644
index 86e5aa235f..0000000000
--- a/src/plugins/platforms/android/src/raster/raster.pri
+++ /dev/null
@@ -1,7 +0,0 @@
-INCLUDEPATH += $$PWD
-
-SOURCES += $$PWD/qandroidplatformscreen.cpp \
- $$PWD/qandroidplatformwindow.cpp
-
-HEADERS += $$PWD/qandroidplatformscreen.h \
- $$PWD/qandroidplatformwindow.h
diff --git a/src/plugins/platforms/android/src/src.pri b/src/plugins/platforms/android/src/src.pri
deleted file mode 100644
index 9b64e846f7..0000000000
--- a/src/plugins/platforms/android/src/src.pri
+++ /dev/null
@@ -1,55 +0,0 @@
-load(qt_plugin)
-
-QT += core-private gui-private platformsupport-private
-
-CONFIG += qpa/genericunixfontdatabase
-
-OTHER_FILES += $$PWD/android.json
-
-INCLUDEPATH += $$PWD
-INCLUDEPATH += $$PWD/../../../../3rdparty/android/src
-
-SOURCES += $$PWD/androidplatformplugin.cpp \
- $$PWD/androidjnimain.cpp \
- $$PWD/androidjniaccessibility.cpp \
- $$PWD/androidjniinput.cpp \
- $$PWD/androidjnimenu.cpp \
- $$PWD/androidjniclipboard.cpp \
- $$PWD/qandroidplatformintegration.cpp \
- $$PWD/qandroidplatformservices.cpp \
- $$PWD/qandroidassetsfileenginehandler.cpp \
- $$PWD/qandroidinputcontext.cpp \
- $$PWD/qandroidplatformaccessibility.cpp \
- $$PWD/qandroidplatformfontdatabase.cpp \
- $$PWD/qandroidplatformdialoghelpers.cpp \
- $$PWD/qandroidplatformclipboard.cpp \
- $$PWD/qandroidplatformtheme.cpp \
- $$PWD/qandroidplatformmenubar.cpp \
- $$PWD/qandroidplatformmenu.cpp \
- $$PWD/qandroidplatformmenuitem.cpp \
- $$PWD/qandroidsystemlocale.cpp
-
-
-HEADERS += $$PWD/qandroidplatformintegration.h \
- $$PWD/androidjnimain.h \
- $$PWD/androidjniaccessibility.h \
- $$PWD/androidjniinput.h \
- $$PWD/androidjnimenu.h \
- $$PWD/androidjniclipboard.h \
- $$PWD/qandroidplatformservices.h \
- $$PWD/qandroidassetsfileenginehandler.h \
- $$PWD/qandroidinputcontext.h \
- $$PWD/qandroidplatformaccessibility.h \
- $$PWD/qandroidplatformfontdatabase.h \
- $$PWD/qandroidplatformclipboard.h \
- $$PWD/qandroidplatformdialoghelpers.h \
- $$PWD/qandroidplatformtheme.h \
- $$PWD/qandroidplatformmenubar.h \
- $$PWD/qandroidplatformmenu.h \
- $$PWD/qandroidplatformmenuitem.h \
- $$PWD/qandroidsystemlocale.h
-
-
-#Non-standard install directory, QTBUG-29859
-DESTDIR = $$DESTDIR/android
-target.path = $${target.path}/android