-
Notifications
You must be signed in to change notification settings - Fork 17
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Merge branch 'main' into enhance/camera-frame
- Loading branch information
Showing
54 changed files
with
4,419 additions
and
272 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,49 @@ | ||
name: Test Commands in Starter | ||
|
||
on: | ||
pull_request: | ||
branches: | ||
- main | ||
|
||
jobs: | ||
test-modules: | ||
runs-on: ubuntu-latest | ||
timeout-minutes: 20 | ||
defaults: | ||
run: | ||
working-directory: starter | ||
|
||
steps: | ||
- name: Checkout repository | ||
uses: actions/checkout@v2 | ||
|
||
- name: Set up Flutter SDK | ||
uses: subosito/flutter-action@v2 | ||
with: | ||
channel: 'stable' | ||
|
||
- name: Set up Node.js | ||
uses: actions/setup-node@v2 | ||
|
||
- name: Install dependencies | ||
run: npm install | ||
|
||
- name: Run hasCamera command | ||
run: npm run hasCamera platform="ios,android" cameraDescription="Hello world" | ||
continue-on-error: false | ||
|
||
- name: Run hasFileManager command | ||
run: npm run hasFileManager platform="ios,android" photoLibraryDescription="Hello" musicDescription="world" | ||
continue-on-error: false | ||
|
||
- name: Run hasContacts command | ||
run: npm run hasContacts contactsDescription="Hello world" platform="ios,android" | ||
continue-on-error: false | ||
|
||
- name: Run hasConnect command | ||
run: npm run hasConnect platform="ios,android" cameraDescription="Hello world" contactsDescription="Hello world" | ||
continue-on-error: false | ||
|
||
- name: Run hasLocation command | ||
run: npm run hasLocation platform="ios,android" locationDescription="Hello world" alwaysUseLocationDescription="Hello world" inUseLocationDescription="Hello world" | ||
continue-on-error: false |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,6 @@ | ||
// download_stub.dart | ||
import 'dart:typed_data'; | ||
|
||
void downloadFileOnWeb(String fileName, Uint8List fileBytes) { | ||
throw UnsupportedError('downloadFileOnWeb is not supported on this platform'); | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,27 @@ | ||
import 'dart:html' as html; | ||
|
||
import 'package:flutter/foundation.dart'; | ||
Future<void> downloadFileOnWeb(String fileName, Uint8List fileBytes) async { | ||
try { | ||
// Convert Uint8List to a Blob | ||
final blob = html.Blob([fileBytes]); | ||
|
||
// Create an object URL for the Blob | ||
final url = html.Url.createObjectUrlFromBlob(blob); | ||
|
||
// Create a download anchor element | ||
final anchor = html.AnchorElement(href: url) | ||
..target = 'blank' // Open in a new tab if needed | ||
..download = fileName; // Set the download file name | ||
|
||
// Trigger the download | ||
anchor.click(); | ||
|
||
// Revoke the object URL to free resources | ||
html.Url.revokeObjectUrl(url); | ||
|
||
debugPrint('File downloaded: $fileName'); | ||
} catch (e) { | ||
throw Exception('Failed to download file: $e'); | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,98 @@ | ||
import 'dart:convert'; | ||
import 'dart:typed_data'; | ||
|
||
import 'package:ensemble/framework/action.dart'; | ||
import 'package:ensemble/framework/scope.dart'; | ||
import 'package:flutter/material.dart'; | ||
import 'package:ensemble/framework/error_handling.dart'; | ||
import 'package:flutter/foundation.dart'; | ||
import 'package:http/http.dart' as http; | ||
import 'save_mobile.dart'; | ||
|
||
/// Custom action to save files (images and documents) in platform-specific accessible directories | ||
class SaveToFileSystemAction extends EnsembleAction { | ||
final String? fileName; | ||
final dynamic blobData; | ||
final String? source; // Optional source for URL if blobData is not available | ||
final String? type; // file type | ||
|
||
SaveToFileSystemAction({ | ||
required this.fileName, | ||
this.blobData, | ||
this.source, | ||
this.type, | ||
}); | ||
|
||
factory SaveToFileSystemAction.from({Map? payload}) { | ||
if (payload == null || payload['fileName'] == null) { | ||
throw LanguageError('${ActionType.saveFile.name} requires fileName.'); | ||
} | ||
|
||
return SaveToFileSystemAction( | ||
fileName: payload['fileName'], | ||
blobData: payload['blobData'], | ||
source: payload['source'], | ||
type: payload['type'], | ||
); | ||
} | ||
|
||
@override | ||
Future<void> execute(BuildContext context, ScopeManager scopeManager) async { | ||
try { | ||
if (fileName == null) { | ||
throw Exception('Missing required parameter: fileName.'); | ||
} | ||
|
||
Uint8List? fileBytes; | ||
|
||
// If blobData is provided, process it | ||
if (blobData != null) { | ||
// Handle base64 blob or binary data | ||
if (blobData is String) { | ||
fileBytes = base64Decode(blobData); // Decode base64 | ||
} else if (blobData is List<int>) { | ||
fileBytes = Uint8List.fromList(blobData); | ||
} else { | ||
throw Exception( | ||
'Invalid blob data format. Must be base64 or List<int>.'); | ||
} | ||
} else if (source != null) { | ||
// If blobData is not available, check for source (network URL) | ||
final response = await http.get(Uri.parse(source!)); | ||
if (response.statusCode == 200) { | ||
fileBytes = Uint8List.fromList(response.bodyBytes); | ||
} else { | ||
throw Exception( | ||
'Failed to download file: HTTP ${response.statusCode}'); | ||
} | ||
} else { | ||
throw Exception('Missing blobData and source.'); | ||
} | ||
|
||
// Save the file to the storage system | ||
await _saveFile(type!, fileName!, fileBytes); | ||
} catch (e) { | ||
throw Exception('Failed to save file: $e'); | ||
} | ||
} | ||
|
||
Future<void> _saveFile( | ||
String type, String fileName, Uint8List fileBytes) async { | ||
if (type == 'image') { | ||
// Save images to Default Image Path | ||
await saveImageToDCIM(fileName!, fileBytes); | ||
} else if (type == 'document') { | ||
// Save documents to Documents folder | ||
await saveDocumentToDocumentsFolder(fileName!, fileBytes); | ||
} | ||
} | ||
|
||
/// Factory method to construct the action from JSON | ||
static SaveToFileSystemAction fromJson(Map<String, dynamic> json) { | ||
return SaveToFileSystemAction( | ||
fileName: json['fileName'], | ||
blobData: json['blobData'], | ||
source: json['source'], | ||
); | ||
} | ||
} |
Oops, something went wrong.