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