iOS: add support for Qt::ApplicationStates

Change-Id: I39858fe835c131d5c681db535f2ec9308e2f8223
Reviewed-by: Tor Arne Vestbø <tor.arne.vestbo@digia.com>
This commit is contained in:
Richard Moe Gustavsen 2013-06-14 12:53:46 +02:00 committed by The Qt Project
parent 241ba7dc07
commit 5656e6969f
5 changed files with 229 additions and 0 deletions

View File

@ -15,6 +15,7 @@ OBJECTIVE_SOURCES = \
qiosscreen.mm \
qiosbackingstore.mm \
qiosapplicationdelegate.mm \
qiosapplicationstate.mm \
qiosviewcontroller.mm \
qioscontext.mm \
qiosinputcontext.mm \
@ -27,6 +28,7 @@ HEADERS = \
qiosscreen.h \
qiosbackingstore.h \
qiosapplicationdelegate.h \
qiosapplicationstate.h \
qiosviewcontroller.h \
qioscontext.h \
qiosinputcontext.h \

View File

@ -0,0 +1,60 @@
/****************************************************************************
**
** 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 QIOSAPPLICATIONSTATE_H
#define QIOSAPPLICATIONSTATE_H
QT_BEGIN_NAMESPACE
@class QIOSApplicationStateListener;
class QIOSApplicationState
{
public:
QIOSApplicationState();
~QIOSApplicationState();
private:
QIOSApplicationStateListener *m_listener;
};
QT_END_NAMESPACE
#endif

View File

@ -0,0 +1,162 @@
/****************************************************************************
**
** 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$
**
****************************************************************************/
#import <UIKit/UIKit.h>
#include <qpa/qwindowsysteminterface.h>
#include "qiosapplicationstate.h"
@interface QIOSApplicationStateListener : NSObject
@end
@implementation QIOSApplicationStateListener
- (id) init
{
self = [super init];
if (self) {
// Listen for application state changes.
// Note: We use notifications rather than application delegate callbacks to
// also support hybrid applications were QIOSApplicationDelegate is not in use.
[[NSNotificationCenter defaultCenter]
addObserver:self
selector:@selector(applicationDidBecomeActive)
name:UIApplicationDidBecomeActiveNotification
object:nil];
[[NSNotificationCenter defaultCenter]
addObserver:self
selector:@selector(applicationWillResignActive)
name:UIApplicationWillResignActiveNotification
object:nil];
[[NSNotificationCenter defaultCenter]
addObserver:self
selector:@selector(applicationDidEnterBackground)
name:UIApplicationDidEnterBackgroundNotification
object:nil];
}
return self;
}
- (void) dealloc
{
[[NSNotificationCenter defaultCenter]
removeObserver:self
name:UIApplicationDidBecomeActiveNotification
object:nil];
[[NSNotificationCenter defaultCenter]
removeObserver:self
name:UIApplicationWillResignActiveNotification
object:nil];
[[NSNotificationCenter defaultCenter]
removeObserver:self
name:UIApplicationDidEnterBackgroundNotification
object:nil];
[super dealloc];
}
- (void) applicationDidBecomeActive
{
[self handleApplicationStateChanged:UIApplicationStateActive];
}
- (void) applicationWillResignActive
{
// Note that UIApplication is still UIApplicationStateActive at this
// point, but since there is no separate notification for the inactive
// state, we report UIApplicationStateInactive now:
[self handleApplicationStateChanged:UIApplicationStateInactive];
}
- (void) applicationDidEnterBackground
{
[self handleApplicationStateChanged:UIApplicationStateBackground];
}
- (void) handleApplicationStateChanged:(UIApplicationState) uiApplicationState
{
Qt::ApplicationState state;
switch (uiApplicationState) {
case UIApplicationStateActive:
// The application is visible in front, and receiving events:
state = Qt::ApplicationActive;
break;
case UIApplicationStateInactive:
// The app is running in the foreground but is not receiving events. This
// typically happens while transitioning to/from active/background, like
// upon app launch or when receiving incoming calls:
state = Qt::ApplicationInactive;
break;
case UIApplicationStateBackground:
// Normally the app would enter this state briefly before it gets
// suspeded (you have five seconds, according to Apple).
// You can request more time and start a background task, which would
// normally map closer to Qt::ApplicationHidden. But since we have no
// API for doing that yet, we handle this state as "about to be suspended".
// Note: A screen-shot for the SpringBoard will also be taken after this
// call returns.
state = Qt::ApplicationSuspended;
break;
}
QWindowSystemInterface::handleApplicationStateChanged(state);
}
@end
QT_BEGIN_NAMESPACE
QIOSApplicationState::QIOSApplicationState()
: m_listener([[QIOSApplicationStateListener alloc] init])
{
// Update the current state now, since we have missed all the updates
// posted from AppKit so far. But let QPA finish initialization first:
dispatch_async(dispatch_get_main_queue(), ^{
UIApplicationState state = [UIApplication sharedApplication].applicationState;
[m_listener handleApplicationStateChanged:state];
});
}
QIOSApplicationState::~QIOSApplicationState()
{
[m_listener release];
}
QT_END_NAMESPACE

View File

@ -46,6 +46,8 @@
#include <qpa/qplatformnativeinterface.h>
#include <qpa/qwindowsysteminterface.h>
#include "qiosapplicationstate.h"
QT_BEGIN_NAMESPACE
class QIOSIntegration : public QPlatformIntegration, public QPlatformNativeInterface
@ -79,6 +81,7 @@ private:
QPlatformInputContext *m_inputContext;
QPlatformScreen *m_screen;
QTouchDevice *m_touchDevice;
QIOSApplicationState m_applicationState;
};
QT_END_NAMESPACE

View File

@ -90,6 +90,8 @@ bool QIOSIntegration::hasCapability(Capability cap) const
return true;
case MultipleWindows:
return true;
case ApplicationState:
return true;
default:
return QPlatformIntegration::hasCapability(cap);
}