Skip to content

Commit

Permalink
fix: Adding Android services for billing.
Browse files Browse the repository at this point in the history
  • Loading branch information
mathrunet committed Feb 10, 2024
1 parent 6a995e1 commit 00d31e8
Show file tree
Hide file tree
Showing 8 changed files with 244 additions and 26 deletions.
3 changes: 2 additions & 1 deletion packages/katana_cli/lib/action/app/location.dart
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ import 'dart:io';
// Package imports:
import 'package:html/dom.dart';
import 'package:html/parser.dart';
import 'package:katana_cli/config.dart';
import 'package:xml/xml.dart';

// Project imports:
Expand Down Expand Up @@ -162,7 +163,7 @@ class AppLocationCliAction extends CliCommand with CliActionMixin {
.any((element) => element.startsWith("flutter.minSdkVersion"))) {
await configPropertiesFile.writeAsString([
...configProperties,
"flutter.minSdkVersion=23",
"flutter.minSdkVersion=${Config.firebaseMinSdkVersion}",
].join("\n"));
}
label("Edit build.gradle");
Expand Down
3 changes: 2 additions & 1 deletion packages/katana_cli/lib/action/app/text_to_speech.dart
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@
import 'dart:io';

// Package imports:
import 'package:katana_cli/config.dart';
import 'package:xml/xml.dart';

// Project imports:
Expand Down Expand Up @@ -53,7 +54,7 @@ class AppTextToSpeechCliAction extends CliCommand with CliActionMixin {
.any((element) => element.startsWith("flutter.minSdkVersion"))) {
await configPropertiesFile.writeAsString([
...configProperties,
"flutter.minSdkVersion=23",
"flutter.minSdkVersion=${Config.firebaseMinSdkVersion}",
].join("\n"));
}
label("Edit build.gradle");
Expand Down
3 changes: 2 additions & 1 deletion packages/katana_cli/lib/action/firebase/authentication.dart
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ import 'dart:io';
// Package imports:
import 'package:html/dom.dart';
import 'package:html/parser.dart';
import 'package:katana_cli/config.dart';
import 'package:xml/xml.dart';

// Project imports:
Expand Down Expand Up @@ -536,7 +537,7 @@ class FirebaseAuthenticationCliAction extends CliCommand with CliActionMixin {
.any((element) => element.startsWith("flutter.minSdkVersion"))) {
await configPropertiesFile.writeAsString([
...configProperties,
"flutter.minSdkVersion=23",
"flutter.minSdkVersion=${Config.firebaseMinSdkVersion}",
].join("\n"));
}
label("Edit build.gradle");
Expand Down
3 changes: 2 additions & 1 deletion packages/katana_cli/lib/action/firebase/init.dart
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ import 'dart:convert';
import 'dart:io';

// Project imports:
import 'package:katana_cli/config.dart';
import 'package:katana_cli/katana_cli.dart';

