Commit Graph

12230 Commits

Author SHA1 Message Date
Richard Moe Gustavsen
a1c9f56552 iOS: update QPlatformWindow::geometry() when UIView changes size
It turns out that QWindow::geometry needs to be updated manually
by the platform plugin, and not indirectly trough
QWindowSystemInterface::handleGeometryChange as first assumed.
We now always report the _actual_ geometry of the UIView (which
also takes the status bar into account) to QWindow, and remember
the _requested_ geometry of the window to use whenever the state
of the window changes.

Change-Id: Iea940173d26fb6af701234379cae914215dae984
Reviewed-by: Tor Arne Vestbø <tor.arne.vestbo@digia.com>
2013-02-27 23:55:50 +01:00
Richard Moe Gustavsen
b1cfa62ff4 iOS: let fullscreen geometry take orientation into account
Since UIScreen is orientation agnostic, we need to look at the
view of the top level view controller instead to determine
available geometry.

Change-Id: I3789ab7972a9970e46fbc8af81f2b7199e5ca5d1
Reviewed-by: Tor Arne Vestbø <tor.arne.vestbo@digia.com>
2013-02-27 23:55:49 +01:00
Richard Moe Gustavsen
0d9a50380c iOS: when in fullscreen, autoresize the view when the device rotates
Tell the view that backs QWindow to autoresize itself when
the superview (view of the root view controller) changes size.
This will typically happen when the device changes orientation.

Change-Id: Ib7c4dff9112d57f60012d3f0837677e09088bcaf
Reviewed-by: Tor Arne Vestbø <tor.arne.vestbo@digia.com>
2013-02-27 23:55:49 +01:00
Richard Moe Gustavsen
2d4e96352a iOS: one 'transform' warning per window is sufficient
The layoutSubviews function will be called when the geometry
changes, and we will catch the transform issue there for
both UC1 and UC2

Change-Id: I29578bbc5b3091c86fbe69c7095ff280a64be458
Reviewed-by: Tor Arne Vestbø <tor.arne.vestbo@digia.com>
2013-02-27 23:55:49 +01:00
Richard Moe Gustavsen
3a59fc4c97 iOS: when in fullscreen, dont respond to geometry changes
When QWindow is told to be in fullscreen, we should not
respond to geometry changes. Instead we should bookkeep
the requested geometry and set it when/if the window
enters Qt::WindowNoState later.

Change-Id: Ieaf4756b2a966212c8e1738af9df175a58786a75
Reviewed-by: Tor Arne Vestbø <tor.arne.vestbo@digia.com>
2013-02-27 23:55:48 +01:00
Tor Arne Vestbø
189503933a iOS: Enable the ShowIsFullScreen style-hint so that show() implies fullscreen
We may need to qualify this setting for UC2, so that the user may still
create windows as sub-controls of a regular iOS user interface, but for
UC1 it makes sense.

Change-Id: I1a7019f901fabed8b5b9cbb18a929913780e6595
Reviewed-by: Richard Moe Gustavsen <richard.gustavsen@digia.com>
Reviewed-by: Morten Johan Sørvig <morten.sorvig@digia.com>
2013-02-27 23:55:48 +01:00
Tor Arne Vestbø
599c7a5ab9 iOS: Set initial window state on window creation
When showing a QWindow the window state is set first, and then the window
is made visible. The latter is the step that creates the platform window,
so we need to pick up the already set window state in our constructor
and respect that.

Change-Id: I54fe6c4ebcd3c9504614d2d48bd21f0d76adf3b7
Reviewed-by: Richard Moe Gustavsen <richard.gustavsen@digia.com>
2013-02-27 23:55:47 +01:00
Tor Arne Vestbø
5d878cae1d iOS: Remove requestWindowOrientation from QIOSWindow
The API is scheduled to be removed in qtbase in time for Qt 5.0.

Change-Id: Ie34d6cb79fcd81b0ce02892529e3e7184ddfa096
Reviewed-by: Richard Moe Gustavsen <richard.gustavsen@digia.com>
2013-02-27 23:55:47 +01:00
Morten Johan Sørvig
ad4cf5068c iOS: Don't recreate paint device on beginPaint()
This causes painting errors. Use one lazily-created
device that is used for the lifetime of the backing
store.

