androidrunfactories.cpp 6.27 KB
Newer Older
BogDan Vatra's avatar
BogDan Vatra committed
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
/**************************************************************************
**
** This file is part of Qt Creator
**
** Copyright (c) 2012 BogDan Vatra <bog_dan_ro@yahoo.com>
**
** Contact: Nokia Corporation (qt-info@nokia.com)
**
**
** GNU Lesser General Public License Usage
**
** 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, Nokia gives you certain additional
** rights. These rights are described in the Nokia Qt LGPL Exception
** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
**
** Other Usage
**
** Alternatively, this file may be used in accordance with the terms and
** conditions contained in a signed written agreement between you and Nokia.
**
** If you have questions regarding the use of this file, please contact
** Nokia at qt-info@nokia.com.
**
**************************************************************************/

#include "androidrunfactories.h"

#include "androidconstants.h"
#include "androiddebugsupport.h"
#include "androidrunconfiguration.h"
#include "androidruncontrol.h"
Tobias Hunger's avatar
Tobias Hunger committed
39
#include "androidmanager.h"
BogDan Vatra's avatar
BogDan Vatra committed
40

Tobias Hunger's avatar
Tobias Hunger committed
41
#include <projectexplorer/project.h>
BogDan Vatra's avatar
BogDan Vatra committed
42
#include <projectexplorer/projectexplorerconstants.h>
Tobias Hunger's avatar
Tobias Hunger committed
43
#include <projectexplorer/target.h>
BogDan Vatra's avatar
BogDan Vatra committed
44
45
46
#include <debugger/debuggerconstants.h>
#include <qt4projectmanager/qt4project.h>
#include <qt4projectmanager/qt4nodes.h>
Tobias Hunger's avatar
Tobias Hunger committed
47
48
49
#include <qtsupport/customexecutablerunconfiguration.h>
#include <qtsupport/qtprofileinformation.h>
#include <qtsupport/qtsupportconstants.h>
BogDan Vatra's avatar
BogDan Vatra committed
50
51
52
53
54
55
56
57
58
59


