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 <utils/fileutils.h>
26 
27 #include <QList>
28 #include <QObject>
29 #include <QPointer>
30 #include <QVersionNumber>
31 
32 #pragma once
33 
34 namespace Android {
35 
36 namespace Internal {
37     class SdkManagerOutputParser;
38     class AndroidToolOutputParser;
39 }
40 class SdkPlatform;
41 class SystemImage;
42 
43 class AndroidSdkPackage : public QObject
44 {
45     Q_OBJECT
46 
47 public:
48     enum PackageType {
49         UnknownPackage          = 1 << 0,
50         SdkToolsPackage         = 1 << 1,
51         BuildToolsPackage       = 1 << 2,
52         PlatformToolsPackage    = 1 << 3,
53         SdkPlatformPackage      = 1 << 4,
54         SystemImagePackage      = 1 << 5,
55         EmulatorToolsPackage    = 1 << 6,
56         NDKPackage              = 1 << 7,
57         ExtraToolsPackage       = 1 << 8,
58         GenericSdkPackage       = 1 << 9,
59         AnyValidType = SdkToolsPackage | BuildToolsPackage | PlatformToolsPackage |
60         SdkPlatformPackage | SystemImagePackage | EmulatorToolsPackage | NDKPackage |
61                        ExtraToolsPackage | GenericSdkPackage
62     };
63 
64     enum PackageState {
65         Unknown     = 1 << 0,
66         Installed   = 1 << 1,
67         Available   = 1 << 2,
68         AnyValidState = Installed | Available
69     };
70 
71     AndroidSdkPackage(const QVersionNumber &revision, const QString &sdkStylePathStr,
72                       QObject *parent = nullptr);
73     ~AndroidSdkPackage() override = default;
74 
75     virtual bool isValid() const = 0;
76     virtual PackageType type() const = 0;
77     virtual bool operator <(const AndroidSdkPackage &other) const;
78 
79     QString displayText() const;
80     QString descriptionText() const;
81     const QVersionNumber &revision() const;
82     PackageState state() const;
83     const QString &sdkStylePath() const;
84     const Utils::FilePath &installedLocation() const;
85 
86 protected:
87     void setDisplayText(const QString &str);
88     void setDescriptionText(const QString &str);
89     void setState(PackageState state);
90     void setInstalledLocation(const Utils::FilePath &path);
91 
92     virtual void updatePackageDetails();
93 
94 private:
95     QString m_displayText;
96     QString m_descriptionText;
97     QVersionNumber m_revision;
98     PackageState m_state = PackageState::Unknown;
99     QString m_sdkStylePath;
100     Utils::FilePath m_installedLocation;
101 
102     friend class Internal::SdkManagerOutputParser;
103     friend class Internal::AndroidToolOutputParser;
104 };
105 using AndroidSdkPackageList = QList<AndroidSdkPackage*>;
106 
107 class SystemImage : public AndroidSdkPackage
108 {
109     Q_OBJECT
110 public:
111     SystemImage(const QVersionNumber &revision, const QString &sdkStylePathStr, const QString &abi,
112                 SdkPlatform *platform = nullptr);
113 
114 // AndroidSdkPackage Overrides
115     bool isValid() const override;
116     PackageType type() const override;
117 
118     const QString &abiName() const;
119     const SdkPlatform *platform() const;
120     void setPlatform(SdkPlatform *platform);
121     int apiLevel() const;
122     void setApiLevel(const int apiLevel);
123 
124 private:
125     QPointer<SdkPlatform> m_platform;
126     QString m_abiName;
127     int m_apiLevel = -1;
128 };
129 using SystemImageList = QList<SystemImage*>;
130 
131 
132 class SdkPlatform : public AndroidSdkPackage
133 {
134     Q_OBJECT
135 public:
136     SdkPlatform(const QVersionNumber &revision, const QString &sdkStylePathStr, int api,
137                 QObject *parent = nullptr);
138 
139     ~SdkPlatform() override;
140 
141 // AndroidSdkPackage Overrides
142     bool isValid() const override;
143     PackageType type() const override;
144     bool operator <(const AndroidSdkPackage &other) const override;
145 
146     int apiLevel() const;
147     QVersionNumber version() const;
148     void addSystemImage(SystemImage *image);
149     SystemImageList systemImages(AndroidSdkPackage::PackageState state
150                                  = AndroidSdkPackage::Installed) const;
151 
152 private:
153     SystemImageList m_systemImages;
154     int m_apiLevel = -1;
155     QVersionNumber m_version;
156 };
157 using SdkPlatformList = QList<SdkPlatform*>;
158 
159 class BuildTools : public AndroidSdkPackage
160 {
161 public:
162     BuildTools(const QVersionNumber &revision, const QString &sdkStylePathStr,
163                QObject *parent = nullptr);
164 
165 // AndroidSdkPackage Overrides
166 public:
167     bool isValid() const override;
168     PackageType type() const override;
169 };
170 
171 class PlatformTools : public AndroidSdkPackage
172 {
173 public:
174     PlatformTools(const QVersionNumber &revision, const QString &sdkStylePathStr,
175                   QObject *parent = nullptr);
176 
177 // AndroidSdkPackage Overrides
178 public:
179     bool isValid() const override;
180     PackageType type() const override;
181 };
182 
183 class EmulatorTools : public AndroidSdkPackage
184 {
185 public:
186     EmulatorTools(const QVersionNumber &revision, const QString &sdkStylePathStr,
187                   QObject *parent = nullptr);
188 
189 // AndroidSdkPackage Overrides
190 public:
191     bool isValid() const override;
192     PackageType type() const override;
193 };
194 
195 class SdkTools : public AndroidSdkPackage
196 {
197 public:
198     SdkTools(const QVersionNumber &revision, const QString &sdkStylePathStr,
199              QObject *parent = nullptr);
200 
201 // AndroidSdkPackage Overrides
202 public:
203     bool isValid() const override;
204     PackageType type() const override;
205 };
206 
207 class Ndk : public AndroidSdkPackage
208 {
209 public:
210     Ndk(const QVersionNumber &revision, const QString &sdkStylePathStr, QObject *parent = nullptr);
211 
212     // AndroidSdkPackage Overrides
213     bool isValid() const override;
214     PackageType type() const override;
215 };
216 using NdkList = QList<Ndk *>;
217 
218 class ExtraTools : public AndroidSdkPackage
219 {
220 public:
221     ExtraTools(const QVersionNumber &revision, const QString &sdkStylePathStr,
222                QObject *parent = nullptr);
223 
224 // AndroidSdkPackage Overrides
225 public:
226     bool isValid() const override;
227     PackageType type() const override;
228 };
229 
230 class GenericSdkPackage : public AndroidSdkPackage
231 {
232 public:
233     GenericSdkPackage(const QVersionNumber &revision, const QString &sdkStylePathStr,
234                       QObject *parent = nullptr);
235 
236 // AndroidSdkPackage Overrides
237 public:
238     bool isValid() const override;
239     PackageType type() const override;
240 };
241 } // namespace Android
242 
243 
244