Change-Id: Ib36b6f1d6c9f958304dc8403cf17e5d71136469a
Reviewed-by: Tor Arne Vestbø <tor.arne.vestbo@digia.com>
2013-02-27 23:55:47 +01:00
Richard Moe Gustavsen
7f7d752012 iOS: use 'self' rather than 'super' pointer in initWithQIOSWindow
If we use super, our own initWithFrame override will never be
called.

Change-Id: I606beb653239cdfc46f41db4ec0791dfa5d4edea
Reviewed-by: Tor Arne Vestbø <tor.arne.vestbo@digia.com>
2013-02-27 23:55:46 +01:00
Richard Moe Gustavsen
55f0bce094 iOS: implement requestWindowOrientation
The application is normally supposed to rotate the content on its
own, but can call requestWindowOrientation to ask the window
manager to do it instead. This way of integrating orientation with
the OS is fragile, because:
1. In some cases, you cannot stop the OS from rotating at all
    (tablets).
2. It would be more safe to inform the window manager up-front
    which orientations it could rotate into, rather that relying
    on a function you call call to force this later on.
3. When the QML application starts, its a bit late to inform
    the platform plugin that it supports e.g landscape. If the
    OS is in landscape already, the plugin must still assume that
    the app operates in portrait (doing rotating on its own) until
    requestWindowOrientation is called. This might cause the app
    to first start up in portrait, just to rotate into landscape.

On iOS, it seems like we can handle the first two cases. The third
need some more investigation. We should anyway investigate if we
need some adjustment to the Qt API.

Change-Id: I50638b78d469ab70820a787de86a2f1981470786
Reviewed-by: Tor Arne Vestbø <tor.arne.vestbo@digia.com>
2013-02-27 23:55:46 +01:00
Richard Moe Gustavsen
575d28a6fd iOS: handle content orientation feedback from application
Change-Id: I2bfb4ee4840086dcd3ec85c2ee7e8769e76d2700
Reviewed-by: Tor Arne Vestbø <tor.arne.vestbo@digia.com>
2013-02-27 23:55:46 +01:00
Richard Moe Gustavsen
fa731cddd1 iOS: add QIOSViewController
We need our own viewcontroller to better control which
orientations iOS can enter, and also ito be able to
stop auto-rotation.

We stop auto-rotation to happend by default, since this is
how Qt wants it (it is seen as the responsibility of the
application).

Change-Id: Id07a96e355396752fffd28984af528aeb0b7c3e3
Reviewed-by: Tor Arne Vestbø <tor.arne.vestbo@digia.com>
2013-02-27 23:55:45 +01:00
Richard Moe Gustavsen
72f66a8ee5 iOS: add function convertToUIOrientation
Change-Id: I6145121d49eb3f5bab3f2a1ba57c779ec0b01023
Reviewed-by: Tor Arne Vestbø <tor.arne.vestbo@digia.com>
2013-02-27 23:55:45 +01:00
Richard Moe Gustavsen
92252bcb93 iOS: let QIOSScreen start/stop listening for device orientation
From the qpa docs, we only need to listen for device orientation
if orientationUpdateMask is non-zero

Change-Id: Id5e828cdff9a08794c8a029e11763cc037e1b959
Reviewed-by: Tor Arne Vestbø <tor.arne.vestbo@digia.com>
2013-02-27 23:55:45 +01:00
Richard Moe Gustavsen
b3eccb0c15 iOS: add QIOSOrientationListener
QIOSScreen will use this to listen for orientation
changes from UIDevice.

Change-Id: I5a30f3808f8b9b885303608ce2fc1316c962898b
Reviewed-by: Tor Arne Vestbø <tor.arne.vestbo@digia.com>
2013-02-27 23:55:44 +01:00
Richard Moe Gustavsen
9d2e623451 iOS: insert Digia license headers
Remove Nokia.

Change-Id: Iec7095ef4e3099453b6103814e826039b377ecce
Reviewed-by: Tor Arne Vestbø <tor.arne.vestbo@digia.com>
2013-02-27 23:55:44 +01:00
Tor Arne Vestbø
f124e098ce iOS: Set PLUGIN_TYPE = platforms before loading(qt_plugins)
This takes care of setting INSTALLS for us, so we can skip that.

