Сергей Марков
11 months ago
45 changed files with 1603 additions and 0 deletions
@ -0,0 +1,29 @@ |
|||||||
|
# Miscellaneous |
||||||
|
*.class |
||||||
|
*.log |
||||||
|
*.pyc |
||||||
|
*.swp |
||||||
|
.DS_Store |
||||||
|
.atom/ |
||||||
|
.buildlog/ |
||||||
|
.history |
||||||
|
.svn/ |
||||||
|
migrate_working_dir/ |
||||||
|
|
||||||
|
# IntelliJ related |
||||||
|
*.iml |
||||||
|
*.ipr |
||||||
|
*.iws |
||||||
|
.idea/ |
||||||
|
|
||||||
|
# The .vscode folder contains launch configuration and tasks you configure in |
||||||
|
# VS Code which you may wish to be included in version control, so this line |
||||||
|
# is commented out by default. |
||||||
|
#.vscode/ |
||||||
|
|
||||||
|
# Flutter/Dart/Pub related |
||||||
|
# Libraries should not include pubspec.lock, per https://dart.dev/guides/libraries/private-files#pubspeclock. |
||||||
|
/pubspec.lock |
||||||
|
**/doc/api/ |
||||||
|
.dart_tool/ |
||||||
|
build/ |
@ -0,0 +1,3 @@ |
|||||||
|
[submodule "aurora/sstore"] |
||||||
|
path = aurora/sstore |
||||||
|
url = git@git.markow.su:aurora/sstore.git |
@ -0,0 +1,33 @@ |
|||||||
|
# This file tracks properties of this Flutter project. |
||||||
|
# Used by Flutter tool to assess capabilities and perform upgrades etc. |
||||||
|
# |
||||||
|
# This file should be version controlled and should not be manually edited. |
||||||
|
|
||||||
|
version: |
||||||
|
revision: "d3e00ac70443dbc0df7d0b56bff94c18d760b02f" |
||||||
|
channel: "master" |
||||||
|
|
||||||
|
project_type: plugin |
||||||
|
|
||||||
|
# Tracks metadata for the flutter migrate command |
||||||
|
migration: |
||||||
|
platforms: |
||||||
|
- platform: root |
||||||
|
create_revision: d3e00ac70443dbc0df7d0b56bff94c18d760b02f |
||||||
|
base_revision: d3e00ac70443dbc0df7d0b56bff94c18d760b02f |
||||||
|
- platform: linux |
||||||
|
create_revision: d3e00ac70443dbc0df7d0b56bff94c18d760b02f |
||||||
|
base_revision: d3e00ac70443dbc0df7d0b56bff94c18d760b02f |
||||||
|
- platform: aurora |
||||||
|
create_revision: d3e00ac70443dbc0df7d0b56bff94c18d760b02f |
||||||
|
base_revision: d3e00ac70443dbc0df7d0b56bff94c18d760b02f |
||||||
|
|
||||||
|
# User provided section |
||||||
|
|
||||||
|
# List of Local paths (relative to this file) that should be |
||||||
|
# ignored by the migrate tool. |
||||||
|
# |
||||||
|
# Files that are not part of the templates will be ignored by default. |
||||||
|
unmanaged_files: |
||||||
|
- 'lib/main.dart' |
||||||
|
- 'ios/Runner.xcodeproj/project.pbxproj' |
@ -0,0 +1,4 @@ |
|||||||
|
include: package:flutter_lints/flutter.yaml |
||||||
|
|
||||||
|
# Additional information about this file can be found at |
||||||
|
# https://dart.dev/guides/language/analysis-options |
@ -0,0 +1,34 @@ |
|||||||
|
cmake_minimum_required(VERSION 3.10) |
||||||
|
|
||||||
|
set(PROJECT_NAME secure_storage) |
||||||
|
set(PLUGIN_NAME secure_storage_platform_plugin) |
||||||
|
|
||||||
|
project(${PROJECT_NAME} LANGUAGES CXX) |
||||||
|
|
||||||
|
set(CMAKE_CXX_STANDARD 17) |
||||||
|
set(CMAKE_CXX_STANDARD_REQUIRED ON) |
||||||
|
|
||||||
|
set(CMAKE_CXX_FLAGS "-Wall -Wextra -Wno-psabi") |
||||||
|
set(CMAKE_CXX_FLAGS_RELEASE "-O3") |
||||||
|
|
||||||
|
set(CMAKE_AUTOMOC ON) |
||||||
|
|
||||||
|
find_package(PkgConfig REQUIRED) |
||||||
|
find_package(Qt5 COMPONENTS Core DBus REQUIRED) |
||||||
|
pkg_check_modules(FlutterEmbedder REQUIRED IMPORTED_TARGET flutter-embedder) |
||||||
|
|
||||||
|
add_subdirectory(sstore) |
||||||
|
add_library(${PLUGIN_NAME} SHARED |
||||||
|
secure_storage_plugin.cpp |
||||||
|
${CMAKE_CURRENT_SOURCE_DIR}/sstore/include/datastorage.h |
||||||
|
${CMAKE_CURRENT_SOURCE_DIR}/sstore/datastorage.cpp) |
||||||
|
|
||||||
|
set_target_properties(${PLUGIN_NAME} PROPERTIES CXX_VISIBILITY_PRESET hidden) |
||||||
|
target_link_libraries(${PLUGIN_NAME} PRIVATE PkgConfig::FlutterEmbedder) |
||||||
|
target_link_libraries(${PLUGIN_NAME} PUBLIC Qt5::Core Qt5::DBus) |
||||||
|
|
||||||
|
target_include_directories(${PLUGIN_NAME} |
||||||
|
PUBLIC |
||||||
|
${CMAKE_CURRENT_SOURCE_DIR}/include |
||||||
|
${SStoreInclude}) |
||||||
|
target_compile_definitions(${PLUGIN_NAME} PRIVATE PLUGIN_IMPL) |
@ -0,0 +1,10 @@ |
|||||||
|
#ifndef FLUTTER_PLUGIN_SECURE_STORAGE_PLUGIN_GLOBALS_H |
||||||
|
#define FLUTTER_PLUGIN_SECURE_STORAGE_PLUGIN_GLOBALS_H |
||||||
|
|
||||||
|
#ifdef PLUGIN_IMPL |
||||||
|
#define PLUGIN_EXPORT __attribute__((visibility("default"))) |
||||||
|
#else |
||||||
|
#define PLUGIN_EXPORT |
||||||
|
#endif |
||||||
|
|
||||||
|
#endif /* FLUTTER_PLUGIN_SECURE_STORAGE_PLUGIN_GLOBALS_H */ |
@ -0,0 +1,19 @@ |
|||||||
|
#ifndef FLUTTER_PLUGIN_SECURE_STORAGE_PLUGIN_H |
||||||
|
#define FLUTTER_PLUGIN_SECURE_STORAGE_PLUGIN_H |
||||||
|
|
||||||
|
#include <flutter/plugin-interface.h> |
||||||
|
#include <secure_storage/globals.h> |
||||||
|
#include <datastorage.h> |
||||||
|
|
||||||
|
class PLUGIN_EXPORT SecureStoragePlugin final : public PluginInterface |
||||||
|
{ |
||||||
|
public: |
||||||
|
void RegisterWithRegistrar(PluginRegistrar ®istrar) override; |
||||||
|
|
||||||
|
private: |
||||||
|
DataStorage storage{}; |
||||||
|
void onMethodCall(const MethodCall &call); |
||||||
|
void unimplemented(const MethodCall &call); |
||||||
|
}; |
||||||
|
|
||||||
|
#endif /* FLUTTER_PLUGIN_SECURE_STORAGE_PLUGIN_H */ |
@ -0,0 +1,26 @@ |
|||||||
|
#include <secure_storage/secure_storage_plugin.h> |
||||||
|
#include <flutter/method-channel.h> |
||||||
|
|
||||||
|
void SecureStoragePlugin::RegisterWithRegistrar(PluginRegistrar ®istrar) |
||||||
|
{ |
||||||
|
registrar.RegisterMethodChannel("secure_storage", |
||||||
|
MethodCodecType::Standard, |
||||||
|
[this](const MethodCall &call) { this->onMethodCall(call); }); |
||||||
|
} |
||||||
|
|
||||||
|
void SecureStoragePlugin::onMethodCall(const MethodCall &call) |
||||||
|
{ |
||||||
|
const auto &method = call.GetMethod(); |
||||||
|
|
||||||
|
if (method == "available") { |
||||||
|
call.SendSuccessResponse(storage.available()); |
||||||
|
return; |
||||||
|
} |
||||||
|
|
||||||
|
unimplemented(call); |
||||||
|
} |
||||||
|
|
||||||
|
void SecureStoragePlugin::unimplemented(const MethodCall &call) |
||||||
|
{ |
||||||
|
call.SendSuccessResponse(nullptr); |
||||||
|
} |
@ -0,0 +1,46 @@ |
|||||||
|
# Miscellaneous |
||||||
|
*.class |
||||||
|
*.log |
||||||
|
*.pyc |
||||||
|
*.swp |
||||||
|
.DS_Store |
||||||
|
.atom/ |
||||||
|
.buildlog/ |
||||||
|
.history |
||||||
|
.svn/ |
||||||
|
migrate_working_dir/ |
||||||
|
|
||||||
|
# IntelliJ related |
||||||
|
*.iml |
||||||
|
*.ipr |
||||||
|
*.iws |
||||||
|
.idea/ |
||||||
|
|
||||||
|
# The .vscode folder contains launch configuration and tasks you configure in |
||||||
|
# VS Code which you may wish to be included in version control, so this line |
||||||
|
# is commented out by default. |
||||||
|
#.vscode/ |
||||||
|
|
||||||
|
# Flutter/Dart/Pub related |
||||||
|
**/doc/api/ |
||||||
|
**/ios/Flutter/.last_build_id |
||||||
|
.dart_tool/ |
||||||
|
.flutter-plugins |
||||||
|
.flutter-plugins-dependencies |
||||||
|
.pub-cache/ |
||||||
|
.pub/ |
||||||
|
/build/ |
||||||
|
|
||||||
|
# Symbolication related |
||||||
|
app.*.symbols |
||||||
|
|
||||||
|
# Obfuscation related |
||||||
|
app.*.map.json |
||||||
|
|
||||||
|
# Android Studio will place build artifacts here |
||||||
|
/android/app/debug |
||||||
|
/android/app/profile |
||||||
|
/android/app/release |
||||||
|
|
||||||
|
# Aurora generated |
||||||
|
/aurora/flutter |
@ -0,0 +1,16 @@ |
|||||||
|
# secure_storage_example |
||||||
|
|
||||||
|
Demonstrates how to use the secure_storage plugin. |
||||||
|
|
||||||
|
## Getting Started |
||||||
|
|
||||||
|
This project is a starting point for a Flutter application. |
||||||
|
|
||||||
|
A few resources to get you started if this is your first Flutter project: |
||||||
|
|
||||||
|
- [Lab: Write your first Flutter app](https://docs.flutter.dev/get-started/codelab) |
||||||
|
- [Cookbook: Useful Flutter samples](https://docs.flutter.dev/cookbook) |
||||||
|
|
||||||
|
For help getting started with Flutter development, view the |
||||||
|
[online documentation](https://docs.flutter.dev/), which offers tutorials, |
||||||
|
samples, guidance on mobile development, and a full API reference. |
@ -0,0 +1,28 @@ |
|||||||
|
# This file configures the analyzer, which statically analyzes Dart code to |
||||||
|
# check for errors, warnings, and lints. |
||||||
|
# |
||||||
|
# The issues identified by the analyzer are surfaced in the UI of Dart-enabled |
||||||
|
# IDEs (https://dart.dev/tools#ides-and-editors). The analyzer can also be |
||||||
|
# invoked from the command line by running `flutter analyze`. |
||||||
|
|
||||||
|
# The following line activates a set of recommended lints for Flutter apps, |
||||||
|
# packages, and plugins designed to encourage good coding practices. |
||||||
|
include: package:flutter_lints/flutter.yaml |
||||||
|
|
||||||
|
linter: |
||||||
|
# The lint rules applied to this project can be customized in the |
||||||
|
# section below to disable rules from the `package:flutter_lints/flutter.yaml` |
||||||
|
# included above or to enable additional rules. A list of all available lints |
||||||
|
# and their documentation is published at https://dart.dev/lints. |
||||||
|
# |
||||||
|
# Instead of disabling a lint rule for the entire project in the |
||||||
|
# section below, it can also be suppressed for a single line of code |
||||||
|
# or a specific dart file by using the `// ignore: name_of_lint` and |
||||||
|
# `// ignore_for_file: name_of_lint` syntax on the line or in the file |
||||||
|
# producing the lint. |
||||||
|
rules: |
||||||
|
# avoid_print: false # Uncomment to disable the `avoid_print` rule |
||||||
|
# prefer_single_quotes: true # Uncomment to enable the `prefer_single_quotes` rule |
||||||
|
|
||||||
|
# Additional information about this file can be found at |
||||||
|
# https://dart.dev/guides/language/analysis-options |
@ -0,0 +1,47 @@ |
|||||||
|
cmake_minimum_required(VERSION 3.10) |
||||||
|
project(com.example.secure_storage_example LANGUAGES CXX) |
||||||
|
|
||||||
|
include(GNUInstallDirs) |
||||||
|
|
||||||
|
set(BINARY_NAME ${CMAKE_PROJECT_NAME}) |
||||||
|
set(FLUTTER_DIR ${CMAKE_CURRENT_SOURCE_DIR}/flutter) |
||||||
|
|
||||||
|
set(CMAKE_CXX_STANDARD 17) |
||||||
|
set(CMAKE_CXX_STANDARD_REQUIRED ON) |
||||||
|
|
||||||
|
set(CMAKE_CXX_FLAGS "-Wall -Wextra") |
||||||
|
set(CMAKE_CXX_FLAGS_RELEASE "-O3") |
||||||
|
|
||||||
|
set(CMAKE_SKIP_RPATH OFF) |
||||||
|
set(CMAKE_INSTALL_RPATH "\$ORIGIN/../share/${BINARY_NAME}/lib") |
||||||
|
|
||||||
|
find_package(PkgConfig REQUIRED) |
||||||
|
pkg_check_modules(FlutterEmbedder REQUIRED IMPORTED_TARGET flutter-embedder) |
||||||
|
|
||||||
|
add_executable(${BINARY_NAME} main.cpp ${FLUTTER_DIR}/generated_plugin_registrant.cpp) |
||||||
|
target_link_libraries(${BINARY_NAME} PRIVATE PkgConfig::FlutterEmbedder) |
||||||
|
target_include_directories(${BINARY_NAME} PRIVATE ${FLUTTER_DIR}) |
||||||
|
|
||||||
|
include(flutter/generated_plugins.cmake) |
||||||
|
|
||||||
|
set(PACKAGE_INSTALL_DIR ${CMAKE_INSTALL_DATADIR}/${BINARY_NAME}) |
||||||
|
set(DESKTOP_INSTALL_DIR ${CMAKE_INSTALL_DATADIR}/applications) |
||||||
|
set(ICONS_INSTALL_ROOT_DIR ${CMAKE_INSTALL_DATADIR}/icons/hicolor) |
||||||
|
|
||||||
|
add_custom_command(TARGET ${BINARY_NAME} POST_BUILD |
||||||
|
COMMAND ${CMAKE_COMMAND} -E copy |
||||||
|
${CMAKE_INSTALL_PREFIX}/${CMAKE_INSTALL_LIBDIR}/libflutter-embedder.so |
||||||
|
${PROJECT_BINARY_DIR}/bundle/lib/libflutter-embedder.so) |
||||||
|
|
||||||
|
install(FILES ${PROJECT_BINARY_DIR}/bundle/icudtl.dat DESTINATION ${PACKAGE_INSTALL_DIR}) |
||||||
|
install(DIRECTORY ${PROJECT_BINARY_DIR}/bundle/flutter_assets DESTINATION ${PACKAGE_INSTALL_DIR}) |
||||||
|
install(DIRECTORY ${PROJECT_BINARY_DIR}/bundle/lib DESTINATION ${PACKAGE_INSTALL_DIR}) |
||||||
|
|
||||||
|
install(TARGETS ${BINARY_NAME} RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}) |
||||||
|
install(FILES desktop/${BINARY_NAME}.desktop DESTINATION ${DESKTOP_INSTALL_DIR}) |
||||||
|
|
||||||
|
foreach(ICONS_SIZE 86x86 108x108 128x128 172x172) |
||||||
|
install(FILES icons/${ICONS_SIZE}.png |
||||||
|
RENAME ${BINARY_NAME}.png |
||||||
|
DESTINATION ${ICONS_INSTALL_ROOT_DIR}/${ICONS_SIZE}/apps/) |
||||||
|
endforeach(ICONS_SIZE) |
@ -0,0 +1,12 @@ |
|||||||
|
[Desktop Entry] |
||||||
|
Type=Application |
||||||
|
Name=secure_storage_example |
||||||
|
Comment=Demonstrates how to use the secure_storage plugin. |
||||||
|
Icon=com.example.secure_storage_example |
||||||
|
Exec=/usr/bin/com.example.secure_storage_example |
||||||
|
X-Nemo-Application-Type=silica-qt5 |
||||||
|
|
||||||
|
[X-Application] |
||||||
|
Permissions= |
||||||
|
OrganizationName=com.example |
||||||
|
ApplicationName=secure_storage_example |
After Width: | Height: | Size: 9.7 KiB |
After Width: | Height: | Size: 13 KiB |
After Width: | Height: | Size: 23 KiB |
After Width: | Height: | Size: 6.5 KiB |
@ -0,0 +1,9 @@ |
|||||||
|
#include <flutter/application.h> |
||||||
|
#include "generated_plugin_registrant.h" |
||||||
|
|
||||||
|
int main(int argc, char *argv[]) { |
||||||
|
Application::Initialize(argc, argv); |
||||||
|
RegisterPlugins(); |
||||||
|
Application::Launch(); |
||||||
|
return 0; |
||||||
|
} |
@ -0,0 +1,32 @@ |
|||||||
|
%global __provides_exclude_from ^%{_datadir}/%{name}/lib/.*$ |
||||||
|
%global __requires_exclude ^lib(dconf|flutter-embedder|maliit-glib|.+_platform_plugin)\\.so.*$ |
||||||
|
|
||||||
|
Name: com.example.secure_storage_example |
||||||
|
Summary: Demonstrates how to use the secure_storage plugin. |
||||||
|
Version: 0.1.0 |
||||||
|
Release: 1 |
||||||
|
License: Proprietary |
||||||
|
Source0: %{name}-%{version}.tar.zst |
||||||
|
|
||||||
|
BuildRequires: cmake |
||||||
|
BuildRequires: ninja |
||||||
|
BuildRequires: pkgconfig(flutter-embedder) |
||||||
|
|
||||||
|
%description |
||||||
|
%{summary}. |
||||||
|
|
||||||
|
%prep |
||||||
|
%autosetup |
||||||
|
|
||||||
|
%build |
||||||
|
%cmake -GNinja -DCMAKE_BUILD_TYPE=%{_flutter_build_type} |
||||||
|
%ninja_build |
||||||
|
|
||||||
|
%install |
||||||
|
%ninja_install |
||||||
|
|
||||||
|
%files |
||||||
|
%{_bindir}/%{name} |
||||||
|
%{_datadir}/%{name}/* |
||||||
|
%{_datadir}/applications/%{name}.desktop |
||||||
|
%{_datadir}/icons/hicolor/*/apps/%{name}.png |
@ -0,0 +1,25 @@ |
|||||||
|
// This is a basic Flutter integration test. |
||||||
|
// |
||||||
|
// Since integration tests run in a full Flutter application, they can interact |
||||||
|
// with the host side of a plugin implementation, unlike Dart unit tests. |
||||||
|
// |
||||||
|
// For more information about Flutter integration tests, please see |
||||||
|
// https://docs.flutter.dev/cookbook/testing/integration/introduction |
||||||
|
|
||||||
|
|
||||||
|
import 'package:flutter_test/flutter_test.dart'; |
||||||
|
import 'package:integration_test/integration_test.dart'; |
||||||
|
|
||||||
|
import 'package:secure_storage/secure_storage.dart'; |
||||||
|
|
||||||
|
void main() { |
||||||
|
IntegrationTestWidgetsFlutterBinding.ensureInitialized(); |
||||||
|
|
||||||
|
testWidgets('getPlatformVersion test', (WidgetTester tester) async { |
||||||
|
final SecureStorage plugin = SecureStorage(); |
||||||
|
final String? version = await plugin.getPlatformVersion(); |
||||||
|
// The version string depends on the host platform running the test, so |
||||||
|
// just assert that some non-empty string is returned. |
||||||
|
expect(version?.isNotEmpty, true); |
||||||
|
}); |
||||||
|
} |
@ -0,0 +1,63 @@ |
|||||||
|
import 'package:flutter/material.dart'; |
||||||
|
import 'dart:async'; |
||||||
|
|
||||||
|
import 'package:flutter/services.dart'; |
||||||
|
import 'package:secure_storage/secure_storage.dart'; |
||||||
|
|
||||||
|
void main() { |
||||||
|
runApp(const MyApp()); |
||||||
|
} |
||||||
|
|
||||||
|
class MyApp extends StatefulWidget { |
||||||
|
const MyApp({super.key}); |
||||||
|
|
||||||
|
@override |
||||||
|
State<MyApp> createState() => _MyAppState(); |
||||||
|
} |
||||||
|
|
||||||
|
class _MyAppState extends State<MyApp> { |
||||||
|
String _platformVersion = 'Unknown'; |
||||||
|
final _secureStoragePlugin = SecureStorage(); |
||||||
|
|
||||||
|
@override |
||||||
|
void initState() { |
||||||
|
super.initState(); |
||||||
|
initPlatformState(); |
||||||
|
} |
||||||
|
|
||||||
|
// Platform messages are asynchronous, so we initialize in an async method. |
||||||
|
Future<void> initPlatformState() async { |
||||||
|
String platformVersion; |
||||||
|
// Platform messages may fail, so we use a try/catch PlatformException. |
||||||
|
// We also handle the message potentially returning null. |
||||||
|
try { |
||||||
|
platformVersion = |
||||||
|
await _secureStoragePlugin.getPlatformVersion() ?? 'Unknown platform version'; |
||||||
|
} on PlatformException { |
||||||
|
platformVersion = 'Failed to get platform version.'; |
||||||
|
} |
||||||
|
|
||||||
|
// If the widget was removed from the tree while the asynchronous platform |
||||||
|
// message was in flight, we want to discard the reply rather than calling |
||||||
|
// setState to update our non-existent appearance. |
||||||
|
if (!mounted) return; |
||||||
|
|
||||||
|
setState(() { |
||||||
|
_platformVersion = platformVersion; |
||||||
|
}); |
||||||
|
} |
||||||
|
|
||||||
|
@override |
||||||
|
Widget build(BuildContext context) { |
||||||
|
return MaterialApp( |
||||||
|
home: Scaffold( |
||||||
|
appBar: AppBar( |
||||||
|
title: const Text('Plugin example app'), |
||||||
|
), |
||||||
|
body: Center( |
||||||
|
child: Text('Running on: $_platformVersion\n'), |
||||||
|
), |
||||||
|
), |
||||||
|
); |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,147 @@ |
|||||||
|
# Project-level configuration. |
||||||
|
cmake_minimum_required(VERSION 3.10) |
||||||
|
project(runner LANGUAGES CXX) |
||||||
|
|
||||||
|
# The name of the executable created for the application. Change this to change |
||||||
|
# the on-disk name of your application. |
||||||
|
set(BINARY_NAME "secure_storage_example") |
||||||
|
# The unique GTK application identifier for this application. See: |
||||||
|
# https://wiki.gnome.org/HowDoI/ChooseApplicationID |
||||||
|
set(APPLICATION_ID "com.example.secure_storage") |
||||||
|
|
||||||
|
# Explicitly opt in to modern CMake behaviors to avoid warnings with recent |
||||||
|
# versions of CMake. |
||||||
|
cmake_policy(SET CMP0063 NEW) |
||||||
|
|
||||||
|
# Load bundled libraries from the lib/ directory relative to the binary. |
||||||
|
set(CMAKE_INSTALL_RPATH "$ORIGIN/lib") |
||||||
|
|
||||||
|
# Root filesystem for cross-building. |
||||||
|
if(FLUTTER_TARGET_PLATFORM_SYSROOT) |
||||||
|
set(CMAKE_SYSROOT ${FLUTTER_TARGET_PLATFORM_SYSROOT}) |
||||||
|
set(CMAKE_FIND_ROOT_PATH ${CMAKE_SYSROOT}) |
||||||
|
set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER) |
||||||
|
set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY) |
||||||
|
set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY) |
||||||
|
set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY) |
||||||
|
endif() |
||||||
|
|
||||||
|
# Define build configuration options. |
||||||
|
if(NOT CMAKE_BUILD_TYPE AND NOT CMAKE_CONFIGURATION_TYPES) |
||||||
|
set(CMAKE_BUILD_TYPE "Debug" CACHE |
||||||
|
STRING "Flutter build mode" FORCE) |
||||||
|
set_property(CACHE CMAKE_BUILD_TYPE PROPERTY STRINGS |
||||||
|
"Debug" "Profile" "Release") |
||||||
|
endif() |
||||||
|
|
||||||
|
# Compilation settings that should be applied to most targets. |
||||||
|
# |
||||||
|
# Be cautious about adding new options here, as plugins use this function by |
||||||
|
# default. In most cases, you should add new options to specific targets instead |
||||||
|
# of modifying this function. |
||||||
|
function(APPLY_STANDARD_SETTINGS TARGET) |
||||||
|
target_compile_features(${TARGET} PUBLIC cxx_std_14) |
||||||
|
target_compile_options(${TARGET} PRIVATE -Wall -Werror) |
||||||
|
target_compile_options(${TARGET} PRIVATE "$<$<NOT:$<CONFIG:Debug>>:-O3>") |
||||||
|
target_compile_definitions(${TARGET} PRIVATE "$<$<NOT:$<CONFIG:Debug>>:NDEBUG>") |
||||||
|
endfunction() |
||||||
|
|
||||||
|
# Flutter library and tool build rules. |
||||||
|
set(FLUTTER_MANAGED_DIR "${CMAKE_CURRENT_SOURCE_DIR}/flutter") |
||||||
|
add_subdirectory(${FLUTTER_MANAGED_DIR}) |
||||||
|
|
||||||
|
# System-level dependencies. |
||||||
|
find_package(PkgConfig REQUIRED) |
||||||
|
pkg_check_modules(GTK REQUIRED IMPORTED_TARGET gtk+-3.0) |
||||||
|
|
||||||
|
add_definitions(-DAPPLICATION_ID="${APPLICATION_ID}") |
||||||
|
|
||||||
|
# Define the application target. To change its name, change BINARY_NAME above, |
||||||
|
# not the value here, or `flutter run` will no longer work. |
||||||
|
# |
||||||
|
# Any new source files that you add to the application should be added here. |
||||||
|
add_executable(${BINARY_NAME} |
||||||
|
"main.cc" |
||||||
|
"my_application.cc" |
||||||
|
"${FLUTTER_MANAGED_DIR}/generated_plugin_registrant.cc" |
||||||
|
) |
||||||
|
|
||||||
|
# Apply the standard set of build settings. This can be removed for applications |
||||||
|
# that need different build settings. |
||||||
|
apply_standard_settings(${BINARY_NAME}) |
||||||
|
|
||||||
|
# Add dependency libraries. Add any application-specific dependencies here. |
||||||
|
target_link_libraries(${BINARY_NAME} PRIVATE flutter) |
||||||
|
target_link_libraries(${BINARY_NAME} PRIVATE PkgConfig::GTK) |
||||||
|
|
||||||
|
# Run the Flutter tool portions of the build. This must not be removed. |
||||||
|
add_dependencies(${BINARY_NAME} flutter_assemble) |
||||||
|
|
||||||
|
# Only the install-generated bundle's copy of the executable will launch |
||||||
|
# correctly, since the resources must in the right relative locations. To avoid |
||||||
|
# people trying to run the unbundled copy, put it in a subdirectory instead of |
||||||
|
# the default top-level location. |
||||||
|
set_target_properties(${BINARY_NAME} |
||||||
|
PROPERTIES |
||||||
|
RUNTIME_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/intermediates_do_not_run" |
||||||
|
) |
||||||
|
|
||||||
|
# Enable the test target. |
||||||
|
set(include_secure_storage_tests TRUE) |
||||||
|
|
||||||
|
# Generated plugin build rules, which manage building the plugins and adding |
||||||
|
# them to the application. |
||||||
|
include(flutter/generated_plugins.cmake) |
||||||
|
|
||||||
|
|
||||||
|
# === Installation === |
||||||
|
# By default, "installing" just makes a relocatable bundle in the build |
||||||
|
# directory. |
||||||
|
set(BUILD_BUNDLE_DIR "${PROJECT_BINARY_DIR}/bundle") |
||||||
|
if(CMAKE_INSTALL_PREFIX_INITIALIZED_TO_DEFAULT) |
||||||
|
set(CMAKE_INSTALL_PREFIX "${BUILD_BUNDLE_DIR}" CACHE PATH "..." FORCE) |
||||||
|
endif() |
||||||
|
|
||||||
|
# Start with a clean build bundle directory every time. |
||||||
|
install(CODE " |
||||||
|
file(REMOVE_RECURSE \"${BUILD_BUNDLE_DIR}/\") |
||||||
|
" COMPONENT Runtime) |
||||||
|
|
||||||
|
set(INSTALL_BUNDLE_DATA_DIR "${CMAKE_INSTALL_PREFIX}/data") |
||||||
|
set(INSTALL_BUNDLE_LIB_DIR "${CMAKE_INSTALL_PREFIX}/lib") |
||||||
|
|
||||||
|
install(TARGETS ${BINARY_NAME} RUNTIME DESTINATION "${CMAKE_INSTALL_PREFIX}" |
||||||
|
COMPONENT Runtime) |
||||||
|
|
||||||
|
install(FILES "${FLUTTER_ICU_DATA_FILE}" DESTINATION "${INSTALL_BUNDLE_DATA_DIR}" |
||||||
|
COMPONENT Runtime) |
||||||
|
|
||||||
|
install(FILES "${FLUTTER_LIBRARY}" DESTINATION "${INSTALL_BUNDLE_LIB_DIR}" |
||||||
|
COMPONENT Runtime) |
||||||
|
|
||||||
|
foreach(bundled_library ${PLUGIN_BUNDLED_LIBRARIES}) |
||||||
|
install(FILES "${bundled_library}" |
||||||
|
DESTINATION "${INSTALL_BUNDLE_LIB_DIR}" |
||||||
|
COMPONENT Runtime) |
||||||
|
endforeach(bundled_library) |
||||||
|
|
||||||
|
# Copy the native assets provided by the build.dart from all packages. |
||||||
|
set(NATIVE_ASSETS_DIR "${PROJECT_BUILD_DIR}native_assets/linux/") |
||||||
|
install(DIRECTORY "${NATIVE_ASSETS_DIR}" |
||||||
|
DESTINATION "${INSTALL_BUNDLE_LIB_DIR}" |
||||||
|
COMPONENT Runtime) |
||||||
|
|
||||||
|
# Fully re-copy the assets directory on each build to avoid having stale files |
||||||
|
# from a previous install. |
||||||
|
set(FLUTTER_ASSET_DIR_NAME "flutter_assets") |
||||||
|
install(CODE " |
||||||
|
file(REMOVE_RECURSE \"${INSTALL_BUNDLE_DATA_DIR}/${FLUTTER_ASSET_DIR_NAME}\") |
||||||
|
" COMPONENT Runtime) |
||||||
|
install(DIRECTORY "${PROJECT_BUILD_DIR}/${FLUTTER_ASSET_DIR_NAME}" |
||||||
|
DESTINATION "${INSTALL_BUNDLE_DATA_DIR}" COMPONENT Runtime) |
||||||
|
|
||||||
|
# Install the AOT library on non-Debug builds only. |
||||||
|
if(NOT CMAKE_BUILD_TYPE MATCHES "Debug") |
||||||
|
install(FILES "${AOT_LIBRARY}" DESTINATION "${INSTALL_BUNDLE_LIB_DIR}" |
||||||
|
COMPONENT Runtime) |
||||||
|
endif() |
@ -0,0 +1,88 @@ |
|||||||
|
# This file controls Flutter-level build steps. It should not be edited. |
||||||
|
cmake_minimum_required(VERSION 3.10) |
||||||
|
|
||||||
|
set(EPHEMERAL_DIR "${CMAKE_CURRENT_SOURCE_DIR}/ephemeral") |
||||||
|
|
||||||
|
# Configuration provided via flutter tool. |
||||||
|
include(${EPHEMERAL_DIR}/generated_config.cmake) |
||||||
|
|
||||||
|
# TODO: Move the rest of this into files in ephemeral. See |
||||||
|
# https://github.com/flutter/flutter/issues/57146. |
||||||
|
|
||||||
|
# Serves the same purpose as list(TRANSFORM ... PREPEND ...), |
||||||
|
# which isn't available in 3.10. |
||||||
|
function(list_prepend LIST_NAME PREFIX) |
||||||
|
set(NEW_LIST "") |
||||||
|
foreach(element ${${LIST_NAME}}) |
||||||
|
list(APPEND NEW_LIST "${PREFIX}${element}") |
||||||
|
endforeach(element) |
||||||
|
set(${LIST_NAME} "${NEW_LIST}" PARENT_SCOPE) |
||||||
|
endfunction() |
||||||
|
|
||||||
|
# === Flutter Library === |
||||||
|
# System-level dependencies. |
||||||
|
find_package(PkgConfig REQUIRED) |
||||||
|
pkg_check_modules(GTK REQUIRED IMPORTED_TARGET gtk+-3.0) |
||||||
|
pkg_check_modules(GLIB REQUIRED IMPORTED_TARGET glib-2.0) |
||||||
|
pkg_check_modules(GIO REQUIRED IMPORTED_TARGET gio-2.0) |
||||||
|
|
||||||
|
set(FLUTTER_LIBRARY "${EPHEMERAL_DIR}/libflutter_linux_gtk.so") |
||||||
|
|
||||||
|
# Published to parent scope for install step. |
||||||
|
set(FLUTTER_LIBRARY ${FLUTTER_LIBRARY} PARENT_SCOPE) |
||||||
|
set(FLUTTER_ICU_DATA_FILE "${EPHEMERAL_DIR}/icudtl.dat" PARENT_SCOPE) |
||||||
|
set(PROJECT_BUILD_DIR "${PROJECT_DIR}/build/" PARENT_SCOPE) |
||||||
|
set(AOT_LIBRARY "${PROJECT_DIR}/build/lib/libapp.so" PARENT_SCOPE) |
||||||
|
|
||||||
|
list(APPEND FLUTTER_LIBRARY_HEADERS |
||||||
|
"fl_basic_message_channel.h" |
||||||
|
"fl_binary_codec.h" |
||||||
|
"fl_binary_messenger.h" |
||||||
|
"fl_dart_project.h" |
||||||
|
"fl_engine.h" |
||||||
|
"fl_json_message_codec.h" |
||||||
|
"fl_json_method_codec.h" |
||||||
|
"fl_message_codec.h" |
||||||
|
"fl_method_call.h" |
||||||
|
"fl_method_channel.h" |
||||||
|
"fl_method_codec.h" |
||||||
|
"fl_method_response.h" |
||||||
|
"fl_plugin_registrar.h" |
||||||
|
"fl_plugin_registry.h" |
||||||
|
"fl_standard_message_codec.h" |
||||||
|
"fl_standard_method_codec.h" |
||||||
|
"fl_string_codec.h" |
||||||
|
"fl_value.h" |
||||||
|
"fl_view.h" |
||||||
|
"flutter_linux.h" |
||||||
|
) |
||||||
|
list_prepend(FLUTTER_LIBRARY_HEADERS "${EPHEMERAL_DIR}/flutter_linux/") |
||||||
|
add_library(flutter INTERFACE) |
||||||
|
target_include_directories(flutter INTERFACE |
||||||
|
"${EPHEMERAL_DIR}" |
||||||
|
) |
||||||
|
target_link_libraries(flutter INTERFACE "${FLUTTER_LIBRARY}") |
||||||
|
target_link_libraries(flutter INTERFACE |
||||||
|
PkgConfig::GTK |
||||||
|
PkgConfig::GLIB |
||||||
|
PkgConfig::GIO |
||||||
|
) |
||||||
|
add_dependencies(flutter flutter_assemble) |
||||||
|
|
||||||
|
# === Flutter tool backend === |
||||||
|
# _phony_ is a non-existent file to force this command to run every time, |
||||||
|
# since currently there's no way to get a full input/output list from the |
||||||
|
# flutter tool. |
||||||
|
add_custom_command( |
||||||
|
OUTPUT ${FLUTTER_LIBRARY} ${FLUTTER_LIBRARY_HEADERS} |
||||||
|
${CMAKE_CURRENT_BINARY_DIR}/_phony_ |
||||||
|
COMMAND ${CMAKE_COMMAND} -E env |
||||||
|
${FLUTTER_TOOL_ENVIRONMENT} |
||||||
|
"${FLUTTER_ROOT}/packages/flutter_tools/bin/tool_backend.sh" |
||||||
|
${FLUTTER_TARGET_PLATFORM} ${CMAKE_BUILD_TYPE} |
||||||
|
VERBATIM |
||||||
|
) |
||||||
|
add_custom_target(flutter_assemble DEPENDS |
||||||
|
"${FLUTTER_LIBRARY}" |
||||||
|
${FLUTTER_LIBRARY_HEADERS} |
||||||
|
) |
@ -0,0 +1,6 @@ |
|||||||
|
#include "my_application.h" |
||||||
|
|
||||||
|
int main(int argc, char** argv) { |
||||||
|
g_autoptr(MyApplication) app = my_application_new(); |
||||||
|
return g_application_run(G_APPLICATION(app), argc, argv); |
||||||
|
} |
@ -0,0 +1,104 @@ |
|||||||
|
#include "my_application.h" |
||||||
|
|
||||||
|
#include <flutter_linux/flutter_linux.h> |
||||||
|
#ifdef GDK_WINDOWING_X11 |
||||||
|
#include <gdk/gdkx.h> |
||||||
|
#endif |
||||||
|
|
||||||
|
#include "flutter/generated_plugin_registrant.h" |
||||||
|
|
||||||
|
struct _MyApplication { |
||||||
|
GtkApplication parent_instance; |
||||||
|
char** dart_entrypoint_arguments; |
||||||
|
}; |
||||||
|
|
||||||
|
G_DEFINE_TYPE(MyApplication, my_application, GTK_TYPE_APPLICATION) |
||||||
|
|
||||||
|
// Implements GApplication::activate.
|
||||||
|
static void my_application_activate(GApplication* application) { |
||||||
|
MyApplication* self = MY_APPLICATION(application); |
||||||
|
GtkWindow* window = |
||||||
|
GTK_WINDOW(gtk_application_window_new(GTK_APPLICATION(application))); |
||||||
|
|
||||||
|
// Use a header bar when running in GNOME as this is the common style used
|
||||||
|
// by applications and is the setup most users will be using (e.g. Ubuntu
|
||||||
|
// desktop).
|
||||||
|
// If running on X and not using GNOME then just use a traditional title bar
|
||||||
|
// in case the window manager does more exotic layout, e.g. tiling.
|
||||||
|
// If running on Wayland assume the header bar will work (may need changing
|
||||||
|
// if future cases occur).
|
||||||
|
gboolean use_header_bar = TRUE; |
||||||
|
#ifdef GDK_WINDOWING_X11 |
||||||
|
GdkScreen* screen = gtk_window_get_screen(window); |
||||||
|
if (GDK_IS_X11_SCREEN(screen)) { |
||||||
|
const gchar* wm_name = gdk_x11_screen_get_window_manager_name(screen); |
||||||
|
if (g_strcmp0(wm_name, "GNOME Shell") != 0) { |
||||||
|
use_header_bar = FALSE; |
||||||
|
} |
||||||
|
} |
||||||
|
#endif |
||||||
|
if (use_header_bar) { |
||||||
|
GtkHeaderBar* header_bar = GTK_HEADER_BAR(gtk_header_bar_new()); |
||||||
|
gtk_widget_show(GTK_WIDGET(header_bar)); |
||||||
|
gtk_header_bar_set_title(header_bar, "secure_storage_example"); |
||||||
|
gtk_header_bar_set_show_close_button(header_bar, TRUE); |
||||||
|
gtk_window_set_titlebar(window, GTK_WIDGET(header_bar)); |
||||||
|
} else { |
||||||
|
gtk_window_set_title(window, "secure_storage_example"); |
||||||
|
} |
||||||
|
|
||||||
|
gtk_window_set_default_size(window, 1280, 720); |
||||||
|
gtk_widget_show(GTK_WIDGET(window)); |
||||||
|
|
||||||
|
g_autoptr(FlDartProject) project = fl_dart_project_new(); |
||||||
|
fl_dart_project_set_dart_entrypoint_arguments(project, self->dart_entrypoint_arguments); |
||||||
|
|
||||||
|
FlView* view = fl_view_new(project); |
||||||
|
gtk_widget_show(GTK_WIDGET(view)); |
||||||
|
gtk_container_add(GTK_CONTAINER(window), GTK_WIDGET(view)); |
||||||
|
|
||||||
|
fl_register_plugins(FL_PLUGIN_REGISTRY(view)); |
||||||
|
|
||||||
|
gtk_widget_grab_focus(GTK_WIDGET(view)); |
||||||
|
} |
||||||
|
|
||||||
|
// Implements GApplication::local_command_line.
|
||||||
|
static gboolean my_application_local_command_line(GApplication* application, gchar*** arguments, int* exit_status) { |
||||||
|
MyApplication* self = MY_APPLICATION(application); |
||||||
|
// Strip out the first argument as it is the binary name.
|
||||||
|
self->dart_entrypoint_arguments = g_strdupv(*arguments + 1); |
||||||
|
|
||||||
|
g_autoptr(GError) error = nullptr; |
||||||
|
if (!g_application_register(application, nullptr, &error)) { |
||||||
|
g_warning("Failed to register: %s", error->message); |
||||||
|
*exit_status = 1; |
||||||
|
return TRUE; |
||||||
|
} |
||||||
|
|
||||||
|
g_application_activate(application); |
||||||
|
*exit_status = 0; |
||||||
|
|
||||||
|
return TRUE; |
||||||
|
} |
||||||
|
|
||||||
|
// Implements GObject::dispose.
|
||||||
|
static void my_application_dispose(GObject* object) { |
||||||
|
MyApplication* self = MY_APPLICATION(object); |
||||||
|
g_clear_pointer(&self->dart_entrypoint_arguments, g_strfreev); |
||||||
|
G_OBJECT_CLASS(my_application_parent_class)->dispose(object); |
||||||
|
} |
||||||
|
|
||||||
|
static void my_application_class_init(MyApplicationClass* klass) { |
||||||
|
G_APPLICATION_CLASS(klass)->activate = my_application_activate; |
||||||
|
G_APPLICATION_CLASS(klass)->local_command_line = my_application_local_command_line; |
||||||
|
G_OBJECT_CLASS(klass)->dispose = my_application_dispose; |
||||||
|
} |
||||||
|
|
||||||
|
static void my_application_init(MyApplication* self) {} |
||||||
|
|
||||||
|
MyApplication* my_application_new() { |
||||||
|
return MY_APPLICATION(g_object_new(my_application_get_type(), |
||||||
|
"application-id", APPLICATION_ID, |
||||||
|
"flags", G_APPLICATION_NON_UNIQUE, |
||||||
|
nullptr)); |
||||||
|
} |
@ -0,0 +1,18 @@ |
|||||||
|
#ifndef FLUTTER_MY_APPLICATION_H_ |
||||||
|
#define FLUTTER_MY_APPLICATION_H_ |
||||||
|
|
||||||
|
#include <gtk/gtk.h> |
||||||
|
|
||||||
|
G_DECLARE_FINAL_TYPE(MyApplication, my_application, MY, APPLICATION, |
||||||
|
GtkApplication) |
||||||
|
|
||||||
|
/**
|
||||||
|
* my_application_new: |
||||||
|
* |
||||||
|
* Creates a new Flutter-based application. |
||||||
|
* |
||||||
|
* Returns: a new #MyApplication. |
||||||
|
*/ |
||||||
|
MyApplication* my_application_new(); |
||||||
|
|
||||||
|
#endif // FLUTTER_MY_APPLICATION_H_
|
@ -0,0 +1,267 @@ |
|||||||
|
# Generated by pub |
||||||
|
# See https://dart.dev/tools/pub/glossary#lockfile |
||||||
|
packages: |
||||||
|
async: |
||||||
|
dependency: transitive |
||||||
|
description: |
||||||
|
name: async |
||||||
|
sha256: "947bfcf187f74dbc5e146c9eb9c0f10c9f8b30743e341481c1e2ed3ecc18c20c" |
||||||
|
url: "https://pub.dev" |
||||||
|
source: hosted |
||||||
|
version: "2.11.0" |
||||||
|
boolean_selector: |
||||||
|
dependency: transitive |
||||||
|
description: |
||||||
|
name: boolean_selector |
||||||
|
sha256: "6cfb5af12253eaf2b368f07bacc5a80d1301a071c73360d746b7f2e32d762c66" |
||||||
|
url: "https://pub.dev" |
||||||
|
source: hosted |
||||||
|
version: "2.1.1" |
||||||
|
characters: |
||||||
|
dependency: transitive |
||||||
|
description: |
||||||
|
name: characters |
||||||
|
sha256: "04a925763edad70e8443c99234dc3328f442e811f1d8fd1a72f1c8ad0f69a605" |
||||||
|
url: "https://pub.dev" |
||||||
|
source: hosted |
||||||
|
version: "1.3.0" |
||||||
|
clock: |
||||||
|
dependency: transitive |
||||||
|
description: |
||||||
|
name: clock |
||||||
|
sha256: cb6d7f03e1de671e34607e909a7213e31d7752be4fb66a86d29fe1eb14bfb5cf |
||||||
|
url: "https://pub.dev" |
||||||
|
source: hosted |
||||||
|
version: "1.1.1" |
||||||
|
collection: |
||||||
|
dependency: transitive |
||||||
|
description: |
||||||
|
name: collection |
||||||
|
sha256: ee67cb0715911d28db6bf4af1026078bd6f0128b07a5f66fb2ed94ec6783c09a |
||||||
|
url: "https://pub.dev" |
||||||
|
source: hosted |
||||||
|
version: "1.18.0" |
||||||
|
cupertino_icons: |
||||||
|
dependency: "direct main" |
||||||
|
description: |
||||||
|
name: cupertino_icons |
||||||
|
sha256: d57953e10f9f8327ce64a508a355f0b1ec902193f66288e8cb5070e7c47eeb2d |
||||||
|
url: "https://pub.dev" |
||||||
|
source: hosted |
||||||
|
version: "1.0.6" |
||||||
|
fake_async: |
||||||
|
dependency: transitive |
||||||
|
description: |
||||||
|
name: fake_async |
||||||
|
sha256: "511392330127add0b769b75a987850d136345d9227c6b94c96a04cf4a391bf78" |
||||||
|
url: "https://pub.dev" |
||||||
|
source: hosted |
||||||
|
version: "1.3.1" |
||||||
|
file: |
||||||
|
dependency: transitive |
||||||
|
description: |
||||||
|
name: file |
||||||
|
sha256: "1b92bec4fc2a72f59a8e15af5f52cd441e4a7860b49499d69dfa817af20e925d" |
||||||
|
url: "https://pub.dev" |
||||||
|
source: hosted |
||||||
|
version: "6.1.4" |
||||||
|
flutter: |
||||||
|
dependency: "direct main" |
||||||
|
description: flutter |
||||||
|
source: sdk |
||||||
|
version: "0.0.0" |
||||||
|
flutter_driver: |
||||||
|
dependency: transitive |
||||||
|
description: flutter |
||||||
|
source: sdk |
||||||
|
version: "0.0.0" |
||||||
|
flutter_lints: |
||||||
|
dependency: "direct dev" |
||||||
|
description: |
||||||
|
name: flutter_lints |
||||||
|
sha256: a25a15ebbdfc33ab1cd26c63a6ee519df92338a9c10f122adda92938253bef04 |
||||||
|
url: "https://pub.dev" |
||||||
|
source: hosted |
||||||
|
version: "2.0.3" |
||||||
|
flutter_test: |
||||||
|
dependency: "direct dev" |
||||||
|
description: flutter |
||||||
|
source: sdk |
||||||
|
version: "0.0.0" |
||||||
|
fuchsia_remote_debug_protocol: |
||||||
|
dependency: transitive |
||||||
|
description: flutter |
||||||
|
source: sdk |
||||||
|
version: "0.0.0" |
||||||
|
integration_test: |
||||||
|
dependency: "direct dev" |
||||||
|
description: flutter |
||||||
|
source: sdk |
||||||
|
version: "0.0.0" |
||||||
|
lints: |
||||||
|
dependency: transitive |
||||||
|
description: |
||||||
|
name: lints |
||||||
|
sha256: "0a217c6c989d21039f1498c3ed9f3ed71b354e69873f13a8dfc3c9fe76f1b452" |
||||||
|
url: "https://pub.dev" |
||||||
|
source: hosted |
||||||
|
version: "2.1.1" |
||||||
|
matcher: |
||||||
|
dependency: transitive |
||||||
|
description: |
||||||
|
name: matcher |
||||||
|
sha256: "1803e76e6653768d64ed8ff2e1e67bea3ad4b923eb5c56a295c3e634bad5960e" |
||||||
|
url: "https://pub.dev" |
||||||
|
source: hosted |
||||||
|
version: "0.12.16" |
||||||
|
material_color_utilities: |
||||||
|
dependency: transitive |
||||||
|
description: |
||||||
|
name: material_color_utilities |
||||||
|
sha256: "9528f2f296073ff54cb9fee677df673ace1218163c3bc7628093e7eed5203d41" |
||||||
|
url: "https://pub.dev" |
||||||
|
source: hosted |
||||||
|
version: "0.5.0" |
||||||
|
meta: |
||||||
|
dependency: transitive |
||||||
|
description: |
||||||
|
name: meta |
||||||
|
sha256: a6e590c838b18133bb482a2745ad77c5bb7715fb0451209e1a7567d416678b8e |
||||||
|
url: "https://pub.dev" |
||||||
|
source: hosted |
||||||
|
version: "1.10.0" |
||||||
|
path: |
||||||
|
dependency: transitive |
||||||
|
description: |
||||||
|
name: path |
||||||
|
sha256: "8829d8a55c13fc0e37127c29fedf290c102f4e40ae94ada574091fe0ff96c917" |
||||||
|
url: "https://pub.dev" |
||||||
|
source: hosted |
||||||
|
version: "1.8.3" |
||||||
|
platform: |
||||||
|
dependency: transitive |
||||||
|
description: |
||||||
|
name: platform |
||||||
|
sha256: ae68c7bfcd7383af3629daafb32fb4e8681c7154428da4febcff06200585f102 |
||||||
|
url: "https://pub.dev" |
||||||
|
source: hosted |
||||||
|
version: "3.1.2" |
||||||
|
plugin_platform_interface: |
||||||
|
dependency: transitive |
||||||
|
description: |
||||||
|
name: plugin_platform_interface |
||||||
|
sha256: f4f88d4a900933e7267e2b353594774fc0d07fb072b47eedcd5b54e1ea3269f8 |
||||||
|
url: "https://pub.dev" |
||||||
|
source: hosted |
||||||
|
version: "2.1.7" |
||||||
|
process: |
||||||
|
dependency: transitive |
||||||
|
description: |
||||||
|
name: process |
||||||
|
sha256: "53fd8db9cec1d37b0574e12f07520d582019cb6c44abf5479a01505099a34a09" |
||||||
|
url: "https://pub.dev" |
||||||
|
source: hosted |
||||||
|
version: "4.2.4" |
||||||
|
secure_storage: |
||||||
|
dependency: "direct main" |
||||||
|
description: |
||||||
|
path: ".." |
||||||
|
relative: true |
||||||
|
source: path |
||||||
|
version: "0.0.1" |
||||||
|
sky_engine: |
||||||
|
dependency: transitive |
||||||
|
description: flutter |
||||||
|
source: sdk |
||||||
|
version: "0.0.99" |
||||||
|
source_span: |
||||||
|
dependency: transitive |
||||||
|
description: |
||||||
|
name: source_span |
||||||
|
sha256: "53e943d4206a5e30df338fd4c6e7a077e02254531b138a15aec3bd143c1a8b3c" |
||||||
|
url: "https://pub.dev" |
||||||
|
source: hosted |
||||||
|
version: "1.10.0" |
||||||
|
stack_trace: |
||||||
|
dependency: transitive |
||||||
|
description: |
||||||
|
name: stack_trace |
||||||
|
sha256: "73713990125a6d93122541237550ee3352a2d84baad52d375a4cad2eb9b7ce0b" |
||||||
|
url: "https://pub.dev" |
||||||
|
source: hosted |
||||||
|
version: "1.11.1" |
||||||
|
stream_channel: |
||||||
|
dependency: transitive |
||||||
|
description: |
||||||
|
name: stream_channel |
||||||
|
sha256: ba2aa5d8cc609d96bbb2899c28934f9e1af5cddbd60a827822ea467161eb54e7 |
||||||
|
url: "https://pub.dev" |
||||||
|
source: hosted |
||||||
|
version: "2.1.2" |
||||||
|
string_scanner: |
||||||
|
dependency: transitive |
||||||
|
description: |
||||||
|
name: string_scanner |
||||||
|
sha256: "556692adab6cfa87322a115640c11f13cb77b3f076ddcc5d6ae3c20242bedcde" |
||||||
|
url: "https://pub.dev" |
||||||
|
source: hosted |
||||||
|
version: "1.2.0" |
||||||
|
sync_http: |
||||||
|
dependency: transitive |
||||||
|
description: |
||||||
|
name: sync_http |
||||||
|
sha256: "7f0cd72eca000d2e026bcd6f990b81d0ca06022ef4e32fb257b30d3d1014a961" |
||||||
|
url: "https://pub.dev" |
||||||
|
source: hosted |
||||||
|
version: "0.3.1" |
||||||
|
term_glyph: |
||||||
|
dependency: transitive |
||||||
|
description: |
||||||
|
name: term_glyph |
||||||
|
sha256: a29248a84fbb7c79282b40b8c72a1209db169a2e0542bce341da992fe1bc7e84 |
||||||
|
url: "https://pub.dev" |
||||||
|
source: hosted |
||||||
|
version: "1.2.1" |
||||||
|
test_api: |
||||||
|
dependency: transitive |
||||||
|
description: |
||||||
|
name: test_api |
||||||
|
sha256: "5c2f730018264d276c20e4f1503fd1308dfbbae39ec8ee63c5236311ac06954b" |
||||||
|
url: "https://pub.dev" |
||||||
|
source: hosted |
||||||
|
version: "0.6.1" |
||||||
|
vector_math: |
||||||
|
dependency: transitive |
||||||
|
description: |
||||||
|
name: vector_math |
||||||
|
sha256: "80b3257d1492ce4d091729e3a67a60407d227c27241d6927be0130c98e741803" |
||||||
|
url: "https://pub.dev" |
||||||
|
source: hosted |
||||||
|
version: "2.1.4" |
||||||
|
vm_service: |
||||||
|
dependency: transitive |
||||||
|
description: |
||||||
|
name: vm_service |
||||||
|
sha256: c538be99af830f478718b51630ec1b6bee5e74e52c8a802d328d9e71d35d2583 |
||||||
|
url: "https://pub.dev" |
||||||
|
source: hosted |
||||||
|
version: "11.10.0" |
||||||
|
web: |
||||||
|
dependency: transitive |
||||||
|
description: |
||||||
|
name: web |
||||||
|
sha256: afe077240a270dcfd2aafe77602b4113645af95d0ad31128cc02bce5ac5d5152 |
||||||
|
url: "https://pub.dev" |
||||||
|
source: hosted |
||||||
|
version: "0.3.0" |
||||||
|
webdriver: |
||||||
|
dependency: transitive |
||||||
|
description: |
||||||
|
name: webdriver |
||||||
|
sha256: "3c923e918918feeb90c4c9fdf1fe39220fa4c0e8e2c0fffaded174498ef86c49" |
||||||
|
url: "https://pub.dev" |
||||||
|
source: hosted |
||||||
|
version: "3.0.2" |
||||||
|
sdks: |
||||||
|
dart: ">=3.2.2 <4.0.0" |
||||||
|
flutter: ">=3.3.0" |
@ -0,0 +1,85 @@ |
|||||||
|
name: secure_storage_example |
||||||
|
description: "Demonstrates how to use the secure_storage plugin." |
||||||
|
# The following line prevents the package from being accidentally published to |
||||||
|
# pub.dev using `flutter pub publish`. This is preferred for private packages. |
||||||
|
publish_to: 'none' # Remove this line if you wish to publish to pub.dev |
||||||
|
|
||||||
|
environment: |
||||||
|
sdk: '>=3.2.2 <4.0.0' |
||||||
|
|
||||||
|
# Dependencies specify other packages that your package needs in order to work. |
||||||
|
# To automatically upgrade your package dependencies to the latest versions |
||||||
|
# consider running `flutter pub upgrade --major-versions`. Alternatively, |
||||||
|
# dependencies can be manually updated by changing the version numbers below to |
||||||
|
# the latest version available on pub.dev. To see which dependencies have newer |
||||||
|
# versions available, run `flutter pub outdated`. |
||||||
|
dependencies: |
||||||
|
flutter: |
||||||
|
sdk: flutter |
||||||
|
|
||||||
|
secure_storage: |
||||||
|
# When depending on this package from a real application you should use: |
||||||
|
# secure_storage: ^x.y.z |
||||||
|
# See https://dart.dev/tools/pub/dependencies#version-constraints |
||||||
|
# The example app is bundled with the plugin so we use a path dependency on |
||||||
|
# the parent directory to use the current plugin's version. |
||||||
|
path: ../ |
||||||
|
|
||||||
|
# The following adds the Cupertino Icons font to your application. |
||||||
|
# Use with the CupertinoIcons class for iOS style icons. |
||||||
|
cupertino_icons: ^1.0.2 |
||||||
|
|
||||||
|
dev_dependencies: |
||||||
|
integration_test: |
||||||
|
sdk: flutter |
||||||
|
flutter_test: |
||||||
|
sdk: flutter |
||||||
|
|
||||||
|
# The "flutter_lints" package below contains a set of recommended lints to |
||||||
|
# encourage good coding practices. The lint set provided by the package is |
||||||
|
# activated in the `analysis_options.yaml` file located at the root of your |
||||||
|
# package. See that file for information about deactivating specific lint |
||||||
|
# rules and activating additional ones. |
||||||
|
flutter_lints: ^2.0.0 |
||||||
|
|
||||||
|
# For information on the generic Dart part of this file, see the |
||||||
|
# following page: https://dart.dev/tools/pub/pubspec |
||||||
|
|
||||||
|
# The following section is specific to Flutter packages. |
||||||
|
flutter: |
||||||
|
|
||||||
|
# The following line ensures that the Material Icons font is |
||||||
|
# included with your application, so that you can use the icons in |
||||||
|
# the material Icons class. |
||||||
|
uses-material-design: true |
||||||
|
|
||||||
|
# To add assets to your application, add an assets section, like this: |
||||||
|
# assets: |
||||||
|
# - images/a_dot_burr.jpeg |
||||||
|
# - images/a_dot_ham.jpeg |
||||||
|
|
||||||
|
# An image asset can refer to one or more resolution-specific "variants", see |
||||||
|
# https://flutter.dev/assets-and-images/#resolution-aware |
||||||
|
|
||||||
|
# For details regarding adding assets from package dependencies, see |
||||||
|
# https://flutter.dev/assets-and-images/#from-packages |
||||||
|
|
||||||
|
# To add custom fonts to your application, add a fonts section here, |
||||||
|
# in this "flutter" section. Each entry in this list should have a |
||||||
|
# "family" key with the font family name, and a "fonts" key with a |
||||||
|
# list giving the asset and other descriptors for the font. For |
||||||
|
# example: |
||||||
|
# fonts: |
||||||
|
# - family: Schyler |
||||||
|
# fonts: |
||||||
|
# - asset: fonts/Schyler-Regular.ttf |
||||||
|
# - asset: fonts/Schyler-Italic.ttf |
||||||
|
# style: italic |
||||||
|
# - family: Trajan Pro |
||||||
|
# fonts: |
||||||
|
# - asset: fonts/TrajanPro.ttf |
||||||
|
# - asset: fonts/TrajanPro_Bold.ttf |
||||||
|
# weight: 700 |
||||||
|
# |
||||||
|
# For details regarding fonts from package dependencies, |
||||||
|
# see https://flutter.dev/custom-fonts/#from-packages |
@ -0,0 +1,27 @@ |
|||||||
|
// This is a basic Flutter widget test. |
||||||
|
// |
||||||
|
// To perform an interaction with a widget in your test, use the WidgetTester |
||||||
|
// utility in the flutter_test package. For example, you can send tap and scroll |
||||||
|
// gestures. You can also use WidgetTester to find child widgets in the widget |
||||||
|
// tree, read text, and verify that the values of widget properties are correct. |
||||||
|
|
||||||
|
import 'package:flutter/material.dart'; |
||||||
|
import 'package:flutter_test/flutter_test.dart'; |
||||||
|
|
||||||
|
import 'package:secure_storage_example/main.dart'; |
||||||
|
|
||||||
|
void main() { |
||||||
|
testWidgets('Verify Platform version', (WidgetTester tester) async { |
||||||
|
// Build our app and trigger a frame. |
||||||
|
await tester.pumpWidget(const MyApp()); |
||||||
|
|
||||||
|
// Verify that platform version is retrieved. |
||||||
|
expect( |
||||||
|
find.byWidgetPredicate( |
||||||
|
(Widget widget) => widget is Text && |
||||||
|
widget.data!.startsWith('Running on:'), |
||||||
|
), |
||||||
|
findsOneWidget, |
||||||
|
); |
||||||
|
}); |
||||||
|
} |
@ -0,0 +1,8 @@ |
|||||||
|
|
||||||
|
import 'secure_storage_platform_interface.dart'; |
||||||
|
|
||||||
|
class SecureStorage { |
||||||
|
Future<String?> getPlatformVersion() { |
||||||
|
return SecureStoragePlatform.instance.getPlatformVersion(); |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,17 @@ |
|||||||
|
import 'package:flutter/foundation.dart'; |
||||||
|
import 'package:flutter/services.dart'; |
||||||
|
|
||||||
|
import 'secure_storage_platform_interface.dart'; |
||||||
|
|
||||||
|
/// An implementation of [SecureStoragePlatform] that uses method channels. |
||||||
|
class MethodChannelSecureStorage extends SecureStoragePlatform { |
||||||
|
/// The method channel used to interact with the native platform. |
||||||
|
@visibleForTesting |
||||||
|
final methodChannel = const MethodChannel('secure_storage'); |
||||||
|
|
||||||
|
@override |
||||||
|
Future<String?> getPlatformVersion() async { |
||||||
|
final version = await methodChannel.invokeMethod<String>('getPlatformVersion'); |
||||||
|
return version; |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,29 @@ |
|||||||
|
import 'package:plugin_platform_interface/plugin_platform_interface.dart'; |
||||||
|
|
||||||
|
import 'secure_storage_method_channel.dart'; |
||||||
|
|
||||||
|
abstract class SecureStoragePlatform extends PlatformInterface { |
||||||
|
/// Constructs a SecureStoragePlatform. |
||||||
|
SecureStoragePlatform() : super(token: _token); |
||||||
|
|
||||||
|
static final Object _token = Object(); |
||||||
|
|
||||||
|
static SecureStoragePlatform _instance = MethodChannelSecureStorage(); |
||||||
|
|
||||||
|
/// The default instance of [SecureStoragePlatform] to use. |
||||||
|
/// |
||||||
|
/// Defaults to [MethodChannelSecureStorage]. |
||||||
|
static SecureStoragePlatform get instance => _instance; |
||||||
|
|
||||||
|
/// Platform-specific implementations should set this with their own |
||||||
|
/// platform-specific class that extends [SecureStoragePlatform] when |
||||||
|
/// they register themselves. |
||||||
|
static set instance(SecureStoragePlatform instance) { |
||||||
|
PlatformInterface.verifyToken(instance, _token); |
||||||
|
_instance = instance; |
||||||
|
} |
||||||
|
|
||||||
|
Future<String?> getPlatformVersion() { |
||||||
|
throw UnimplementedError('platformVersion() has not been implemented.'); |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,94 @@ |
|||||||
|
# The Flutter tooling requires that developers have CMake 3.10 or later |
||||||
|
# installed. You should not increase this version, as doing so will cause |
||||||
|
# the plugin to fail to compile for some customers of the plugin. |
||||||
|
cmake_minimum_required(VERSION 3.10) |
||||||
|
|
||||||
|
# Project-level configuration. |
||||||
|
set(PROJECT_NAME "secure_storage") |
||||||
|
project(${PROJECT_NAME} LANGUAGES CXX) |
||||||
|
|
||||||
|
# This value is used when generating builds using this plugin, so it must |
||||||
|
# not be changed. |
||||||
|
set(PLUGIN_NAME "secure_storage_plugin") |
||||||
|
|
||||||
|
# Any new source files that you add to the plugin should be added here. |
||||||
|
list(APPEND PLUGIN_SOURCES |
||||||
|
"secure_storage_plugin.cc" |
||||||
|
) |
||||||
|
|
||||||
|
# Define the plugin library target. Its name must not be changed (see comment |
||||||
|
# on PLUGIN_NAME above). |
||||||
|
add_library(${PLUGIN_NAME} SHARED |
||||||
|
${PLUGIN_SOURCES} |
||||||
|
) |
||||||
|
|
||||||
|
# Apply a standard set of build settings that are configured in the |
||||||
|
# application-level CMakeLists.txt. This can be removed for plugins that want |
||||||
|
# full control over build settings. |
||||||
|
apply_standard_settings(${PLUGIN_NAME}) |
||||||
|
|
||||||
|
# Symbols are hidden by default to reduce the chance of accidental conflicts |
||||||
|
# between plugins. This should not be removed; any symbols that should be |
||||||
|
# exported should be explicitly exported with the FLUTTER_PLUGIN_EXPORT macro. |
||||||
|
set_target_properties(${PLUGIN_NAME} PROPERTIES |
||||||
|
CXX_VISIBILITY_PRESET hidden) |
||||||
|
target_compile_definitions(${PLUGIN_NAME} PRIVATE FLUTTER_PLUGIN_IMPL) |
||||||
|
|
||||||
|
# Source include directories and library dependencies. Add any plugin-specific |
||||||
|
# dependencies here. |
||||||
|
target_include_directories(${PLUGIN_NAME} INTERFACE |
||||||
|
"${CMAKE_CURRENT_SOURCE_DIR}/include") |
||||||
|
target_link_libraries(${PLUGIN_NAME} PRIVATE flutter) |
||||||
|
target_link_libraries(${PLUGIN_NAME} PRIVATE PkgConfig::GTK) |
||||||
|
|
||||||
|
# List of absolute paths to libraries that should be bundled with the plugin. |
||||||
|
# This list could contain prebuilt libraries, or libraries created by an |
||||||
|
# external build triggered from this build file. |
||||||
|
set(secure_storage_bundled_libraries |
||||||
|
"" |
||||||
|
PARENT_SCOPE |
||||||
|
) |
||||||
|
|
||||||
|
# === Tests === |
||||||
|
# These unit tests can be run from a terminal after building the example. |
||||||
|
|
||||||
|
# Only enable test builds when building the example (which sets this variable) |
||||||
|
# so that plugin clients aren't building the tests. |
||||||
|
if (${include_${PROJECT_NAME}_tests}) |
||||||
|
if(${CMAKE_VERSION} VERSION_LESS "3.11.0") |
||||||
|
message("Unit tests require CMake 3.11.0 or later") |
||||||
|
else() |
||||||
|
set(TEST_RUNNER "${PROJECT_NAME}_test") |
||||||
|
enable_testing() |
||||||
|
|
||||||
|
# Add the Google Test dependency. |
||||||
|
include(FetchContent) |
||||||
|
FetchContent_Declare( |
||||||
|
googletest |
||||||
|
URL https://github.com/google/googletest/archive/release-1.11.0.zip |
||||||
|
) |
||||||
|
# Prevent overriding the parent project's compiler/linker settings |
||||||
|
set(gtest_force_shared_crt ON CACHE BOOL "" FORCE) |
||||||
|
# Disable install commands for gtest so it doesn't end up in the bundle. |
||||||
|
set(INSTALL_GTEST OFF CACHE BOOL "Disable installation of googletest" FORCE) |
||||||
|
|
||||||
|
FetchContent_MakeAvailable(googletest) |
||||||
|
|
||||||
|
# The plugin's exported API is not very useful for unit testing, so build the |
||||||
|
# sources directly into the test binary rather than using the shared library. |
||||||
|
add_executable(${TEST_RUNNER} |
||||||
|
test/secure_storage_plugin_test.cc |
||||||
|
${PLUGIN_SOURCES} |
||||||
|
) |
||||||
|
apply_standard_settings(${TEST_RUNNER}) |
||||||
|
target_include_directories(${TEST_RUNNER} PRIVATE "${CMAKE_CURRENT_SOURCE_DIR}") |
||||||
|
target_link_libraries(${TEST_RUNNER} PRIVATE flutter) |
||||||
|
target_link_libraries(${TEST_RUNNER} PRIVATE PkgConfig::GTK) |
||||||
|
target_link_libraries(${TEST_RUNNER} PRIVATE gtest_main gmock) |
||||||
|
|
||||||
|
# Enable automatic test discovery. |
||||||
|
include(GoogleTest) |
||||||
|
gtest_discover_tests(${TEST_RUNNER}) |
||||||
|
|
||||||
|
endif() # CMake version check |
||||||
|
endif() # include_${PROJECT_NAME}_tests |
@ -0,0 +1,26 @@ |
|||||||
|
#ifndef FLUTTER_PLUGIN_SECURE_STORAGE_PLUGIN_H_ |
||||||
|
#define FLUTTER_PLUGIN_SECURE_STORAGE_PLUGIN_H_ |
||||||
|
|
||||||
|
#include <flutter_linux/flutter_linux.h> |
||||||
|
|
||||||
|
G_BEGIN_DECLS |
||||||
|
|
||||||
|
#ifdef FLUTTER_PLUGIN_IMPL |
||||||
|
#define FLUTTER_PLUGIN_EXPORT __attribute__((visibility("default"))) |
||||||
|
#else |
||||||
|
#define FLUTTER_PLUGIN_EXPORT |
||||||
|
#endif |
||||||
|
|
||||||
|
typedef struct _SecureStoragePlugin SecureStoragePlugin; |
||||||
|
typedef struct { |
||||||
|
GObjectClass parent_class; |
||||||
|
} SecureStoragePluginClass; |
||||||
|
|
||||||
|
FLUTTER_PLUGIN_EXPORT GType secure_storage_plugin_get_type(); |
||||||
|
|
||||||
|
FLUTTER_PLUGIN_EXPORT void secure_storage_plugin_register_with_registrar( |
||||||
|
FlPluginRegistrar* registrar); |
||||||
|
|
||||||
|
G_END_DECLS |
||||||
|
|
||||||
|
#endif // FLUTTER_PLUGIN_SECURE_STORAGE_PLUGIN_H_
|
@ -0,0 +1,76 @@ |
|||||||
|
#include "include/secure_storage/secure_storage_plugin.h" |
||||||
|
|
||||||
|
#include <flutter_linux/flutter_linux.h> |
||||||
|
#include <gtk/gtk.h> |
||||||
|
#include <sys/utsname.h> |
||||||
|
|
||||||
|
#include <cstring> |
||||||
|
|
||||||
|
#include "secure_storage_plugin_private.h" |
||||||
|
|
||||||
|
#define SECURE_STORAGE_PLUGIN(obj) \ |
||||||
|
(G_TYPE_CHECK_INSTANCE_CAST((obj), secure_storage_plugin_get_type(), \
|
||||||
|
SecureStoragePlugin)) |
||||||
|
|
||||||
|
struct _SecureStoragePlugin { |
||||||
|
GObject parent_instance; |
||||||
|
}; |
||||||
|
|
||||||
|
G_DEFINE_TYPE(SecureStoragePlugin, secure_storage_plugin, g_object_get_type()) |
||||||
|
|
||||||
|
// Called when a method call is received from Flutter.
|
||||||
|
static void secure_storage_plugin_handle_method_call( |
||||||
|
SecureStoragePlugin* self, |
||||||
|
FlMethodCall* method_call) { |
||||||
|
g_autoptr(FlMethodResponse) response = nullptr; |
||||||
|
|
||||||
|
const gchar* method = fl_method_call_get_name(method_call); |
||||||
|
|
||||||
|
if (strcmp(method, "getPlatformVersion") == 0) { |
||||||
|
response = get_platform_version(); |
||||||
|
} else { |
||||||
|
response = FL_METHOD_RESPONSE(fl_method_not_implemented_response_new()); |
||||||
|
} |
||||||
|
|
||||||
|
fl_method_call_respond(method_call, response, nullptr); |
||||||
|
} |
||||||
|
|
||||||
|
FlMethodResponse* get_platform_version() { |
||||||
|
struct utsname uname_data = {}; |
||||||
|
uname(&uname_data); |
||||||
|
g_autofree gchar *version = g_strdup_printf("Linux %s", uname_data.version); |
||||||
|
g_autoptr(FlValue) result = fl_value_new_string(version); |
||||||
|
return FL_METHOD_RESPONSE(fl_method_success_response_new(result)); |
||||||
|
} |
||||||
|
|
||||||
|
static void secure_storage_plugin_dispose(GObject* object) { |
||||||
|
G_OBJECT_CLASS(secure_storage_plugin_parent_class)->dispose(object); |
||||||
|
} |
||||||
|
|
||||||
|
static void secure_storage_plugin_class_init(SecureStoragePluginClass* klass) { |
||||||
|
G_OBJECT_CLASS(klass)->dispose = secure_storage_plugin_dispose; |
||||||
|
} |
||||||
|
|
||||||
|
static void secure_storage_plugin_init(SecureStoragePlugin* self) {} |
||||||
|
|
||||||
|
static void method_call_cb(FlMethodChannel* channel, FlMethodCall* method_call, |
||||||
|
gpointer user_data) { |
||||||
|
SecureStoragePlugin* plugin = SECURE_STORAGE_PLUGIN(user_data); |
||||||
|
secure_storage_plugin_handle_method_call(plugin, method_call); |
||||||
|
} |
||||||
|
|
||||||
|
void secure_storage_plugin_register_with_registrar(FlPluginRegistrar* registrar) { |
||||||
|
SecureStoragePlugin* plugin = SECURE_STORAGE_PLUGIN( |
||||||
|
g_object_new(secure_storage_plugin_get_type(), nullptr)); |
||||||
|
|
||||||
|
g_autoptr(FlStandardMethodCodec) codec = fl_standard_method_codec_new(); |
||||||
|
g_autoptr(FlMethodChannel) channel = |
||||||
|
fl_method_channel_new(fl_plugin_registrar_get_messenger(registrar), |
||||||
|
"secure_storage", |
||||||
|
FL_METHOD_CODEC(codec)); |
||||||
|
fl_method_channel_set_method_call_handler(channel, method_call_cb, |
||||||
|
g_object_ref(plugin), |
||||||
|
g_object_unref); |
||||||
|
|
||||||
|
g_object_unref(plugin); |
||||||
|
} |
@ -0,0 +1,10 @@ |
|||||||
|
#include <flutter_linux/flutter_linux.h> |
||||||
|
|
||||||
|
#include "include/secure_storage/secure_storage_plugin.h" |
||||||
|
|
||||||
|
// This file exposes some plugin internals for unit testing. See
|
||||||
|
// https://github.com/flutter/flutter/issues/88724 for current limitations
|
||||||
|
// in the unit-testable API.
|
||||||
|
|
||||||
|
// Handles the getPlatformVersion method call.
|
||||||
|
FlMethodResponse *get_platform_version(); |
@ -0,0 +1,31 @@ |
|||||||
|
#include <flutter_linux/flutter_linux.h> |
||||||
|
#include <gmock/gmock.h> |
||||||
|
#include <gtest/gtest.h> |
||||||
|
|
||||||
|
#include "include/secure_storage/secure_storage_plugin.h" |
||||||
|
#include "secure_storage_plugin_private.h" |
||||||
|
|
||||||
|
// This demonstrates a simple unit test of the C portion of this plugin's
|
||||||
|
// implementation.
|
||||||
|
//
|
||||||
|
// Once you have built the plugin's example app, you can run these tests
|
||||||
|
// from the command line. For instance, for a plugin called my_plugin
|
||||||
|
// built for x64 debug, run:
|
||||||
|
// $ build/linux/x64/debug/plugins/my_plugin/my_plugin_test
|
||||||
|
|
||||||
|
namespace secure_storage { |
||||||
|
namespace test { |
||||||
|
|
||||||
|
TEST(SecureStoragePlugin, GetPlatformVersion) { |
||||||
|
g_autoptr(FlMethodResponse) response = get_platform_version(); |
||||||
|
ASSERT_NE(response, nullptr); |
||||||
|
ASSERT_TRUE(FL_IS_METHOD_SUCCESS_RESPONSE(response)); |
||||||
|
FlValue* result = fl_method_success_response_get_result( |
||||||
|
FL_METHOD_SUCCESS_RESPONSE(response)); |
||||||
|
ASSERT_EQ(fl_value_get_type(result), FL_VALUE_TYPE_STRING); |
||||||
|
// The full string varies, so just validate that it has the right format.
|
||||||
|
EXPECT_THAT(fl_value_get_string(result), testing::StartsWith("Linux ")); |
||||||
|
} |
||||||
|
|
||||||
|
} // namespace test
|
||||||
|
} // namespace secure_storage
|
@ -0,0 +1,71 @@ |
|||||||
|
name: secure_storage |
||||||
|
description: "A new Flutter plugin project." |
||||||
|
version: 0.0.1 |
||||||
|
homepage: |
||||||
|
|
||||||
|
environment: |
||||||
|
sdk: '>=3.1.2 <4.0.0' |
||||||
|
flutter: '>=3.3.0' |
||||||
|
|
||||||
|
dependencies: |
||||||
|
flutter: |
||||||
|
sdk: flutter |
||||||
|
plugin_platform_interface: ^2.0.2 |
||||||
|
|
||||||
|
dev_dependencies: |
||||||
|
flutter_test: |
||||||
|
sdk: flutter |
||||||
|
flutter_lints: ^2.0.0 |
||||||
|
|
||||||
|
# For information on the generic Dart part of this file, see the |
||||||
|
# following page: https://dart.dev/tools/pub/pubspec |
||||||
|
|
||||||
|
# The following section is specific to Flutter packages. |
||||||
|
flutter: |
||||||
|
# This section identifies this Flutter project as a plugin project. |
||||||
|
# The 'pluginClass' specifies the class (in Java, Kotlin, Swift, Objective-C, etc.) |
||||||
|
# which should be registered in the plugin registry. This is required for |
||||||
|
# using method channels. |
||||||
|
# The Android 'package' specifies package in which the registered class is. |
||||||
|
# This is required for using method channels on Android. |
||||||
|
# The 'ffiPlugin' specifies that native code should be built and bundled. |
||||||
|
# This is required for using `dart:ffi`. |
||||||
|
# All these are used by the tooling to maintain consistency when |
||||||
|
# adding or updating assets for this project. |
||||||
|
plugin: |
||||||
|
platforms: |
||||||
|
linux: |
||||||
|
pluginClass: SecureStoragePlugin |
||||||
|
aurora: |
||||||
|
pluginClass: SecureStoragePlugin |
||||||
|
|
||||||
|
# To add assets to your plugin package, add an assets section, like this: |
||||||
|
# assets: |
||||||
|
# - images/a_dot_burr.jpeg |
||||||
|
# - images/a_dot_ham.jpeg |
||||||
|
# |
||||||
|
# For details regarding assets in packages, see |
||||||
|
# https://flutter.dev/assets-and-images/#from-packages |
||||||
|
# |
||||||
|
# An image asset can refer to one or more resolution-specific "variants", see |
||||||
|
# https://flutter.dev/assets-and-images/#resolution-aware |
||||||
|
|
||||||
|
# To add custom fonts to your plugin package, add a fonts section here, |
||||||
|
# in this "flutter" section. Each entry in this list should have a |
||||||
|
# "family" key with the font family name, and a "fonts" key with a |
||||||
|
# list giving the asset and other descriptors for the font. For |
||||||
|
# example: |
||||||
|
# fonts: |
||||||
|
# - family: Schyler |
||||||
|
# fonts: |
||||||
|
# - asset: fonts/Schyler-Regular.ttf |
||||||
|
# - asset: fonts/Schyler-Italic.ttf |
||||||
|
# style: italic |
||||||
|
# - family: Trajan Pro |
||||||
|
# fonts: |
||||||
|
# - asset: fonts/TrajanPro.ttf |
||||||
|
# - asset: fonts/TrajanPro_Bold.ttf |
||||||
|
# weight: 700 |
||||||
|
# |
||||||
|
# For details regarding fonts in packages, see |
||||||
|
# https://flutter.dev/custom-fonts/#from-packages |
@ -0,0 +1,27 @@ |
|||||||
|
import 'package:flutter/services.dart'; |
||||||
|
import 'package:flutter_test/flutter_test.dart'; |
||||||
|
import 'package:secure_storage/secure_storage_method_channel.dart'; |
||||||
|
|
||||||
|
void main() { |
||||||
|
TestWidgetsFlutterBinding.ensureInitialized(); |
||||||
|
|
||||||
|
MethodChannelSecureStorage platform = MethodChannelSecureStorage(); |
||||||
|
const MethodChannel channel = MethodChannel('secure_storage'); |
||||||
|
|
||||||
|
setUp(() { |
||||||
|
TestDefaultBinaryMessengerBinding.instance.defaultBinaryMessenger.setMockMethodCallHandler( |
||||||
|
channel, |
||||||
|
(MethodCall methodCall) async { |
||||||
|
return '42'; |
||||||
|
}, |
||||||
|
); |
||||||
|
}); |
||||||
|
|
||||||
|
tearDown(() { |
||||||
|
TestDefaultBinaryMessengerBinding.instance.defaultBinaryMessenger.setMockMethodCallHandler(channel, null); |
||||||
|
}); |
||||||
|
|
||||||
|
test('getPlatformVersion', () async { |
||||||
|
expect(await platform.getPlatformVersion(), '42'); |
||||||
|
}); |
||||||
|
} |
@ -0,0 +1,29 @@ |
|||||||
|
import 'package:flutter_test/flutter_test.dart'; |
||||||
|
import 'package:secure_storage/secure_storage.dart'; |
||||||
|
import 'package:secure_storage/secure_storage_platform_interface.dart'; |
||||||
|
import 'package:secure_storage/secure_storage_method_channel.dart'; |
||||||
|
import 'package:plugin_platform_interface/plugin_platform_interface.dart'; |
||||||
|
|
||||||
|
class MockSecureStoragePlatform |
||||||
|
with MockPlatformInterfaceMixin |
||||||
|
implements SecureStoragePlatform { |
||||||
|
|
||||||
|
@override |
||||||
|
Future<String?> getPlatformVersion() => Future.value('42'); |
||||||
|
} |
||||||
|
|
||||||
|
void main() { |
||||||
|
final SecureStoragePlatform initialPlatform = SecureStoragePlatform.instance; |
||||||
|
|
||||||
|
test('$MethodChannelSecureStorage is the default instance', () { |
||||||
|
expect(initialPlatform, isInstanceOf<MethodChannelSecureStorage>()); |
||||||
|
}); |
||||||
|
|
||||||
|
test('getPlatformVersion', () async { |
||||||
|
SecureStorage secureStoragePlugin = SecureStorage(); |
||||||
|
MockSecureStoragePlatform fakePlatform = MockSecureStoragePlatform(); |
||||||
|
SecureStoragePlatform.instance = fakePlatform; |
||||||
|
|
||||||
|
expect(await secureStoragePlugin.getPlatformVersion(), '42'); |
||||||
|
}); |
||||||
|
} |
Loading…
Reference in new issue