uploadToPlayStore method

Future<void> uploadToPlayStore({
  1. required File file,
  2. required PlaystoreTrackType trackType,
  3. required PlaystoreReleaseStatus releaseStatus,
  4. File? serviceAccountCredentialsFile,
})

Implementation

Future<void> uploadToPlayStore({
  required File file,
  required PlaystoreTrackType trackType,
  required PlaystoreReleaseStatus releaseStatus,
  File? serviceAccountCredentialsFile,
}) async {
  ImpaktfullCliLogger.setSpinnerPrefix('PlayStore upload');
  ImpaktfullCliLogger.startSpinner('Initializing');
  if (!file.existsSync()) {
    throw ImpaktfullCliError('File `${file.path}` does not exists');
  }
  ImpaktfullCliLogger.startSpinner('Get packageName from file');
  final packageName = await _getPackageName(file);
  ImpaktfullCliLogger.startSpinner('Get versionCode from file');
  final versionCode = await _getVersionCode(file);
  ImpaktfullCliLogger.startSpinner('Get versionName from file');
  final versionName = await _getVersionName(file);
  if (_apkOutputDirectory.existsSync()) {
    _apkOutputDirectory.deleteSync(recursive: true);
  }
  ImpaktfullCliLogger.verbose('Detected package name: `$packageName`');
  ImpaktfullCliLogger.verbose('Detected version code: `$versionCode`');
  ImpaktfullCliLogger.verbose('Detected version name: `$versionName`');
  try {
    await _runWithGoogleClient(
      serviceAccountCredentialsFile: serviceAccountCredentialsFile,
      scopes: [
        AndroidPublisherApi.androidpublisherScope,
      ],
      handler: (client) async {
        final api = AndroidPublisherApi(client);

        ImpaktfullCliLogger.startSpinner('Create new release');
        final appEdit = await api.edits.insert(
          AppEdit(),
          packageName,
        );
        final appEditId = appEdit.id;
        if (appEditId == null) {
          throw ImpaktfullCliError('AppEdit ID is null');
        }
        ImpaktfullCliLogger.startSpinner('Upload file');
        await api.edits.bundles.upload(
          packageName,
          appEditId,
          uploadMedia: Media(file.openRead(), await file.length()),
          uploadOptions: UploadOptions(),
        );

        ImpaktfullCliLogger.startSpinner(
            'Create release track (${trackType.value} - ${releaseStatus.value})');
        final trackRelease = Track(
          releases: [
            TrackRelease(
              versionCodes: [
                versionCode,
              ],
              name: '$versionName ($versionCode)',
              status: releaseStatus.value,
            ),
          ],
          track: trackType.value,
        );
        await api.edits.tracks.update(
          trackRelease,
          packageName,
          appEditId,
          trackType.value,
        );

        ImpaktfullCliLogger.startSpinner('Commit release');
        await api.edits.commit(
          packageName,
          appEditId,
        );
      },
    );
    ImpaktfullCliLogger.clearSpinnerPrefix();
  } on DetailedApiRequestError catch (e) {
    if (e.message == 'Version code $versionCode has already been used.') {
      throw ImpaktfullCliError(
          'The version code must be higher than the previously uploaded version. (must be higher than $versionCode)');
    }
    rethrow;
  }
}