Change-Id: I351cb9ec08b632fd9867d85e2c5fa59d8e5acc9d
Reviewed-by: Richard Moe Gustavsen <richard.gustavsen@digia.com>
2013-02-27 23:55:43 +01:00
Tor Arne Vestbø
d8b3465dd3 iOS: Don't use IOKit in QTestLib, it's a private framework on iOS
Change-Id: I271a480b79c7768942911a28c84d6bb5a8d840d3
Reviewed-by: Richard Moe Gustavsen <richard.gustavsen@digia.com>
2013-02-27 23:55:43 +01:00
Tor Arne Vestbø
e71ca36161 iOS: Ensure UIApplicationMain is started before QApplication by wrapping main()
For the typical Qt app the developer will have an existing main() that
looks something like:

int main(int argc, char *argv[])
{
    QGuiApplication app(argc, argv);

    return app.exec();
}

To support this, we provide our own 'main' function in the
qtmain static library that we link into the application, which calls
UIApplicationMain and redirects to the 'main' function of the application
after the event loop has started spinning. For this to work, the applications
'main' function needs to manually be renamed 'qt_main' for now. In a later
patch, this renaming will happen automatically by redefining main from either a
header file, or more likely, from the Makefile created by qmake.

For the case of an iOS developer wanting to use Qt in their existing app
the main will look something like:

int main(int argc, char *argv[])
{
    @autoreleasepool {
        return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));
    }
}

This is supported right now by just linking in libqios.a without libqiosmain.a.
QGuiApplication should then be created e.g inside the native apps application
delegate (but QGuiApplication::exec should not be called).

In the future, we plan to but use a wrapper library that
brings in all the Qt dependencies into one single static library. This library will
not link against qtmain, so there won't be a symbol clash if the -ObjC linker option
is used. We should then add the required magic to the future Objective-C convenience
wrapper for QML to bring up a QGuiApplication, which would allow using Qt from
storyboards and NIBs. This would also be the place to inject our own
application delegate into the mix, while proxying the delegate callbacks
to the user's application delegate.

Change-Id: Iba5ade114b27216be8285f36100fd735a08b9d59
Reviewed-by: Tor Arne Vestbø <tor.arne.vestbo@digia.com>
Reviewed-by: Richard Moe Gustavsen <richard.gustavsen@digia.com>
2013-02-27 23:55:42 +01:00
Tor Arne Vestbø
3241f37711 iOS: Implement QPlatformWindow::setWindowState()
In both maximized and fullscreen modes we assume that we can use the
availableGeometry() of the QScreen, but of course this depends on us
showing or hiding the statusbar first, as well as QScreen actually
returning the right availableGeometry when the statusbar is shown.
The latter is not the case right now, as we initialize QScreen before
UIApplication has been set up and UIScreen has had a chance to init
itself based on the precense of a statusbar or not.

Change-Id: Id44dee3550f7135ffe2852b377bb6c7b6d522d68
Reviewed-by: Richard Moe Gustavsen <richard.gustavsen@digia.com>
2013-02-27 23:55:42 +01:00
Tor Arne Vestbø
e123056c47 iOS: Implement QIOSWindow::setGeometry() and pick up UIView geometry changes
The best way to pick up geometry changes of the UIView seems to be to override
layoutSubviews(), but that will only be called if the size of the UIView
changes, not when the position (center) changes. This means that the position
reflected by the QWindow will not always be in sync with the position of the
native UIView. Fortunately the position of a QWindow is not used for anything
critical in Qt itself.

Another issue is that the frame property of a UIView is only valid if the
transform of the UIView is set to the identity transform. We try to catch
cases where this is not the case, and warn the user about this. We could
in theory react to changes in the UIView geometry by only updating the
size, since this is also reflected through the bounds property of the
UIView. This is left for when we know more about how these things
interact in practice.

Change-Id: I079162c059d377a77569fe3974e261d2e0671fd5
Reviewed-by: Richard Moe Gustavsen <richard.gustavsen@digia.com>
2013-02-27 23:55:42 +01:00
Tor Arne Vestbø
3d81b43aa4 iOS: Implement QPlatformScreen::availableGeometry()
This will sadly not work as expected until we've found a way to kick
off the iOS event loop before QApplication is initialized, as UIScreen
does not seem to report the correct applicationFrame (taking the status
bar into account) until after the UIApplication has been set up by
UIApplicationMain().

