Skip to content

Commit

Permalink
feat: Permissions can now be granted.
Browse files Browse the repository at this point in the history
  • Loading branch information
mathrunet committed Feb 20, 2024
1 parent 00e55fd commit c3c1a05
Show file tree
Hide file tree
Showing 12 changed files with 442 additions and 480 deletions.
38 changes: 38 additions & 0 deletions packages/katana_cli/lib/action/agora/agora.dart
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ import 'dart:io';

// Project imports:
import 'package:katana_cli/katana_cli.dart';
import 'package:katana_cli/src/android_manifest.dart';

/// Add a module to use Agora.io.
///
Expand Down Expand Up @@ -36,6 +37,9 @@ class AgoraCliAction extends CliCommand with CliActionMixin {
final appId = agora.get("app_id", "");
final appCertificate = agora.get("app_certificate", "");
final enableCloudRecording = agora.get("enable_cloud_recording", false);
final permission = agora.getAsMap("permission");
final permissionCamera = permission.getAsMap("camera");
final permissionMicrophone = permission.getAsMap("microphone");
final firebase = context.yaml.getAsMap("firebase");
final projectId = firebase.get("project_id", "");
if (appId.isEmpty) {
Expand All @@ -44,6 +48,15 @@ class AgoraCliAction extends CliCommand with CliActionMixin {
}
if (appCertificate.isEmpty) {
error("[agora]->[app_certificate] is empty.");
return;
}
if (permissionCamera.isEmpty) {
error("[agora]->[permission]->[camera] is empty.");
return;
}
if (permissionMicrophone.isEmpty) {
error("[agora]->[permission]->[microphone] is empty.");
return;
}
if (projectId.isEmpty) {
error(
Expand Down Expand Up @@ -75,6 +88,31 @@ class AgoraCliAction extends CliCommand with CliActionMixin {
"katana_functions_firebase",
],
);
label("Edit AndroidManifest.xml.");
await AndroidManifestPermissionType.readPhoneState.enablePermission();
await AndroidManifestPermissionType.internet.enablePermission();
await AndroidManifestPermissionType.recordAudio.enablePermission();
await AndroidManifestPermissionType.camera.enablePermission();
await AndroidManifestPermissionType.modifyAudioSettings.enablePermission();
await AndroidManifestPermissionType.accessNetworkState.enablePermission();
await AndroidManifestPermissionType.bluetooth.enablePermission();
await AndroidManifestPermissionType.accessWifiState.enablePermission();
await AndroidManifestPermissionType.readExternalStorage.enablePermission();
await AndroidManifestPermissionType.wakeLock.enablePermission();
await AndroidManifestPermissionType.readPrivilegedPhoneState
.enablePermission();
label("Addition of permission messages.");
await XCodePermissionType.cameraUsage.setMessageToXCode(
permissionCamera
.map((key, value) => MapEntry(key, value.toString()))
.where((key, value) => value.isNotEmpty),
);
await XCodePermissionType.microphoneUsage.setMessageToXCode(
permissionMicrophone
.map((key, value) => MapEntry(key, value.toString()))
.where((key, value) => value.isNotEmpty),
);
await PodfilePermissionType.microphoneUsage.enablePermissionToPodfile();
label("Add firebase functions");
final functions = Fuctions();
await functions.load();
Expand Down
74 changes: 20 additions & 54 deletions 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/src/android_manifest.dart';
import 'package:xml/xml.dart';

// Project imports:
Expand Down Expand Up @@ -62,60 +63,25 @@ class AppLocationCliAction extends CliCommand with CliActionMixin {
return;
}
label("Edit AndroidManifest.xml.");
final file = File("android/app/src/main/AndroidManifest.xml");
if (!file.existsSync()) {
throw Exception(
"AndroidManifest does not exist in `android/app/src/main/AndroidManifest.xml`. Do `katana create` to complete the initial setup of the project.",
);
}
final document = XmlDocument.parse(await file.readAsString());
final manifest = document.findAllElements("manifest");
if (manifest.isEmpty) {
throw Exception(
"The structure of AndroidManifest.xml is broken. Do `katana create` to complete the initial setup of the project.",
);
}
if (!manifest.first.children.any((p0) =>
p0 is XmlElement &&
p0.name.toString() == "uses-permission" &&
p0.attributes.any((p1) =>
p1.name.toString() == "android:name" &&
p1.value == "android.permission.ACCESS_FINE_LOCATION"))) {
manifest.first.children.add(
XmlElement(
XmlName("uses-permission"),
[
XmlAttribute(
XmlName("android:name"),
"android.permission.ACCESS_FINE_LOCATION",
),
],
[],
),
);
}
await AndroidManifestPermissionType.accessFineLocation.enablePermission();
if (enableBackground) {
if (!manifest.first.children.any((p0) =>
p0 is XmlElement &&
p0.name.toString() == "uses-permission" &&
p0.attributes.any((p1) =>
p1.name.toString() == "android:name" &&
p1.value == "android.permission.ACCESS_BACKGROUND_LOCATION"))) {
manifest.first.children.add(
XmlElement(
XmlName("uses-permission"),
[
XmlAttribute(
XmlName("android:name"),
"android.permission.ACCESS_BACKGROUND_LOCATION",
),
],
[],
),
);
}
await AndroidManifestPermissionType.accessBackgroundLocation
.enablePermission();
}
if (enableGoogleMap) {
final file = File("android/app/src/main/AndroidManifest.xml");
if (!file.existsSync()) {
throw Exception(
"AndroidManifest does not exist in `android/app/src/main/AndroidManifest.xml`. Do `katana create` to complete the initial setup of the project.",
);
}
final document = XmlDocument.parse(await file.readAsString());
final manifest = document.findAllElements("manifest");
if (manifest.isEmpty) {
throw Exception(
"The structure of AndroidManifest.xml is broken. Do `katana create` to complete the initial setup of the project.",
);
}
final application = document.findAllElements("application");
if (!application.first.children.any(
(p0) =>
Expand Down Expand Up @@ -148,10 +114,10 @@ class AppLocationCliAction extends CliCommand with CliActionMixin {
),
);
}
await file.writeAsString(
document.toXmlString(pretty: true, indent: " ", newLine: "\n"),
);
}
await file.writeAsString(
document.toXmlString(pretty: true, indent: " ", newLine: "\n"),
);
if (enableGoogleMap) {
label("Edit config.properties");
final configPropertiesFile = File("android/config.properties");
Expand Down
135 changes: 6 additions & 129 deletions packages/katana_cli/lib/action/app/speech_to_text.dart
Original file line number Diff line number Diff line change
@@ -1,8 +1,7 @@
// Dart imports:
import 'dart:io';

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

// Project imports:
import 'package:katana_cli/katana_cli.dart';
Expand Down Expand Up @@ -66,132 +65,10 @@ class AppSpeechToTextCliAction extends CliCommand with CliActionMixin {
await PodfilePermissionType.speechRecognitionUsage
.enablePermissionToPodfile();
label("Edit AndroidManifest.xml.");
final file = File("android/app/src/main/AndroidManifest.xml");
if (!file.existsSync()) {
throw Exception(
"AndroidManifest does not exist in `android/app/src/main/AndroidManifest.xml`. Do `katana create` to complete the initial setup of the project.",
);
}
final document = XmlDocument.parse(await file.readAsString());
final manifest = document.findAllElements("manifest");
if (manifest.isEmpty) {
throw Exception(
"The structure of AndroidManifest.xml is broken. Do `katana create` to complete the initial setup of the project.",
);
}
if (!manifest.first.children.any((p0) =>
p0 is XmlElement &&
p0.name.toString() == "uses-permission" &&
p0.attributes.any((p1) =>
p1.name.toString() == "android:name" &&
p1.value == "android.permission.RECORD_AUDIO"))) {
manifest.first.children.add(
XmlElement(
XmlName("uses-permission"),
[
XmlAttribute(
XmlName("android:name"),
"android.permission.RECORD_AUDIO",
),
],
[],
),
);
}
if (!manifest.first.children.any((p0) =>
p0 is XmlElement &&
p0.name.toString() == "uses-permission" &&
p0.attributes.any((p1) =>
p1.name.toString() == "android:name" &&
p1.value == "android.permission.BLUETOOTH"))) {
manifest.first.children.add(
XmlElement(
XmlName("uses-permission"),
[
XmlAttribute(
XmlName("android:name"),
"android.permission.BLUETOOTH",
),
],
[],
),
);
}
if (!manifest.first.children.any((p0) =>
p0 is XmlElement &&
p0.name.toString() == "uses-permission" &&
p0.attributes.any((p1) =>
p1.name.toString() == "android:name" &&
p1.value == "android.permission.BLUETOOTH_ADMIN"))) {
manifest.first.children.add(
XmlElement(
XmlName("uses-permission"),
[
XmlAttribute(
XmlName("android:name"),
"android.permission.BLUETOOTH_ADMIN",
),
],
[],
),
);
}
if (!manifest.first.children.any((p0) =>
p0 is XmlElement &&
p0.name.toString() == "uses-permission" &&
p0.attributes.any((p1) =>
p1.name.toString() == "android:name" &&
p1.value == "android.permission.BLUETOOTH_CONNECT"))) {
manifest.first.children.add(
XmlElement(
XmlName("uses-permission"),
[
XmlAttribute(
XmlName("android:name"),
"android.permission.BLUETOOTH_CONNECT",
),
],
[],
),
);
}
final queries = manifest.first.children.firstWhereOrNull(
(p0) => p0 is XmlElement && p0.name.toString() == "queries") ??
() {
final q = XmlElement(XmlName("queries"), [], []);
manifest.first.children.insertFirst(q);
return q;
}();
if (!queries.children.any((p0) =>
p0 is XmlElement &&
p0.name.toString() == "intent" &&
p0.children.any((p1) =>
p1 is XmlElement &&
p1.name.toString() == "action" &&
p1.attributes.any((p2) =>
p2.name.toString() == "android:name" &&
p2.value == "android.speech.RecognitionService")))) {
queries.children.add(
XmlElement(
XmlName("intent"),
[],
[
XmlElement(
XmlName("action"),
[
XmlAttribute(
XmlName("android:name"),
"android.speech.RecognitionService",
),
],
[],
),
],
),
);
}
await file.writeAsString(
document.toXmlString(pretty: true, indent: " ", newLine: "\n"),
);
await AndroidManifestPermissionType.recordAudio.enablePermission();
await AndroidManifestPermissionType.bluetooth.enablePermission();
await AndroidManifestPermissionType.bluetoothAdmin.enablePermission();
await AndroidManifestPermissionType.bluetoothConnect.enablePermission();
await AndroidManifestQueryType.speechToText.enableQuery();
}
}
53 changes: 2 additions & 51 deletions 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/src/android_manifest.dart';
import 'package:xml/xml.dart';

// Project imports:
Expand Down Expand Up @@ -73,57 +74,7 @@ class AppTextToSpeechCliAction extends CliCommand with CliActionMixin {
"configProperties[\"flutter.minSdkVersion\"]";
await gradle.save();
label("Edit AndroidManifest.xml.");
final file = File("android/app/src/main/AndroidManifest.xml");
if (!file.existsSync()) {
throw Exception(
"AndroidManifest does not exist in `android/app/src/main/AndroidManifest.xml`. Do `katana create` to complete the initial setup of the project.",
);
}
final document = XmlDocument.parse(await file.readAsString());
final manifest = document.findAllElements("manifest");
if (manifest.isEmpty) {
throw Exception(
"The structure of AndroidManifest.xml is broken. Do `katana create` to complete the initial setup of the project.",
);
}
final queries = manifest.first.children.firstWhereOrNull(
(p0) => p0 is XmlElement && p0.name.toString() == "queries") ??
() {
final q = XmlElement(XmlName("queries"), [], []);
manifest.first.children.insertFirst(q);
return q;
}();
if (!queries.children.any((p0) =>
p0 is XmlElement &&
p0.name.toString() == "intent" &&
p0.children.any((p1) =>
p1 is XmlElement &&
p1.name.toString() == "action" &&
p1.attributes.any((p2) =>
p2.name.toString() == "android:name" &&
p2.value == "android.intent.action.TTS_SERVICE")))) {
queries.children.add(
XmlElement(
XmlName("intent"),
[],
[
XmlElement(
XmlName("action"),
[
XmlAttribute(
XmlName("android:name"),
"android.intent.action.TTS_SERVICE",
),
],
[],
),
],
),
);
}
await file.writeAsString(
document.toXmlString(pretty: true, indent: " ", newLine: "\n"),
);
await AndroidManifestQueryType.textToSpeech.enableQuery();
label("Edit Info.plist.");
final plist = File("ios/Runner/Info.plist");
final plistDocument = XmlDocument.parse(await plist.readAsString());
Expand Down
11 changes: 11 additions & 0 deletions packages/katana_cli/lib/action/firebase/deploy.dart
Original file line number Diff line number Diff line change
Expand Up @@ -59,6 +59,17 @@ class FirebaseDeployCliAction extends CliCommand with CliActionMixin {
);
return;
}
label("Import firestore.indexes.json");
final firestoreIndexes = File("${firebaseDir.path}/firestore.indexes.json");
final indexData = await command(
"Import packages.",
[
firebaseCommand,
"firestore:indexes",
],
workingDirectory: firebaseDir.path,
);
await firestoreIndexes.writeAsString(indexData);
await command(
"Run firebase deploy",
[
Expand Down

0 comments on commit c3c1a05

Please sign in to comment.