Сергей Марков
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