Change-Id: I0eaa3b8bca4129d1c4183a202ad2ecd0d8bc52d0
Reviewed-by: Richard Moe Gustavsen <richard.gustavsen@digia.com>
2013-02-27 23:55:41 +01:00
Morten Johan Sorvig
8d7238f57e iOS: Use default createPlatformPixmap implementation
No need to implement this one, the standard implementation
creates a raster pixmap.

Change-Id: I9bb25188bd95159d76e760b2be6870e0bede7b56
Reviewed-by: Richard Moe Gustavsen <richard.gustavsen@digia.com>
2013-02-27 23:55:41 +01:00
Richard Moe Gustavsen
e936561a16 iOS: Add Q_IMPORT_PLUGIN(QIOSIntegrationPlugin) into the plugin itself
Since the plugin will always be linked in statically, we add this
necessary registration code into the plugin itself rather than
putting this burden onto the client application.

Change-Id: I8691d8080e41bdf0644bb960b5c7102e79a0f0d5
Reviewed-by: Tor Arne Vestbø <tor.arne.vestbo@digia.com>
2013-02-27 23:55:41 +01:00
Tor Arne Vestbø
3bc6d7470a iOS: Pass QWindow geometry to initWithFrame on window creation
Allows the optimal pattern of setting the geometry of the QWindow
before showing (and hence creating) it.

Change-Id: I29206b5d9a70df0b01e8df8f7df8f35cced51121
Reviewed-by: Richard Moe Gustavsen <richard.gustavsen@digia.com>
2013-02-27 23:55:40 +01:00
Tor Arne Vestbø
231796c98d iOS: Set background color of UIWindow and root UIView to burn your eyes
Convenient to aid debugging during development of the platform plugin.

Change-Id: Id429ca95e0452385ee8def1fe4a1bb7de175ba3e
Reviewed-by: Richard Moe Gustavsen <richard.gustavsen@digia.com>
2013-02-27 23:55:40 +01:00
Tor Arne Vestbø
caacccaaf0 iOS: Unset EAGL context if it's current when destroying QIOSContext
Change-Id: Ie0b27e6b0dafa2a7283b44d6676871fce15cc42a
Reviewed-by: Richard Moe Gustavsen <richard.gustavsen@digia.com>
2013-02-27 23:55:39 +01:00
Richard Moe Gustavsen
6bbe89e2b8 iOS: support stand-alone qApp->processEvents calls
Rough implementation to support stand-alone processEvent calls. We
probably need to revisit this code to fix corner-cases later on.

Change-Id: I72d5639dab599b4d0017aaa52b922f4185a50337
Reviewed-by: Tor Arne Vestbø <tor.arne.vestbo@digia.com>
2013-02-27 23:55:39 +01:00
Richard Moe Gustavsen
0dbee6a5e1 iOS: send mouse events (from touch events) from EAGLView
Change-Id: Ia6c955f2c5bcde8e41d5908bfb8fd52bd449b3ec
Reviewed-by: Tor Arne Vestbø <tor.arne.vestbo@digia.com>
2013-02-27 23:55:39 +01:00
Richard Moe Gustavsen
ea1e5ccd62 iOS: implement QEventLoop support in the event dispatcher
With this patch you can now expect the following code to work:

QEventLoop l;
QTimer::singleShot(1000, &l, SLOT(quit()));
l.exec();

Change-Id: Ic73e37affaadf8a859787d84ac02c15621ac7a29
Reviewed-by: Tor Arne Vestbø <tor.arne.vestbo@digia.com>
2013-02-27 23:55:38 +01:00
Richard Moe Gustavsen
19de726725 iOS: create top-level UIWindow and UIViewController
Create a UIWIndow with a view controller and a view
where we can reparent our QIOSWindow views inside.

Change-Id: Ic90707d3ebe1af970a3aa2aa0f8c0f4be192456a
Reviewed-by: Tor Arne Vestbø <tor.arne.vestbo@digia.com>
2013-02-27 23:55:38 +01:00
Tor Arne Vestbø
09187f602c iOS: Implement QIOSBackingStore in terms of a QOpenGLPaintDevice
We build on top of the QPlatformOpenGLContext implementation to get
automatic support for QBackingStore-based painting. Since the OpenGL
renderer does not clear the backingstore between frames, we actually
also get support for partial updates, and we get the benefit of an
accelerated paint engine for Qt Quick 1 without setting a GLWidget
as the viewport, which would cause issues such as an extra QWindow.