/// Firebase initial configuration.
Expand Down Expand Up @@ -460,7 +461,7 @@ class FirebaseInitCliAction extends CliCommand with CliActionMixin {
.any((element) => element.startsWith("flutter.minSdkVersion"))) {
await configPropertiesFile.writeAsString([
...configProperties,
"flutter.minSdkVersion=23",
"flutter.minSdkVersion=${Config.firebaseMinSdkVersion}",
].join("\n"));
}
label("Edit build.gradle");
Expand Down
50 changes: 45 additions & 5 deletions packages/katana_cli/lib/action/purchase/purchase.dart
Original file line number Diff line number Diff line change
Expand Up @@ -137,20 +137,47 @@ class PurchaseCliAction extends CliCommand with CliActionMixin {
await xcode.save();
}
if (enableGooglePlay) {
label("Edit build.gradle.");
final gradle = AppGradle();
await gradle.load();
if (!gradle.dependencies.any((element) => element.packageName
label("Edit app/build.gradle.");
final appGradle = AppGradle();
await appGradle.load();
if (!appGradle.dependencies.any((element) => element.packageName
.startsWith("com.android.billingclient:billing"))) {
gradle.dependencies.add(
appGradle.dependencies.add(
GradleDependencies(
group: "implementation",
packageName:
"com.android.billingclient:billing:${Config.androidBillingVersion}",
),
);
}
await appGradle.save();
label("Edit build.gradle.");
final gradle = BuildGradle();
await gradle.load();
gradle.buildScript.kotlinVersion = Config.androidKotlinVersion;
if (!gradle.buildScript.dependencies.any((element) =>
element.classpath.startsWith("com.google.gms:google-services"))) {
gradle.buildScript.dependencies.add(
GradleBuildscriptDependencies(
classpath:
"com.google.gms:google-services:${Config.googleServicesVersion}",
),
);
}
await gradle.save();
label("Edit config.properties");
final configPropertiesFile = File("android/config.properties");
if (!configPropertiesFile.existsSync()) {
await configPropertiesFile.writeAsString("");
}
final configProperties = await configPropertiesFile.readAsLines();
if (!configProperties
.any((element) => element.startsWith("flutter.compileSdkVersion"))) {
await configPropertiesFile.writeAsString([
...configProperties,
"flutter.compileSdkVersion=${Config.billingCompileSdkVersion}",
].join("\n"));
}
label("Edit AndroidManifest.xml.");
final file = File("android/app/src/main/AndroidManifest.xml");
if (!file.existsSync()) {
Expand Down Expand Up @@ -184,6 +211,15 @@ class PurchaseCliAction extends CliCommand with CliActionMixin {
),
);
}
if (manifest.first.attributes
.any((p0) => p0.name.toString() != "xmlns:tools")) {
manifest.first.attributes.add(
XmlAttribute(
XmlName("xmlns:tools"),
"http://schemas.android.com/tools",
),
);
}
final application = document.findAllElements("application");
if (!application.first.children.any(
(p0) =>
Expand All @@ -207,6 +243,10 @@ class PurchaseCliAction extends CliCommand with CliActionMixin {
XmlName("android:value"),
Config.androidBillingVersion,
),
XmlAttribute(
XmlName("tools:replace"),
"android:value",
),
],
[],
),
Expand Down
20 changes: 20 additions & 0 deletions packages/katana_cli/lib/config.dart
Original file line number Diff line number Diff line change
Expand Up @@ -4,11 +4,31 @@
class Config {
Config._();

/// Version of the Android GoogleServices.
///
/// AndroidのGoogleServicesのバージョン。
static const String googleServicesVersion = "4.3.14";

/// Version of the Android Kotlin.
///
/// AndroidのKotlinのバージョン。
static const String androidKotlinVersion = "1.9.22";

/// Version of the Android Billing Library.
///
/// AndroidのBillingライブラリのバージョン。
static const String androidBillingVersion = "6.0.1";

/// Sdk version at Android billing.
///
/// Androidの課金時のSdkバージョン。
static const int billingCompileSdkVersion = 34;

/// MinSdk version at Firebase for Android.
///
/// AndroidのFirebase時のMinSdkバージョン。
static const int firebaseMinSdkVersion = 23;

/// Contents of katana.yaml.
///
/// katana.yamlの中身。
Expand Down
146 changes: 146 additions & 0 deletions packages/katana_cli/lib/src/gradle.dart
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ import 'dart:io';

// Package imports:
import 'package:katana/katana.dart';
import 'package:katana_cli/config.dart';

/// Class for retrieving and saving files in `android/app/build.gradle`.
///
Expand Down Expand Up @@ -797,3 +798,148 @@ class GradleDependencies {
return " $group \"$packageName\"";
}
}

/// Class for retrieving and saving files in `android/build.gradle`.
///
/// `android/build.gradle`のファイルを取得して保存するためのクラス。
class BuildGradle {
BuildGradle();

/// Original text data.
///
/// 元のテキストデータ。
String get rawData => _rawData;
late String _rawData;

/// Data in the `buildScript` section.
///
/// `buildScript`セクションのデータ。
GradleBuildScript get buildScript => _buildScript;
late GradleBuildScript _buildScript;

/// Data loading.
///
/// データの読み込み。
Future<void> load() async {
final gradle = File("android/build.gradle");
_rawData = await gradle.readAsString();
_buildScript = GradleBuildScript._load(_rawData);
}

/// Data storage.
///
/// データの保存。
Future<void> save() async {
if (_rawData.isEmpty) {
throw Exception("No value. Please load data with [load].");
}
_rawData = GradleBuildScript._save(_rawData, _buildScript);
final gradle = File("android/build.gradle");
await gradle.writeAsString(_rawData);
}
}

/// Data in the `buildscript` section.
///
/// `buildscript`セクションのデータ。
class GradleBuildScript {
/// Data in the `buildscript` section.
///
/// `buildscript`セクションのデータ。
GradleBuildScript({
required this.kotlinVersion,
required List<GradleBuildscriptDependencies> dependencies,
}) : _dependencies = dependencies;

static final _regExp = RegExp(r"buildscript {([\s\S]+?)\n}");

static GradleBuildScript _load(String content) {
final region = _regExp.firstMatch(content)?.group(1) ?? "";
final kotlinVersion =
(RegExp("ext.kotlin_version()[\\s\\S]+?=[\\s\\S]+?([a-zA-Z0-9_\"'.-]+)")
.firstMatch(region)
?.group(1) ??
Config.androidKotlinVersion)
.trimString("'")
.trimString('"');
final dependencies = GradleBuildscriptDependencies._load(content);
return GradleBuildScript(
kotlinVersion: kotlinVersion,
dependencies: dependencies,
);
}

static String _save(String content, GradleBuildScript data) {
var region = _regExp.firstMatch(content)?.group(1) ?? "";
region = region.replaceAll(
RegExp("ext.kotlin_version()[\\s\\S]+?=[\\s\\S]+?([a-zA-Z0-9_\"'.-]+)"),
"ext.kotlin_version = '${data.kotlinVersion}'",
);
region = GradleBuildscriptDependencies._save(region, data.dependencies);
return content.replaceAll(
_regExp, "buildscript {\n${region.trimString("\n")}\n}");
}

/// Kotlin version.
///
/// Kotlinバージョン。
String? kotlinVersion;

/// Data in the `dependencies` section.
///
/// `dependencies`セクションのデータ。
List<GradleBuildscriptDependencies> get dependencies => _dependencies;
final List<GradleBuildscriptDependencies> _dependencies;

@override
String toString() {
return " ext.kotlin_version = '$kotlinVersion'\n";
}
}

/// Configuration class for the contents of [GradleBuildscriptDependencies].
///
/// [GradleBuildscriptDependencies]の中身の設定クラス。
class GradleBuildscriptDependencies {
/// Configuration class for the contents of [GradleBuildscriptDependencies].
///
/// [GradleBuildscriptDependencies]の中身の設定クラス。
GradleBuildscriptDependencies({
required this.classpath,
});

static final _regExp = RegExp(r"dependencies {([\s\S]+?)}");

/// Keystore alias.
///
/// Keystoreのエイリアス。
final String classpath;

static List<GradleBuildscriptDependencies> _load(String content) {
final region = _regExp.firstMatch(content)?.group(1) ?? "";
final classpaths = RegExp("classpath (?<classpath>.+)").allMatches(region);
return classpaths
.map(
(e) => GradleBuildscriptDependencies(
classpath: e
.namedGroup("classpath")
?.replaceAll("\n", "")
.trimString("'")
.trimString('"') ??
"",
),
)
.toList();
}

static String _save(
String content, List<GradleBuildscriptDependencies> data) {
return content.replaceAll(
_regExp, "dependencies {\n${data.join("\n")}\n }");
}

@override
String toString() {
return " classpath \"$classpath\"";
}
}

0 comments on commit 00d31e8

Please sign in to comment.