namespace Android {
namespace Internal {

using namespace ProjectExplorer;
using namespace Qt4ProjectManager;

namespace {

60
QString pathFromId(const Core::Id id)
BogDan Vatra's avatar
BogDan Vatra committed
61
{
Tobias Hunger's avatar
Tobias Hunger committed
62
    QString pathStr = id.toString();
63
64
    const QString prefix = QLatin1String(ANDROID_RC_ID_PREFIX);
    if (!pathStr.startsWith(prefix))
BogDan Vatra's avatar
BogDan Vatra committed
65
        return QString();
66
    return pathStr.mid(prefix.size());
BogDan Vatra's avatar
BogDan Vatra committed
67
68
69
70
71
}

} // namespace

AndroidRunConfigurationFactory::AndroidRunConfigurationFactory(QObject *parent)
Tobias Hunger's avatar
Tobias Hunger committed
72
73
    : QmakeRunConfigurationFactory(parent)
{ setObjectName(QLatin1String("AndroidRunConfigurationFactory")); }
BogDan Vatra's avatar
BogDan Vatra committed
74
75

AndroidRunConfigurationFactory::~AndroidRunConfigurationFactory()
Tobias Hunger's avatar
Tobias Hunger committed
76
{ }
BogDan Vatra's avatar
BogDan Vatra committed
77

Tobias Hunger's avatar
Tobias Hunger committed
78
bool AndroidRunConfigurationFactory::canCreate(Target *parent, const Core::Id id) const
BogDan Vatra's avatar
BogDan Vatra committed
79
{
Tobias Hunger's avatar
Tobias Hunger committed
80
    if (!canHandle(parent))
BogDan Vatra's avatar
BogDan Vatra committed
81
        return false;
Tobias Hunger's avatar
Tobias Hunger committed
82
    return availableCreationIds(parent).contains(id);
BogDan Vatra's avatar
BogDan Vatra committed
83
84
}

Tobias Hunger's avatar
Tobias Hunger committed
85
bool AndroidRunConfigurationFactory::canRestore(Target *parent, const QVariantMap &map) const
BogDan Vatra's avatar
BogDan Vatra committed
86
{
Tobias Hunger's avatar
Tobias Hunger committed
87
    if (!canHandle(parent))
BogDan Vatra's avatar
BogDan Vatra committed
88
        return false;
Tobias Hunger's avatar
Tobias Hunger committed
89
90
    QString id = ProjectExplorer::idFromMap(map).toString();
    return id.startsWith(QLatin1String(ANDROID_RC_ID_PREFIX));
BogDan Vatra's avatar
BogDan Vatra committed
91
92
93
94
95
96
97
98
}

bool AndroidRunConfigurationFactory::canClone(Target *parent,
    RunConfiguration *source) const
{
    return canCreate(parent, source->id());
}

99
QList<Core::Id> AndroidRunConfigurationFactory::availableCreationIds(Target *parent) const
BogDan Vatra's avatar
BogDan Vatra committed
100
{
101
    QList<Core::Id> ids;
Tobias Hunger's avatar
Tobias Hunger committed
102
103
104
105
106
    if (!AndroidManager::supportsAndroid(parent))
        return ids;
    QList<Qt4ProFileNode *> nodes = static_cast<Qt4Project *>(parent->project())->allProFiles();
    foreach (Qt4ProFileNode *node, nodes)
        if (node->projectType() == ApplicationTemplate || node->projectType() == LibraryTemplate)
107
            ids << Core::Id(ANDROID_RC_ID_PREFIX + node->targetInformation().target);
BogDan Vatra's avatar
BogDan Vatra committed
108
109
110
    return ids;
}

111
QString AndroidRunConfigurationFactory::displayNameForId(const Core::Id id) const
BogDan Vatra's avatar
BogDan Vatra committed
112
113
114
115
{
    return QFileInfo(pathFromId(id)).completeBaseName();
}

Tobias Hunger's avatar
Tobias Hunger committed
116
RunConfiguration *AndroidRunConfigurationFactory::create(Target *parent, const Core::Id id)
BogDan Vatra's avatar
BogDan Vatra committed
117
118
119
{
    if (!canCreate(parent, id))
        return 0;
Tobias Hunger's avatar
Tobias Hunger committed
120
    return new AndroidRunConfiguration(parent, id, pathFromId(id));
BogDan Vatra's avatar
BogDan Vatra committed
121
122
123
124
125
126
127
}

RunConfiguration *AndroidRunConfigurationFactory::restore(Target *parent,
    const QVariantMap &map)
{
    if (!canRestore(parent, map))
        return 0;
Tobias Hunger's avatar
Tobias Hunger committed
128
129
    Core::Id id = ProjectExplorer::idFromMap(map);
    AndroidRunConfiguration *rc = new AndroidRunConfiguration(parent, id, pathFromId(id));
BogDan Vatra's avatar
BogDan Vatra committed
130
131
132
133
134
135
136
    if (rc->fromMap(map))
        return rc;

    delete rc;
    return 0;
}

Tobias Hunger's avatar
Tobias Hunger committed
137
RunConfiguration *AndroidRunConfigurationFactory::clone(Target *parent, RunConfiguration *source)
BogDan Vatra's avatar
BogDan Vatra committed
138
139
140
141
142
{
    if (!canClone(parent, source))
        return 0;

    AndroidRunConfiguration *old = static_cast<AndroidRunConfiguration *>(source);
Tobias Hunger's avatar
Tobias Hunger committed
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
    return new AndroidRunConfiguration(parent, old);
}

bool AndroidRunConfigurationFactory::canHandle(Target *t) const
{
    if (!t->project()->supportsProfile(t->profile()))
        return false;
    return AndroidManager::supportsAndroid(t);
}

QList<RunConfiguration *> AndroidRunConfigurationFactory::runConfigurationsForNode(Target *t, ProjectExplorer::Node *n)
{
    QList<ProjectExplorer::RunConfiguration *> result;
    foreach (ProjectExplorer::RunConfiguration *rc, t->runConfigurations())
        if (AndroidRunConfiguration *qt4c = qobject_cast<AndroidRunConfiguration *>(rc))
                if (qt4c->proFilePath() == n->path())
                    result << rc;
    return result;
BogDan Vatra's avatar
BogDan Vatra committed
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
}

// #pragma mark -- AndroidRunControlFactory

AndroidRunControlFactory::AndroidRunControlFactory(QObject *parent)
    : IRunControlFactory(parent)
{
}

AndroidRunControlFactory::~AndroidRunControlFactory()
{
}

bool AndroidRunControlFactory::canRun(RunConfiguration *runConfiguration,
                ProjectExplorer::RunMode mode) const
{
    if (mode != NormalRunMode && mode != DebugRunMode)
        return false;
    return qobject_cast<AndroidRunConfiguration *>(runConfiguration);
}

RunControl *AndroidRunControlFactory::create(RunConfiguration *runConfig,
                                        ProjectExplorer::RunMode mode)
{
    Q_ASSERT(canRun(runConfig, mode));
    AndroidRunConfiguration *rc = qobject_cast<AndroidRunConfiguration *>(runConfig);
    Q_ASSERT(rc);
    if (mode == NormalRunMode)
        return new AndroidRunControl(rc);
    else
        return AndroidDebugSupport::createDebugRunControl(rc);
}

QString AndroidRunControlFactory::displayName() const
{
    return tr("Run on Android device/emulator");
}

} // namespace Internal
} // namespace Qt4ProjectManager