This patch also removes the dependency to QtOpenGL and QtWidgets, which
were leftovers from the Qt4 platform plugin. In Qt5 the needed GL bits
are in QtGui.

Change-Id: Id9b736bfb2e4aec56c0fa9f5b7b4d8bff8e3d1dc
Reviewed-by: Richard Moe Gustavsen <richard.gustavsen@digia.com>
2013-02-27 23:55:37 +01:00
Tor Arne Vestbø
3c4f48f9e2 iOS: Implement QPlatformOpenGLContext
The iOS platform GL context is an EAGLContext, which is wrapped by
the new class QIOSContext. The class takes care of makeCurrent()
and swapBuffers(), but defers framebuffer management to the
corresponding QIOSWindow.

At the moment only a single framebuffer is created, and changing the
geometry of the QWindow does not trigger any sort of invalidation of
the buffers.

The implementation assumes OpenGL ES2.x support. Though strictly
speaking we could support ES1 for QtGui, it serves little purpose
as Qt Quick 2 requires ES2.

This patch also disabled touch event synthesization until we have
figured out where we will maintain the connection to UIWindow.

QPlatformOpenGLContext::getProcAddress() for getting extensions is
implemented by using dlsym() to look up the symbol. This should not
present any issues for App Store deployment, like dlopen() would.

Change-Id: I166f800f3ecc0d180133c590465371ac1642b0ec
Reviewed-by: Richard Moe Gustavsen <richard.gustavsen@digia.com>
2013-02-27 23:55:37 +01:00
Richard Moe Gustavsen
ac8d906a3a iOS: support killing timers
Implement the remaining timer functions in the event dispatcher

Change-Id: Ie323962c898a2ee95ea60a8ca63b93cbd4544fd1
Reviewed-by: Tor Arne Vestbø <tor.arne.vestbo@digia.com>
2013-02-27 23:55:37 +01:00
Richard Moe Gustavsen
458382f35b iOS: call UIApplicationMain from event dispatcher, and add application delegate
This change will let you call QApplication::exec() instead of UiApplicationMain
from main. Also added an application delegate that we will need sooner
or later for catching application activation events.

Change-Id: I4edba5ce2059a804782d67c160755fc0e2e5267d
Reviewed-by: Tor Arne Vestbø <tor.arne.vestbo@digia.com>
2013-02-27 23:55:36 +01:00
Tor Arne Vestbø
05d0f60ebe iOS: Flesh out initial QPlatformScreen implementation
We check the device's model identifier to tweak the screen values based
on the precense of older iPhone/iPod touch models, or the iPad Mini.
This does not work when running under the simulator, which reports its
model identifier as the architecture of the host platform. There doesn't
appear to be any APIs to get the simulated device of the simulator, but
if this becomes an issue we can always look at the UIDevice model and
screen resolution and apply a few heuristics.

We do not update the screen geometry on orientation-changes. This matches
what UIScreen reports for bounds, but may not be the most intuitive solution
from a Qt perspective compared to the way other platform-plugins work.

