1 /****************************************************************************
2 **
3 ** Copyright (C) 2017 The Qt Company Ltd.
4 ** Contact: https://www.qt.io/licensing/
5 **
6 ** This file is part of Qt Creator.
7 **
8 ** Commercial License Usage
9 ** Licensees holding valid commercial Qt licenses may use this file in
10 ** accordance with the commercial license agreement provided with the
11 ** Software or, alternatively, in accordance with the terms contained in
12 ** a written agreement between you and The Qt Company. For licensing terms
13 ** and conditions see https://www.qt.io/terms-conditions. For further
14 ** information use the contact form at https://www.qt.io/contact-us.
15 **
16 ** GNU General Public License Usage
17 ** Alternatively, this file may be used under the terms of the GNU
18 ** General Public License version 3 as published by the Free Software
19 ** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
20 ** included in the packaging of this file. Please review the following
21 ** information to ensure the GNU General Public License requirements will
22 ** be met: https://www.gnu.org/licenses/gpl-3.0.html.
23 **
24 ****************************************************************************/
25 #include "androidsdkpackage.h"
26 
27 #include <utils/algorithm.h>
28 
29 namespace Android {
30 
AndroidSdkPackage(const QVersionNumber & version,const QString & sdkStylePathStr,QObject * parent)31 AndroidSdkPackage::AndroidSdkPackage(const QVersionNumber &version, const QString &sdkStylePathStr,
32                                      QObject *parent) :
33     QObject(parent),
34     m_revision(version),
35     m_sdkStylePath(sdkStylePathStr)
36 {
37 
38 }
39 
operator <(const AndroidSdkPackage & other) const40 bool AndroidSdkPackage::operator <(const AndroidSdkPackage &other) const
41 {
42     if (typeid(*this) != typeid(other))
43         return type() < other.type();
44     return displayText() < other.displayText();
45 }
46 
displayText() const47 QString AndroidSdkPackage::displayText() const
48 {
49     return m_displayText;
50 }
51 
descriptionText() const52 QString AndroidSdkPackage::descriptionText() const
53 {
54     return m_descriptionText;
55 }
56 
revision() const57 const QVersionNumber &AndroidSdkPackage::revision() const
58 {
59     return m_revision;
60 }
61 
state() const62 AndroidSdkPackage::PackageState AndroidSdkPackage::state() const
63 {
64     return m_state;
65 }
66 
sdkStylePath() const67 const QString &AndroidSdkPackage::sdkStylePath() const
68 {
69     return m_sdkStylePath;
70 }
71 
installedLocation() const72 const Utils::FilePath &AndroidSdkPackage::installedLocation() const
73 {
74     return m_installedLocation;
75 }
76 
setDisplayText(const QString & str)77 void AndroidSdkPackage::setDisplayText(const QString &str)
78 {
79     m_displayText = str;
80 }
81 
setDescriptionText(const QString & str)82 void AndroidSdkPackage::setDescriptionText(const QString &str)
83 {
84     m_descriptionText = str;
85 }
86 
setState(AndroidSdkPackage::PackageState state)87 void AndroidSdkPackage::setState(AndroidSdkPackage::PackageState state)
88 {
89     m_state = state;
90 }
91 
setInstalledLocation(const Utils::FilePath & path)92 void AndroidSdkPackage::setInstalledLocation(const Utils::FilePath &path)
93 {
94     m_installedLocation = path;
95     if (m_installedLocation.exists())
96         updatePackageDetails();
97 }
98 
updatePackageDetails()99 void AndroidSdkPackage::updatePackageDetails()
100 {
101 
102 }
103 
SystemImage(const QVersionNumber & version,const QString & sdkStylePathStr,const QString & abi,SdkPlatform * platform)104 SystemImage::SystemImage(const QVersionNumber &version, const QString &sdkStylePathStr,
105                          const QString &abi, SdkPlatform *platform):
106     AndroidSdkPackage(version, sdkStylePathStr, platform),
107     m_platform(platform),
108     m_abiName(abi)
109 {
110 }
111 
isValid() const112 bool SystemImage::isValid() const
113 {
114     return m_platform && m_platform->isValid();
115 }
116 
type() const117 AndroidSdkPackage::PackageType SystemImage::type() const
118 {
119     return SystemImagePackage;
120 }
121 
abiName() const122 const QString &SystemImage::abiName() const
123 {
124     return m_abiName;
125 }
126 
platform() const127 const SdkPlatform *SystemImage::platform() const
128 {
129     return m_platform.data();
130 }
131 
setPlatform(SdkPlatform * platform)132 void SystemImage::setPlatform(SdkPlatform *platform)
133 {
134     m_platform = platform;
135 }
136 
apiLevel() const137 int SystemImage::apiLevel() const
138 {
139     return m_apiLevel;
140 }
141 
setApiLevel(const int apiLevel)142 void SystemImage::setApiLevel(const int apiLevel)
143 {
144     m_apiLevel = apiLevel;
145 }
146 
SdkPlatform(const QVersionNumber & version,const QString & sdkStylePathStr,int api,QObject * parent)147 SdkPlatform::SdkPlatform(const QVersionNumber &version, const QString &sdkStylePathStr,
148                          int api, QObject *parent) :
149     AndroidSdkPackage(version, sdkStylePathStr, parent),
150     m_apiLevel(api)
151 {
152     setDisplayText(QString("android-%1")
153                    .arg(m_apiLevel != -1 ? QString::number(m_apiLevel) : "Unknown"));
154 }
155 
~SdkPlatform()156 SdkPlatform::~SdkPlatform()
157 {
158     for (SystemImage *image : qAsConst(m_systemImages))
159         delete image;
160     m_systemImages.clear();
161 }
162 
isValid() const163 bool SdkPlatform::isValid() const
164 {
165     return m_apiLevel != -1;
166 }
167 
type() const168 AndroidSdkPackage::PackageType SdkPlatform::type() const
169 {
170     return SdkPlatformPackage;
171 }
172 
operator <(const AndroidSdkPackage & other) const173 bool SdkPlatform::operator <(const AndroidSdkPackage &other) const
174 {
175     if (typeid(*this) != typeid(other))
176         return AndroidSdkPackage::operator <(other);
177 
178     const auto &platform = static_cast<const SdkPlatform &>(other);
179     if (platform.m_apiLevel == m_apiLevel)
180         return AndroidSdkPackage::operator <(other);
181 
182     return platform.m_apiLevel < m_apiLevel;
183 }
184 
apiLevel() const185 int SdkPlatform::apiLevel() const
186 {
187     return m_apiLevel;
188 }
189 
version() const190 QVersionNumber SdkPlatform::version() const
191 {
192     return m_version;
193 }
194 
addSystemImage(SystemImage * image)195 void SdkPlatform::addSystemImage(SystemImage *image)
196 {
197     // Ordered insert. Installed images on top with lexical comparison of the display name.
198     auto itr = m_systemImages.begin();
199     while (itr != m_systemImages.end()) {
200         SystemImage *currentImage = *itr;
201         if (currentImage->state() == image->state()) {
202             if (currentImage->displayText() > image->displayText())
203                 break;
204         } else if (currentImage->state() > image->state()) {
205             break;
206         }
207         ++itr;
208     }
209     m_systemImages.insert(itr, image);
210     image->setPlatform(this);
211 }
212 
systemImages(PackageState state) const213 SystemImageList SdkPlatform::systemImages(PackageState state) const
214 {
215     return Utils::filtered(m_systemImages, [state](const SystemImage *image) {
216         return image->state() & state;
217     });
218 }
219 
BuildTools(const QVersionNumber & revision,const QString & sdkStylePathStr,QObject * parent)220 BuildTools::BuildTools(const QVersionNumber &revision, const QString &sdkStylePathStr,
221                        QObject *parent)
222     : AndroidSdkPackage(revision, sdkStylePathStr, parent)
223 {
224 }
225 
isValid() const226 bool BuildTools::isValid() const
227 {
228     return true;
229 }
230 
type() const231 AndroidSdkPackage::PackageType BuildTools::type() const
232 {
233     return AndroidSdkPackage::BuildToolsPackage;
234 }
235 
SdkTools(const QVersionNumber & revision,const QString & sdkStylePathStr,QObject * parent)236 SdkTools::SdkTools(const QVersionNumber &revision, const QString &sdkStylePathStr, QObject *parent)
237     : AndroidSdkPackage(revision, sdkStylePathStr, parent)
238 {
239 
240 }
241 
isValid() const242 bool SdkTools::isValid() const
243 {
244     return true;
245 }
246 
type() const247 AndroidSdkPackage::PackageType SdkTools::type() const
248 {
249     return AndroidSdkPackage::SdkToolsPackage;
250 }
251 
PlatformTools(const QVersionNumber & revision,const QString & sdkStylePathStr,QObject * parent)252 PlatformTools::PlatformTools(const QVersionNumber &revision, const QString &sdkStylePathStr,
253                              QObject *parent)
254     : AndroidSdkPackage(revision, sdkStylePathStr, parent)
255 {
256 
257 }
258 
isValid() const259 bool PlatformTools::isValid() const
260 {
261     return true;
262 }
263 
type() const264 AndroidSdkPackage::PackageType PlatformTools::type() const
265 {
266     return AndroidSdkPackage::PlatformToolsPackage;
267 }
268 
EmulatorTools(const QVersionNumber & revision,const QString & sdkStylePathStr,QObject * parent)269 EmulatorTools::EmulatorTools(const QVersionNumber &revision, const QString &sdkStylePathStr,
270                              QObject *parent)
271     : AndroidSdkPackage(revision, sdkStylePathStr, parent)
272 {
273 
274 }
275 
isValid() const276 bool EmulatorTools::isValid() const
277 {
278     return installedLocation().exists();
279 }
280 
type() const281 AndroidSdkPackage::PackageType EmulatorTools::type() const
282 {
283     return AndroidSdkPackage::EmulatorToolsPackage;
284 }
285 
ExtraTools(const QVersionNumber & revision,const QString & sdkStylePathStr,QObject * parent)286 ExtraTools::ExtraTools(const QVersionNumber &revision, const QString &sdkStylePathStr,
287                        QObject *parent)
288     : AndroidSdkPackage(revision, sdkStylePathStr, parent)
289 {
290 }
291 
isValid() const292 bool ExtraTools::isValid() const
293 {
294     return installedLocation().exists();
295 }
296 
type() const297 AndroidSdkPackage::PackageType ExtraTools::type() const
298 {
299     return AndroidSdkPackage::ExtraToolsPackage;
300 }
301 
Ndk(const QVersionNumber & revision,const QString & sdkStylePathStr,QObject * parent)302 Ndk::Ndk(const QVersionNumber &revision, const QString &sdkStylePathStr, QObject *parent)
303     : AndroidSdkPackage(revision, sdkStylePathStr, parent)
304 {
305 }
306 
isValid() const307 bool Ndk::isValid() const
308 {
309     return installedLocation().exists();
310 }
311 
type() const312 AndroidSdkPackage::PackageType Ndk::type() const
313 {
314     return AndroidSdkPackage::NDKPackage;
315 }
316 
GenericSdkPackage(const QVersionNumber & revision,const QString & sdkStylePathStr,QObject * parent)317 GenericSdkPackage::GenericSdkPackage(const QVersionNumber &revision, const QString &sdkStylePathStr,
318                                      QObject  *parent)
319     : AndroidSdkPackage(revision, sdkStylePathStr, parent)
320 {
321 }
322 
isValid() const323 bool GenericSdkPackage::isValid() const
324 {
325     return installedLocation().exists();
326 }
327 
type() const328 AndroidSdkPackage::PackageType GenericSdkPackage::type() const
329 {
330     return AndroidSdkPackage::GenericSdkPackage;
331 }
332 
333 } // namespace Android
334