Change-Id: I74783e053601de9ce805f8b52b944c116f9a1e3e
Reviewed-by: Richard Moe Gustavsen <richard.gustavsen@digia.com>
Reviewed-by: Morten Johan Sørvig <morten.sorvig@digia.com>
2013-02-27 23:55:36 +01:00
Tor Arne Vestbø
44c3ef790e iOS: Fix build on case sensitive filesystems
Change-Id: Ic7a2b38ffcc2bd83e268c5caf5bec17006879969
Reviewed-by: Richard Moe Gustavsen <richard.gustavsen@digia.com>
2013-02-27 23:55:36 +01:00
Richard Moe Gustavsen
407cf7341e iOS: QIOSEventDispatcher: implement timer support
Change-Id: I1966a64e6535f32005681db37b4fe5d89dafc70c
Reviewed-by: Tor Arne Vestbø <tor.arne.vestbo@digia.com>
2013-02-27 23:55:35 +01:00
Richard Moe Gustavsen
145abdc442 iOS: QIOSEventDispatcher: add runloop source for processing events
Change-Id: I6cd649a493dab9a982d71921f19d2a9252fc14b0
Reviewed-by: Tor Arne Vestbø <tor.arne.vestbo@digia.com>
2013-02-27 23:55:35 +01:00
Tor Arne Vestbø
a685df0584 iOS: Add ability to get the UIView for a QWindow through QPlatformNativeInterface
Change-Id: Iab2742bbaa97ff345871ad07ef0162b12248506a
Reviewed-by: Richard Moe Gustavsen <richard.gustavsen@digia.com>
2013-02-27 23:55:34 +01:00
Tor Arne Vestbø
422eed16eb iOS: Style nitpicking, rename m_fontDb to m_fontDatabase
Change-Id: I9d92843af9018d51b73fadcc7c20d792fad772fa
Reviewed-by: Richard Moe Gustavsen <richard.gustavsen@digia.com>
2013-02-27 23:55:34 +01:00
Tor Arne Vestbø
5e85aa9ab4 iOS: Keep UIScreen* for current QIOSScreen instead of looking up each time
Also, add enum for screen numbers, for better code readability.

Change-Id: Id5162c34e80ff5efb149ae86b49f51df183d1c1d
Reviewed-by: Richard Moe Gustavsen <richard.gustavsen@digia.com>
2013-02-27 23:55:34 +01:00
Tor Arne Vestbø
14e93f7e8e iOS: Add screen like other platform plugins
We may add support for external displays at a later point, but for now
we follow the same pattern as the other platform plugins. Either way we
should call screenAdded() to let the platform integration know about the
screen.

Change-Id: Id01785a5262df0180caf957c7de8ecbbf169f233
Reviewed-by: Richard Moe Gustavsen <richard.gustavsen@digia.com>
2013-02-27 23:55:33 +01:00
Tor Arne Vestbø
6d36a83b41 iOS: Get rid of singleton instance accessor in platform plugin
None of the other platform plugins have one, and it's not used anywhere.

Change-Id: Id46ab5f75c9819511c3e9d123d0338c3c8799869
Reviewed-by: Richard Moe Gustavsen <richard.gustavsen@digia.com>
2013-02-27 23:55:33 +01:00
Tor Arne Vestbø
3020d06fdb iOS: Change member variable style to be consistent with Qt's de facto standard
Change-Id: Idd65ad9cbb77114466c5b69a799b98a7fee5068f
Reviewed-by: Richard Moe Gustavsen <richard.gustavsen@digia.com>
2013-02-27 23:55:33 +01:00
Tor Arne Vestbø
9c8ce6afb0 iOS: Don't add to OBJECTIVE_HEADERS, there's no such thing
We should add to HEADERS, so that moc will realize it needs to run on
the headers.

Change-Id: I582e989e4faf0835c4bf9a677cbd8ac075559319
Reviewed-by: Morten Johan Sørvig <morten.sorvig@digia.com>
2013-02-27 23:55:32 +01:00
Tor Arne Vestbø
8c00149078 iOS: Don't include QtPrintSupport dialogs on iOS
It pulls in a dependency on Cocoa.

Change-Id: I293063adfdef8b92f80ffda0c66ac6e6d12958ff
Reviewed-by: Richard Moe Gustavsen <richard.gustavsen@digia.com>
2013-02-27 23:55:32 +01:00
Tor Arne Vestbø
c7fbff7bf2 iOS: Add required public dependencies of the CoreText font database
CoreText and CoreGraphics are available on iOS as stand-alone
frameworks, but on Mac OS X they are part of the ApplicationServices
umbrella framework.

Mac OS 10.8 actually introduced both as stand-alone frameworks,
but for simplicity we link to ApplicationServices, as there's
still symlinks from ApplicationServices to the real frameworks.

Change-Id: I7f7ef795629cc37da85857d5c42283754acc4474
Reviewed-by: Richard Moe Gustavsen <richard.gustavsen@digia.com>
2013-02-27 23:54:56 +01:00
Richard Moe Gustavsen
f6dc54ded4 iOS: network should not link against CoreServices on iOS
Change-Id: Ia3e21a3d73f696f0e77c427bdb263333646c48d3
Reviewed-by: Tor Arne Vestbø <tor.arne.vestbo@digia.com>
2013-02-27 13:07:25 +01:00