diff --git a/example/.gitignore b/example/.gitignore new file mode 100644 index 0000000..3db3823 --- /dev/null +++ b/example/.gitignore @@ -0,0 +1,47 @@ +# 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 +.packages +.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 diff --git a/example/.metadata b/example/.metadata new file mode 100644 index 0000000..8a5abeb --- /dev/null +++ b/example/.metadata @@ -0,0 +1,30 @@ +# 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. + +version: + revision: 135454af32477f815a7525073027a3ff9eff1bfd + channel: aurora + +project_type: app + +# Tracks metadata for the flutter migrate command +migration: + platforms: + - platform: root + create_revision: 135454af32477f815a7525073027a3ff9eff1bfd + base_revision: 135454af32477f815a7525073027a3ff9eff1bfd + - platform: aurora + create_revision: 135454af32477f815a7525073027a3ff9eff1bfd + base_revision: 135454af32477f815a7525073027a3ff9eff1bfd + + # 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' diff --git a/example/README.md b/example/README.md new file mode 100644 index 0000000..d92661a --- /dev/null +++ b/example/README.md @@ -0,0 +1,16 @@ +# flutter_example_packages + +A new Flutter project. + +## 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. diff --git a/example/analysis_options.yaml b/example/analysis_options.yaml new file mode 100644 index 0000000..f9b3034 --- /dev/null +++ b/example/analysis_options.yaml @@ -0,0 +1 @@ +include: package:flutter_lints/flutter.yaml diff --git a/example/assets/images/logo-head.png b/example/assets/images/logo-head.png new file mode 100644 index 0000000..93bed9f Binary files /dev/null and b/example/assets/images/logo-head.png differ diff --git a/example/aurora/.gitignore b/example/aurora/.gitignore new file mode 100644 index 0000000..d3896c9 --- /dev/null +++ b/example/aurora/.gitignore @@ -0,0 +1 @@ +flutter/ephemeral diff --git a/example/aurora/CMakeLists.txt b/example/aurora/CMakeLists.txt new file mode 100644 index 0000000..4ac17ca --- /dev/null +++ b/example/aurora/CMakeLists.txt @@ -0,0 +1,47 @@ +cmake_minimum_required(VERSION 3.10) +project(ru.auroraos.flutter_example_packages 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) diff --git a/example/aurora/desktop/ru.auroraos.flutter_example_packages.desktop b/example/aurora/desktop/ru.auroraos.flutter_example_packages.desktop new file mode 100644 index 0000000..37ffbea --- /dev/null +++ b/example/aurora/desktop/ru.auroraos.flutter_example_packages.desktop @@ -0,0 +1,12 @@ +[Desktop Entry] +Type=Application +Name=Flutter example packages +Comment=Application demonstrating the work of plugins. +Icon=ru.auroraos.flutter_example_packages +Exec=/usr/bin/ru.auroraos.flutter_example_packages +X-Nemo-Application-Type=silica-qt5 + +[X-Application] +Permissions= +OrganizationName=ru.auroraos +ApplicationName=flutter_example_packages diff --git a/example/aurora/icons/108x108.png b/example/aurora/icons/108x108.png new file mode 100644 index 0000000..f7af7fc Binary files /dev/null and b/example/aurora/icons/108x108.png differ diff --git a/example/aurora/icons/128x128.png b/example/aurora/icons/128x128.png new file mode 100644 index 0000000..1b8ffce Binary files /dev/null and b/example/aurora/icons/128x128.png differ diff --git a/example/aurora/icons/172x172.png b/example/aurora/icons/172x172.png new file mode 100644 index 0000000..6da2b55 Binary files /dev/null and b/example/aurora/icons/172x172.png differ diff --git a/example/aurora/icons/86x86.png b/example/aurora/icons/86x86.png new file mode 100644 index 0000000..8bf935b Binary files /dev/null and b/example/aurora/icons/86x86.png differ diff --git a/example/aurora/main.cpp b/example/aurora/main.cpp new file mode 100644 index 0000000..331e26e --- /dev/null +++ b/example/aurora/main.cpp @@ -0,0 +1,9 @@ +#include +#include "generated_plugin_registrant.h" + +int main(int argc, char *argv[]) { + Application::Initialize(argc, argv); + RegisterPlugins(); + Application::Launch(); + return 0; +} diff --git a/example/aurora/rpm/ru.auroraos.flutter_example_packages.spec b/example/aurora/rpm/ru.auroraos.flutter_example_packages.spec new file mode 100644 index 0000000..f1ce250 --- /dev/null +++ b/example/aurora/rpm/ru.auroraos.flutter_example_packages.spec @@ -0,0 +1,31 @@ +%global __provides_exclude_from ^%{_datadir}/%{name}/lib/.*$ +%global __requires_exclude ^lib(dconf|flutter-embedder|maliit-glib|appmanifest-.+|.+_platform_plugin)\\.so.*$ + +Name: ru.auroraos.flutter_example_packages +Summary: A new Flutter project. +Version: 0.1.0 +Release: 1 +License: Proprietary +Source0: %{name}-%{version}.tar.zst + +BuildRequires: cmake +BuildRequires: pkgconfig(flutter-embedder) + +%description +%{summary}. + +%prep +%autosetup + +%build +%cmake -DCMAKE_BUILD_TYPE=%{_flutter_build_type} +%make_build + +%install +%make_install + +%files +%{_bindir}/%{name} +%{_datadir}/%{name}/* +%{_datadir}/applications/%{name}.desktop +%{_datadir}/icons/hicolor/*/apps/%{name}.png diff --git a/example/data/raw/flutter.svg b/example/data/raw/flutter.svg new file mode 100644 index 0000000..30c3a1e --- /dev/null +++ b/example/data/raw/flutter.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/example/data/raw/icon.png b/example/data/raw/icon.png new file mode 100644 index 0000000..8ab60ab Binary files /dev/null and b/example/data/raw/icon.png differ diff --git a/example/data/raw/links b/example/data/raw/links new file mode 100644 index 0000000..1b25a2e --- /dev/null +++ b/example/data/raw/links @@ -0,0 +1,2 @@ +https://iconduck.com/icons/94312/flutter +https://iconduck.com/icons/54169/package diff --git a/example/data/raw/logo-head.svg b/example/data/raw/logo-head.svg new file mode 100644 index 0000000..ee98409 --- /dev/null +++ b/example/data/raw/logo-head.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/example/data/raw/package.svg b/example/data/raw/package.svg new file mode 100644 index 0000000..3626988 --- /dev/null +++ b/example/data/raw/package.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/example/l10n.yaml b/example/l10n.yaml new file mode 100644 index 0000000..4e6692e --- /dev/null +++ b/example/l10n.yaml @@ -0,0 +1,3 @@ +arb-dir: lib/l10n +template-arb-file: app_en.arb +output-localization-file: app_localizations.dart \ No newline at end of file diff --git a/example/lib/app.dart b/example/lib/app.dart new file mode 100644 index 0000000..7beb5e0 --- /dev/null +++ b/example/lib/app.dart @@ -0,0 +1,33 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_example_packages/base/di/app_di.dart'; +import 'package:flutter_example_packages/model.dart'; +import 'package:flutter_example_packages/pages/home/page.dart'; +import 'package:flutter_example_packages/pages/xdga_directories/page.dart'; +import 'package:flutter_example_packages/theme/theme.dart'; +import 'package:scoped_model/scoped_model.dart'; +import 'package:flutter_gen/gen_l10n/app_localizations.dart'; + +/// Main app class +class MyApp extends StatelessWidget { + const MyApp({super.key}); + + @override + Widget build(BuildContext context) { + return ScopedModel( + model: getIt(), + child: ScopedModelDescendant( + builder: (context, child, model) => MaterialApp( + localizationsDelegates: AppLocalizations.localizationsDelegates, + supportedLocales: AppLocalizations.supportedLocales, + title: 'Flutter Aurora OS', + theme: appTheme, + initialRoute: '/', + routes: { + '/': (context) => const HomePage(), + '/xdga_directories': (context) => const XdgaDirectoriesPage(), + }, + ), + ), + ); + } +} diff --git a/example/lib/base/build/build.config.dart b/example/lib/base/build/build.config.dart new file mode 100644 index 0000000..2ae6133 --- /dev/null +++ b/example/lib/base/build/build.config.dart @@ -0,0 +1,3 @@ +abstract class BuildConfig { + bool get isDebug; +} \ No newline at end of file diff --git a/example/lib/base/build/build.debug.dart b/example/lib/base/build/build.debug.dart new file mode 100644 index 0000000..13add5a --- /dev/null +++ b/example/lib/base/build/build.debug.dart @@ -0,0 +1,6 @@ +import 'build.config.dart'; + +class BuildDebugConfig implements BuildConfig { + @override + bool get isDebug => true; +} \ No newline at end of file diff --git a/example/lib/base/build/build.release.dart b/example/lib/base/build/build.release.dart new file mode 100644 index 0000000..37c3b34 --- /dev/null +++ b/example/lib/base/build/build.release.dart @@ -0,0 +1,6 @@ +import 'build.config.dart'; + +class BuildReleaseConfig implements BuildConfig { + @override + bool get isDebug => false; +} \ No newline at end of file diff --git a/example/lib/base/di/app_di.dart b/example/lib/base/di/app_di.dart index 8412b12..4abd06f 100644 --- a/example/lib/base/di/app_di.dart +++ b/example/lib/base/di/app_di.dart @@ -1,25 +1,35 @@ +import 'package:flutter_example_packages/base/build/build.config.dart'; +import 'package:flutter_example_packages/model.dart'; +import 'package:flutter_example_packages/pages/battery_plus/model.dart'; +import 'package:flutter_example_packages/pages/device_info_plus/model.dart'; +import 'package:flutter_example_packages/pages/flutter_local_notifications/model.dart'; +import 'package:flutter_example_packages/pages/flutter_secure_storage/model.dart'; +import 'package:flutter_example_packages/pages/home/model.dart'; +import 'package:flutter_example_packages/pages/package_info_plus/model.dart'; +import 'package:flutter_example_packages/pages/path_provider/model.dart'; +import 'package:flutter_example_packages/pages/shared_preferences/model.dart'; +import 'package:flutter_example_packages/pages/wakelock/model.dart'; +import 'package:flutter_example_packages/pages/xdga_directories/model.dart'; import 'package:get_it/get_it.dart'; final getIt = GetIt.instance; /// Initialization application DI void setupDI(BuildConfig config) { - final dio = configureDio(url: config.baseUrl); getIt - // build info + // build info ..registerSingleton(config) - // services - ..registerSingleton(AuthService(dio)) - ..registerSingleton(UsersService(dio)) - ..registerSingleton(CardsService(dio)) - // pages models + // pages models ..registerFactory(() => HomeModel()) - ..registerFactory(() => SignInModel()) - ..registerFactory(() => SignUpModel()) - ..registerFactory(() => CardModel()) - ..registerFactory(() => CardsModel()) - ..registerFactory(() => StatsModel()) - ..registerFactory(() => FriendsModel()) - // other + ..registerFactory(() => BatteryPlusModel()) + ..registerFactory(() => DeviceInfoPlusModel()) + ..registerFactory(() => FlutterLocalNotificationsModel()) + ..registerFactory(() => FlutterSecureStorageModel()) + ..registerFactory(() => PackageInfoPlusModel()) + ..registerFactory(() => PathProviderModel()) + ..registerFactory(() => SharedPreferencesModel()) + ..registerFactory(() => WakelockModel()) + ..registerFactory(() => XdgaDirectoriesModel()) + // other ..registerSingleton(AppModel()); } \ No newline at end of file diff --git a/example/lib/extensions/keys_ext.dart b/example/lib/extensions/keys_ext.dart new file mode 100644 index 0000000..15a6bf2 --- /dev/null +++ b/example/lib/extensions/keys_ext.dart @@ -0,0 +1,18 @@ +import 'package:flutter/material.dart'; + +/// Extensions for [GlobalKey] +extension ExtGlobalKey on GlobalKey { + /// Get height by key + double? getHeight() { + if (currentContext == null) { + return null; + } + try { + final renderBoxRed = currentContext!.findRenderObject() as RenderBox; + final sizeRed = renderBoxRed.size; + return sizeRed.height; + } catch (e) { + return 0; + } + } +} \ No newline at end of file diff --git a/example/lib/l10n/app_en.arb b/example/lib/l10n/app_en.arb new file mode 100644 index 0000000..801c5ce --- /dev/null +++ b/example/lib/l10n/app_en.arb @@ -0,0 +1,3 @@ +{ + "helloPageTitle": "Flutter Aurora OS" +} \ No newline at end of file diff --git a/example/lib/l10n/app_ru.arb b/example/lib/l10n/app_ru.arb new file mode 100644 index 0000000..ddfd0cd --- /dev/null +++ b/example/lib/l10n/app_ru.arb @@ -0,0 +1,3 @@ +{ + "helloPageTitle": "Flutter ОС Аврора" +} \ No newline at end of file diff --git a/example/lib/main.dart b/example/lib/main.dart new file mode 100644 index 0000000..2712e00 --- /dev/null +++ b/example/lib/main.dart @@ -0,0 +1,9 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_example_packages/app.dart'; +import 'package:flutter_example_packages/base/build/build.release.dart'; +import 'package:flutter_example_packages/base/di/app_di.dart'; + +void main() { + setupDI(BuildReleaseConfig()); + runApp(const MyApp()); +} diff --git a/example/lib/main.release.dart b/example/lib/main.release.dart new file mode 100644 index 0000000..dfe04bc --- /dev/null +++ b/example/lib/main.release.dart @@ -0,0 +1,9 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_example_packages/app.dart'; +import 'package:flutter_example_packages/base/build/build.debug.dart'; +import 'package:flutter_example_packages/base/di/app_di.dart'; + +void main() { + setupDI(BuildDebugConfig()); + runApp(const MyApp()); +} diff --git a/example/lib/model.dart b/example/lib/model.dart new file mode 100644 index 0000000..34324e8 --- /dev/null +++ b/example/lib/model.dart @@ -0,0 +1,8 @@ +import 'package:flutter/widgets.dart'; +import 'package:scoped_model/scoped_model.dart'; + +/// Global model for app +class AppModel extends Model { + /// Get [ScopedModel] + static AppModel of(BuildContext context) => ScopedModel.of(context); +} \ No newline at end of file diff --git a/example/lib/pages/battery_plus/model.dart b/example/lib/pages/battery_plus/model.dart new file mode 100644 index 0000000..591da11 --- /dev/null +++ b/example/lib/pages/battery_plus/model.dart @@ -0,0 +1,8 @@ +import 'package:flutter/widgets.dart'; +import 'package:scoped_model/scoped_model.dart'; + +/// Model for [BatteryPlusPage] +class BatteryPlusModel extends Model { + /// Get [ScopedModel] + static BatteryPlusModel of(BuildContext context) => ScopedModel.of(context); +} \ No newline at end of file diff --git a/example/lib/pages/battery_plus/page.dart b/example/lib/pages/battery_plus/page.dart new file mode 100644 index 0000000..508e192 --- /dev/null +++ b/example/lib/pages/battery_plus/page.dart @@ -0,0 +1,31 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_example_packages/base/di/app_di.dart'; +import 'package:flutter_example_packages/pages/battery_plus/model.dart'; +import 'package:scoped_model/scoped_model.dart'; + +class BatteryPlusPage extends StatefulWidget { + const BatteryPlusPage({ + super.key, + }); + + @override + State createState() => _BatteryPlusPageState(); +} + +class _BatteryPlusPageState extends State { + @override + Widget build(BuildContext context) { + return ScopedModel( + model: getIt(), + child: ScopedModelDescendant(builder: (context, child, model) { + return Wrap( + spacing: 20, + runSpacing: 20, + children: const [ + Text("data"), + ], + ); + }), + ); + } +} \ No newline at end of file diff --git a/example/lib/pages/device_info_plus/model.dart b/example/lib/pages/device_info_plus/model.dart new file mode 100644 index 0000000..4e3b570 --- /dev/null +++ b/example/lib/pages/device_info_plus/model.dart @@ -0,0 +1,8 @@ +import 'package:flutter/widgets.dart'; +import 'package:scoped_model/scoped_model.dart'; + +/// Model for [DeviceInfoPlusPage] +class DeviceInfoPlusModel extends Model { + /// Get [ScopedModel] + static DeviceInfoPlusModel of(BuildContext context) => ScopedModel.of(context); +} \ No newline at end of file diff --git a/example/lib/pages/device_info_plus/page.dart b/example/lib/pages/device_info_plus/page.dart new file mode 100644 index 0000000..1d93280 --- /dev/null +++ b/example/lib/pages/device_info_plus/page.dart @@ -0,0 +1,31 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_example_packages/base/di/app_di.dart'; +import 'package:flutter_example_packages/pages/device_info_plus/model.dart'; +import 'package:scoped_model/scoped_model.dart'; + +class DeviceInfoPlusPage extends StatefulWidget { + const DeviceInfoPlusPage({ + super.key, + }); + + @override + State createState() => _DeviceInfoPlusPageState(); +} + +class _DeviceInfoPlusPageState extends State { + @override + Widget build(BuildContext context) { + return ScopedModel( + model: getIt(), + child: ScopedModelDescendant(builder: (context, child, model) { + return Wrap( + spacing: 20, + runSpacing: 20, + children: const [ + Text("data"), + ], + ); + }), + ); + } +} \ No newline at end of file diff --git a/example/lib/pages/flutter_local_notifications/model.dart b/example/lib/pages/flutter_local_notifications/model.dart new file mode 100644 index 0000000..e8bb71d --- /dev/null +++ b/example/lib/pages/flutter_local_notifications/model.dart @@ -0,0 +1,8 @@ +import 'package:flutter/widgets.dart'; +import 'package:scoped_model/scoped_model.dart'; + +/// Model for [FlutterLocalNotificationsPage] +class FlutterLocalNotificationsModel extends Model { + /// Get [ScopedModel] + static FlutterLocalNotificationsModel of(BuildContext context) => ScopedModel.of(context); +} \ No newline at end of file diff --git a/example/lib/pages/flutter_local_notifications/page.dart b/example/lib/pages/flutter_local_notifications/page.dart new file mode 100644 index 0000000..627dbd1 --- /dev/null +++ b/example/lib/pages/flutter_local_notifications/page.dart @@ -0,0 +1,31 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_example_packages/base/di/app_di.dart'; +import 'package:flutter_example_packages/pages/flutter_local_notifications/model.dart'; +import 'package:scoped_model/scoped_model.dart'; + +class FlutterLocalNotificationsPage extends StatefulWidget { + const FlutterLocalNotificationsPage({ + super.key, + }); + + @override + State createState() => _FlutterLocalNotificationsPageState(); +} + +class _FlutterLocalNotificationsPageState extends State { + @override + Widget build(BuildContext context) { + return ScopedModel( + model: getIt(), + child: ScopedModelDescendant(builder: (context, child, model) { + return Wrap( + spacing: 20, + runSpacing: 20, + children: const [ + Text("data"), + ], + ); + }), + ); + } +} \ No newline at end of file diff --git a/example/lib/pages/flutter_secure_storage/model.dart b/example/lib/pages/flutter_secure_storage/model.dart new file mode 100644 index 0000000..5f1e190 --- /dev/null +++ b/example/lib/pages/flutter_secure_storage/model.dart @@ -0,0 +1,8 @@ +import 'package:flutter/widgets.dart'; +import 'package:scoped_model/scoped_model.dart'; + +/// Model for [FlutterSecureStoragePage] +class FlutterSecureStorageModel extends Model { + /// Get [ScopedModel] + static FlutterSecureStorageModel of(BuildContext context) => ScopedModel.of(context); +} \ No newline at end of file diff --git a/example/lib/pages/flutter_secure_storage/page.dart b/example/lib/pages/flutter_secure_storage/page.dart new file mode 100644 index 0000000..7074e2a --- /dev/null +++ b/example/lib/pages/flutter_secure_storage/page.dart @@ -0,0 +1,31 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_example_packages/base/di/app_di.dart'; +import 'package:flutter_example_packages/pages/flutter_secure_storage/model.dart'; +import 'package:scoped_model/scoped_model.dart'; + +class FlutterSecureStoragePage extends StatefulWidget { + const FlutterSecureStoragePage({ + super.key, + }); + + @override + State createState() => _FlutterSecureStoragePageState(); +} + +class _FlutterSecureStoragePageState extends State { + @override + Widget build(BuildContext context) { + return ScopedModel( + model: getIt(), + child: ScopedModelDescendant(builder: (context, child, model) { + return Wrap( + spacing: 20, + runSpacing: 20, + children: const [ + Text("data"), + ], + ); + }), + ); + } +} \ No newline at end of file diff --git a/example/lib/pages/home/model.dart b/example/lib/pages/home/model.dart new file mode 100644 index 0000000..0e8460a --- /dev/null +++ b/example/lib/pages/home/model.dart @@ -0,0 +1,8 @@ +import 'package:flutter/widgets.dart'; +import 'package:scoped_model/scoped_model.dart'; + +/// Model for [HomePage] +class HomeModel extends Model { + /// Get [ScopedModel] + static HomeModel of(BuildContext context) => ScopedModel.of(context); +} \ No newline at end of file diff --git a/example/lib/pages/home/page.dart b/example/lib/pages/home/page.dart new file mode 100644 index 0000000..1aca288 --- /dev/null +++ b/example/lib/pages/home/page.dart @@ -0,0 +1,237 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_example_packages/base/di/app_di.dart'; +import 'package:flutter_example_packages/extensions/keys_ext.dart'; +import 'package:flutter_example_packages/pages/home/model.dart'; +import 'package:flutter_example_packages/theme/colors.dart'; +import 'package:flutter_example_packages/theme/radius.dart'; +import 'package:flutter_example_packages/widgets/layouts/page_layout.dart'; +import 'package:flutter_gen/gen_l10n/app_localizations.dart'; +import 'package:scoped_model/scoped_model.dart'; + +class HomePage extends StatefulWidget { + const HomePage({ + super.key, + }); + + @override + State createState() => _HomePageState(); +} + +class _HomePageState extends State { + double _hH = 0; + final _header = GlobalKey(); + + @override + void initState() { + super.initState(); + WidgetsBinding.instance.addPostFrameCallback((_) => setState(() { + _hH = _header.getHeight() ?? 0; + Future.delayed(const Duration(milliseconds: 100), () { + setState(() { + _hH = _header.getHeight() ?? 0; + }); + }); + Future.delayed(const Duration(milliseconds: 200), () { + setState(() { + _hH = _header.getHeight() ?? 0; + }); + }); + })); + } + + @override + Widget build(BuildContext context) { + final theme = Theme.of(context); + final localizations = AppLocalizations.of(context)!; + + return PageLayout( + child: ScopedModel( + model: getIt(), + child: ScopedModelDescendant( + builder: (context, child, model) { + return Stack( + children: [ + Container( + height: _hH > 0 ? _hH : 0, + color: AppColors.primary, + width: double.infinity, + child: Center( + child: Align( + alignment: FractionalOffset.bottomRight, + child: Padding( + padding: const EdgeInsets.only( + left: 20, right: 20, top: 0, bottom: 40), + child: Opacity( + opacity: 0.3, + child: Image.asset( + 'images/logo-head.png', + width: 250, + ), + ), + ), + ), + ), + ), + Container( + key: _header, + width: double.infinity, + padding: const EdgeInsets.only( + left: 20, right: 20, top: 30, bottom: 120), + child: Column( + mainAxisSize: MainAxisSize.min, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + "Welcome!", + textAlign: TextAlign.left, + style: theme.textTheme.titleLarge?.copyWith( + color: const Color(0xFF3c67b5), + ), + ), + const SizedBox(height: 50), + Text( + "In this application you can find 100500 plugins supporting Aurors OS. If it happens that something is missing for you, you can write to us or add it yourself.", + textAlign: TextAlign.left, + style: theme.textTheme.bodyLarge?.copyWith( + color: const Color(0xFF3c67b5), + height: 1.5, + ), + ), + ], + ), + ), + ListView.builder( + padding: EdgeInsets.only(top: _hH > 0 ? _hH - 16 : 0), + itemCount: 20, + itemBuilder: (context, index) { + final i = index; + return Container( + decoration: BoxDecoration( + color: Colors.white, + borderRadius: i == 0 + ? const BorderRadius.only( + topLeft: Radius.circular(20), + topRight: Radius.circular(20), + ) + : null, + ), + child: Padding( + padding: i == 0 + ? const EdgeInsets.only( + left: 20, right: 20, top: 20, bottom: 0) + : const EdgeInsets.symmetric(horizontal: 20), + child: Column( + children: [ + Stack( + children: [ + Padding( + padding: const EdgeInsets.only(top: 10), + child: Stack( + children: [ + SizedBox( + width: double.infinity, + child: Card( + child: Padding( + padding: const EdgeInsets.all(20), + child: Column( + crossAxisAlignment: + CrossAxisAlignment.start, + children: [ + Text( + 'battery_plus', + textAlign: TextAlign.left, + style: theme + .textTheme.titleSmall, + ), + const SizedBox(height: 10), + Text( + 'A Flutter plugin to access various information about the battery of the device the app is running on.', + textAlign: TextAlign.left, + style: theme + .textTheme.bodyMedium + ?.copyWith( + color: Colors.black + .withOpacity( + 0.6)), + ), + const SizedBox(height: 12), + Divider( + height: 1, + color: + const Color(0xFF3c67b5) + .withOpacity(0.2)), + const SizedBox(height: 12), + Text( + 'Version: 4.0.1', + textAlign: TextAlign.left, + style: theme.textTheme.caption + ?.copyWith( + color: const Color( + 0xFF3c67b5) + .withOpacity( + 0.7)), + ), + ], + ), + ), + ), + ), + Positioned.fill( + child: Material( + color: Colors.transparent, + child: InkWell( + customBorder: + RoundedRectangleBorder( + borderRadius: AppRadius.small, + ), + hoverColor: Colors.transparent, + onTap: () => debugPrint("click"), + ), + ), + ), + ], + ), + ), + Align( + alignment: FractionalOffset.topRight, + child: Container( + margin: const EdgeInsets.only(right: 16), + decoration: BoxDecoration( + color: i % 2 == 0 + ? Colors.orange + : Colors.blueAccent, + borderRadius: AppRadius.small, + ), + child: Padding( + padding: const EdgeInsets.all(6), + child: Text( + i % 2 == 0 + ? 'platform dependent' + : 'platform independent', + textAlign: TextAlign.left, + style: + theme.textTheme.caption?.copyWith( + color: Colors.white, + fontWeight: FontWeight.w100, + ), + ), + ), + ), + ), + ], + ), + const SizedBox(height: 20), + ], + ), + ), + ); + }, + ), + ], + ); + }, + ), + ), + ); + } +} diff --git a/example/lib/pages/package_info_plus/model.dart b/example/lib/pages/package_info_plus/model.dart new file mode 100644 index 0000000..45bb2c6 --- /dev/null +++ b/example/lib/pages/package_info_plus/model.dart @@ -0,0 +1,8 @@ +import 'package:flutter/widgets.dart'; +import 'package:scoped_model/scoped_model.dart'; + +/// Model for [PackageInfoPlusPage] +class PackageInfoPlusModel extends Model { + /// Get [ScopedModel] + static PackageInfoPlusModel of(BuildContext context) => ScopedModel.of(context); +} \ No newline at end of file diff --git a/example/lib/pages/package_info_plus/page.dart b/example/lib/pages/package_info_plus/page.dart new file mode 100644 index 0000000..92f1f74 --- /dev/null +++ b/example/lib/pages/package_info_plus/page.dart @@ -0,0 +1,31 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_example_packages/base/di/app_di.dart'; +import 'package:flutter_example_packages/pages/package_info_plus/model.dart'; +import 'package:scoped_model/scoped_model.dart'; + +class PackageInfoPlusPage extends StatefulWidget { + const PackageInfoPlusPage({ + super.key, + }); + + @override + State createState() => _PackageInfoPlusPageState(); +} + +class _PackageInfoPlusPageState extends State { + @override + Widget build(BuildContext context) { + return ScopedModel( + model: getIt(), + child: ScopedModelDescendant(builder: (context, child, model) { + return Wrap( + spacing: 20, + runSpacing: 20, + children: const [ + Text("data"), + ], + ); + }), + ); + } +} \ No newline at end of file diff --git a/example/lib/pages/path_provider/model.dart b/example/lib/pages/path_provider/model.dart new file mode 100644 index 0000000..2657ee9 --- /dev/null +++ b/example/lib/pages/path_provider/model.dart @@ -0,0 +1,8 @@ +import 'package:flutter/widgets.dart'; +import 'package:scoped_model/scoped_model.dart'; + +/// Model for [PathProviderPage] +class PathProviderModel extends Model { + /// Get [ScopedModel] + static PathProviderModel of(BuildContext context) => ScopedModel.of(context); +} \ No newline at end of file diff --git a/example/lib/pages/path_provider/page.dart b/example/lib/pages/path_provider/page.dart new file mode 100644 index 0000000..b46b211 --- /dev/null +++ b/example/lib/pages/path_provider/page.dart @@ -0,0 +1,31 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_example_packages/base/di/app_di.dart'; +import 'package:flutter_example_packages/pages/path_provider/model.dart'; +import 'package:scoped_model/scoped_model.dart'; + +class PathProviderPage extends StatefulWidget { + const PathProviderPage({ + super.key, + }); + + @override + State createState() => _PathProviderPageState(); +} + +class _PathProviderPageState extends State { + @override + Widget build(BuildContext context) { + return ScopedModel( + model: getIt(), + child: ScopedModelDescendant(builder: (context, child, model) { + return Wrap( + spacing: 20, + runSpacing: 20, + children: const [ + Text("data"), + ], + ); + }), + ); + } +} \ No newline at end of file diff --git a/example/lib/pages/shared_preferences/model.dart b/example/lib/pages/shared_preferences/model.dart new file mode 100644 index 0000000..6717380 --- /dev/null +++ b/example/lib/pages/shared_preferences/model.dart @@ -0,0 +1,8 @@ +import 'package:flutter/widgets.dart'; +import 'package:scoped_model/scoped_model.dart'; + +/// Model for [SharedPreferencesPage] +class SharedPreferencesModel extends Model { + /// Get [ScopedModel] + static SharedPreferencesModel of(BuildContext context) => ScopedModel.of(context); +} \ No newline at end of file diff --git a/example/lib/pages/shared_preferences/page.dart b/example/lib/pages/shared_preferences/page.dart new file mode 100644 index 0000000..edcfb68 --- /dev/null +++ b/example/lib/pages/shared_preferences/page.dart @@ -0,0 +1,31 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_example_packages/base/di/app_di.dart'; +import 'package:flutter_example_packages/pages/shared_preferences/model.dart'; +import 'package:scoped_model/scoped_model.dart'; + +class SharedPreferencesPage extends StatefulWidget { + const SharedPreferencesPage({ + super.key, + }); + + @override + State createState() => _SharedPreferencesPageState(); +} + +class _SharedPreferencesPageState extends State { + @override + Widget build(BuildContext context) { + return ScopedModel( + model: getIt(), + child: ScopedModelDescendant(builder: (context, child, model) { + return Wrap( + spacing: 20, + runSpacing: 20, + children: const [ + Text("data"), + ], + ); + }), + ); + } +} \ No newline at end of file diff --git a/example/lib/pages/wakelock/model.dart b/example/lib/pages/wakelock/model.dart new file mode 100644 index 0000000..610b1d8 --- /dev/null +++ b/example/lib/pages/wakelock/model.dart @@ -0,0 +1,8 @@ +import 'package:flutter/widgets.dart'; +import 'package:scoped_model/scoped_model.dart'; + +/// Model for [WakelockPage] +class WakelockModel extends Model { + /// Get [ScopedModel] + static WakelockModel of(BuildContext context) => ScopedModel.of(context); +} \ No newline at end of file diff --git a/example/lib/pages/wakelock/page.dart b/example/lib/pages/wakelock/page.dart new file mode 100644 index 0000000..14e4d22 --- /dev/null +++ b/example/lib/pages/wakelock/page.dart @@ -0,0 +1,31 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_example_packages/base/di/app_di.dart'; +import 'package:flutter_example_packages/pages/wakelock/model.dart'; +import 'package:scoped_model/scoped_model.dart'; + +class WakelockPage extends StatefulWidget { + const WakelockPage({ + super.key, + }); + + @override + State createState() => _WakelockPageState(); +} + +class _WakelockPageState extends State { + @override + Widget build(BuildContext context) { + return ScopedModel( + model: getIt(), + child: ScopedModelDescendant(builder: (context, child, model) { + return Wrap( + spacing: 20, + runSpacing: 20, + children: const [ + Text("data"), + ], + ); + }), + ); + } +} \ No newline at end of file diff --git a/example/lib/pages/xdga_directories/model.dart b/example/lib/pages/xdga_directories/model.dart new file mode 100644 index 0000000..ea659fc --- /dev/null +++ b/example/lib/pages/xdga_directories/model.dart @@ -0,0 +1,8 @@ +import 'package:flutter/widgets.dart'; +import 'package:scoped_model/scoped_model.dart'; + +/// Model for [XdgaDirectoriesPage] +class XdgaDirectoriesModel extends Model { + /// Get [ScopedModel] + static XdgaDirectoriesModel of(BuildContext context) => ScopedModel.of(context); +} \ No newline at end of file diff --git a/example/lib/pages/xdga_directories/page.dart b/example/lib/pages/xdga_directories/page.dart new file mode 100644 index 0000000..7994581 --- /dev/null +++ b/example/lib/pages/xdga_directories/page.dart @@ -0,0 +1,31 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_example_packages/base/di/app_di.dart'; +import 'package:flutter_example_packages/pages/xdga_directories/model.dart'; +import 'package:scoped_model/scoped_model.dart'; + +class XdgaDirectoriesPage extends StatefulWidget { + const XdgaDirectoriesPage({ + super.key, + }); + + @override + State createState() => _XdgaDirectoriesPageState(); +} + +class _XdgaDirectoriesPageState extends State { + @override + Widget build(BuildContext context) { + return ScopedModel( + model: getIt(), + child: ScopedModelDescendant(builder: (context, child, model) { + return Wrap( + spacing: 20, + runSpacing: 20, + children: const [ + Text("data"), + ], + ); + }), + ); + } +} \ No newline at end of file diff --git a/example/lib/theme/colors.dart b/example/lib/theme/colors.dart new file mode 100644 index 0000000..aa7e37f --- /dev/null +++ b/example/lib/theme/colors.dart @@ -0,0 +1,7 @@ +import 'dart:ui'; + +class AppColors { + static const Color primary = Color(0xFFCBDCF8); + static const Color secondary = Color(0xFF00b3ad); + static const Color warning = Color(0xFFfb7d4a); +} diff --git a/example/lib/theme/radius.dart b/example/lib/theme/radius.dart new file mode 100644 index 0000000..85c9d0e --- /dev/null +++ b/example/lib/theme/radius.dart @@ -0,0 +1,7 @@ +import 'package:flutter/material.dart'; + +class AppRadius { + static final large = BorderRadius.circular(24.0); + static final medium = BorderRadius.circular(16.0); + static final small = BorderRadius.circular(8.0); +} diff --git a/example/lib/theme/theme.dart b/example/lib/theme/theme.dart new file mode 100644 index 0000000..e4a313f --- /dev/null +++ b/example/lib/theme/theme.dart @@ -0,0 +1,54 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_example_packages/theme/colors.dart'; +import 'package:flutter_example_packages/theme/radius.dart'; +import 'package:google_fonts/google_fonts.dart'; + +final appTheme = ThemeData( + colorScheme: ThemeData().colorScheme.copyWith( + primary: AppColors.primary, + secondary: AppColors.secondary, + ), + cardTheme: CardTheme( + clipBehavior: Clip.antiAlias, + margin: const EdgeInsets.all(0), + color: AppColors.primary.withOpacity(0.4), + elevation: 0, + shape: RoundedRectangleBorder( + borderRadius: AppRadius.small, + ), + ), + + /// [Text] + textTheme: TextTheme( + headlineLarge: GoogleFonts.ubuntu( + fontSize: 60, + fontWeight: FontWeight.bold, + ), + headlineMedium: GoogleFonts.ubuntu( + fontSize: 40, + fontWeight: FontWeight.bold, + ), + headlineSmall: GoogleFonts.ubuntu( + fontSize: 24, + fontWeight: FontWeight.bold, + ), + titleLarge: GoogleFonts.ubuntu( + fontSize: 60, + ), + titleMedium: GoogleFonts.ubuntu( + fontSize: 40, + ), + titleSmall: GoogleFonts.ubuntu( + fontSize: 24, + ), + bodyLarge: GoogleFonts.ubuntu( + fontSize: 18, + ), + bodyMedium: GoogleFonts.ubuntu( + fontSize: 16, + ), + bodySmall: GoogleFonts.ubuntu( + fontSize: 12, + ), + ), +); diff --git a/example/lib/widgets/layouts/page_layout.dart b/example/lib/widgets/layouts/page_layout.dart new file mode 100644 index 0000000..8c4daa1 --- /dev/null +++ b/example/lib/widgets/layouts/page_layout.dart @@ -0,0 +1,38 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_example_packages/model.dart'; +import 'package:scoped_model/scoped_model.dart'; +import 'package:flutter_gen/gen_l10n/app_localizations.dart'; + +class PageLayout extends StatefulWidget { + const PageLayout({ + super.key, + required this.child, + }); + + final Widget child; + + @override + State createState() => _PageLayoutState(); +} + +class _PageLayoutState extends State { + @override + Widget build(BuildContext context) { + final localizations = AppLocalizations.of(context)!; + return ScopedModelDescendant(builder: (context, child, model) { + return Localizations.override( + context: context, + child: Builder( + builder: (context) { + return Scaffold( + appBar: AppBar( + elevation: 0, + ), + body: widget.child, + ); + }, + ), + ); + }); + } +} diff --git a/example/pubspec.lock b/example/pubspec.lock new file mode 100644 index 0000000..920d1cf --- /dev/null +++ b/example/pubspec.lock @@ -0,0 +1,614 @@ +# Generated by pub +# See https://dart.dev/tools/pub/glossary#lockfile +packages: + _fe_analyzer_shared: + dependency: transitive + description: + name: _fe_analyzer_shared + url: "https://pub.dartlang.org" + source: hosted + version: "50.0.0" + analyzer: + dependency: transitive + description: + name: analyzer + url: "https://pub.dartlang.org" + source: hosted + version: "5.2.0" + args: + dependency: transitive + description: + name: args + url: "https://pub.dartlang.org" + source: hosted + version: "2.4.1" + async: + dependency: transitive + description: + name: async + url: "https://pub.dartlang.org" + source: hosted + version: "2.9.0" + boolean_selector: + dependency: transitive + description: + name: boolean_selector + url: "https://pub.dartlang.org" + source: hosted + version: "2.1.0" + build: + dependency: transitive + description: + name: build + url: "https://pub.dartlang.org" + source: hosted + version: "2.3.1" + build_config: + dependency: transitive + description: + name: build_config + url: "https://pub.dartlang.org" + source: hosted + version: "1.1.1" + build_daemon: + dependency: transitive + description: + name: build_daemon + url: "https://pub.dartlang.org" + source: hosted + version: "3.1.1" + build_resolvers: + dependency: transitive + description: + name: build_resolvers + url: "https://pub.dartlang.org" + source: hosted + version: "2.1.0" + build_runner: + dependency: "direct dev" + description: + name: build_runner + url: "https://pub.dartlang.org" + source: hosted + version: "2.3.3" + build_runner_core: + dependency: transitive + description: + name: build_runner_core + url: "https://pub.dartlang.org" + source: hosted + version: "7.2.7" + built_collection: + dependency: transitive + description: + name: built_collection + url: "https://pub.dartlang.org" + source: hosted + version: "5.1.1" + built_value: + dependency: transitive + description: + name: built_value + url: "https://pub.dartlang.org" + source: hosted + version: "8.6.1" + characters: + dependency: transitive + description: + name: characters + url: "https://pub.dartlang.org" + source: hosted + version: "1.2.1" + checked_yaml: + dependency: transitive + description: + name: checked_yaml + url: "https://pub.dartlang.org" + source: hosted + version: "2.0.2" + cli_util: + dependency: transitive + description: + name: cli_util + url: "https://pub.dartlang.org" + source: hosted + version: "0.3.5" + clock: + dependency: transitive + description: + name: clock + url: "https://pub.dartlang.org" + source: hosted + version: "1.1.1" + code_builder: + dependency: transitive + description: + name: code_builder + url: "https://pub.dartlang.org" + source: hosted + version: "4.4.0" + collection: + dependency: transitive + description: + name: collection + url: "https://pub.dartlang.org" + source: hosted + version: "1.16.0" + convert: + dependency: transitive + description: + name: convert + url: "https://pub.dartlang.org" + source: hosted + version: "3.1.1" + crypto: + dependency: transitive + description: + name: crypto + url: "https://pub.dartlang.org" + source: hosted + version: "3.0.2" + cupertino_icons: + dependency: "direct main" + description: + name: cupertino_icons + url: "https://pub.dartlang.org" + source: hosted + version: "1.0.5" + dart_style: + dependency: transitive + description: + name: dart_style + url: "https://pub.dartlang.org" + source: hosted + version: "2.2.5" + fake_async: + dependency: transitive + description: + name: fake_async + url: "https://pub.dartlang.org" + source: hosted + version: "1.3.1" + ffi: + dependency: "direct main" + description: + name: ffi + url: "https://pub.dartlang.org" + source: hosted + version: "2.0.2" + ffigen: + dependency: "direct dev" + description: + name: ffigen + url: "https://pub.dartlang.org" + source: hosted + version: "7.2.7" + file: + dependency: transitive + description: + name: file + url: "https://pub.dartlang.org" + source: hosted + version: "6.1.4" + fixnum: + dependency: transitive + description: + name: fixnum + url: "https://pub.dartlang.org" + source: hosted + version: "1.0.1" + flutter: + dependency: "direct main" + description: flutter + source: sdk + version: "0.0.0" + flutter_lints: + dependency: "direct dev" + description: + name: flutter_lints + url: "https://pub.dartlang.org" + source: hosted + version: "2.0.1" + flutter_localizations: + dependency: "direct main" + description: flutter + source: sdk + version: "0.0.0" + flutter_test: + dependency: "direct dev" + description: flutter + source: sdk + version: "0.0.0" + frontend_server_client: + dependency: transitive + description: + name: frontend_server_client + url: "https://pub.dartlang.org" + source: hosted + version: "3.2.0" + get_it: + dependency: "direct main" + description: + name: get_it + url: "https://pub.dartlang.org" + source: hosted + version: "7.6.0" + glob: + dependency: transitive + description: + name: glob + url: "https://pub.dartlang.org" + source: hosted + version: "2.1.1" + google_fonts: + dependency: "direct main" + description: + name: google_fonts + url: "https://pub.dartlang.org" + source: hosted + version: "4.0.4" + graphs: + dependency: transitive + description: + name: graphs + url: "https://pub.dartlang.org" + source: hosted + version: "2.3.1" + http: + dependency: transitive + description: + name: http + url: "https://pub.dartlang.org" + source: hosted + version: "0.13.5" + http_multi_server: + dependency: transitive + description: + name: http_multi_server + url: "https://pub.dartlang.org" + source: hosted + version: "3.2.1" + http_parser: + dependency: transitive + description: + name: http_parser + url: "https://pub.dartlang.org" + source: hosted + version: "4.0.2" + intl: + dependency: "direct main" + description: + name: intl + url: "https://pub.dartlang.org" + source: hosted + version: "0.17.0" + io: + dependency: transitive + description: + name: io + url: "https://pub.dartlang.org" + source: hosted + version: "1.0.4" + js: + dependency: transitive + description: + name: js + url: "https://pub.dartlang.org" + source: hosted + version: "0.6.5" + json_annotation: + dependency: "direct main" + description: + name: json_annotation + url: "https://pub.dartlang.org" + source: hosted + version: "4.8.0" + json_serializable: + dependency: "direct dev" + description: + name: json_serializable + url: "https://pub.dartlang.org" + source: hosted + version: "6.6.1" + lints: + dependency: transitive + description: + name: lints + url: "https://pub.dartlang.org" + source: hosted + version: "2.0.1" + logging: + dependency: transitive + description: + name: logging + url: "https://pub.dartlang.org" + source: hosted + version: "1.1.1" + matcher: + dependency: transitive + description: + name: matcher + url: "https://pub.dartlang.org" + source: hosted + version: "0.12.12" + material_color_utilities: + dependency: transitive + description: + name: material_color_utilities + url: "https://pub.dartlang.org" + source: hosted + version: "0.1.5" + meta: + dependency: transitive + description: + name: meta + url: "https://pub.dartlang.org" + source: hosted + version: "1.8.0" + mime: + dependency: transitive + description: + name: mime + url: "https://pub.dartlang.org" + source: hosted + version: "1.0.4" + package_config: + dependency: transitive + description: + name: package_config + url: "https://pub.dartlang.org" + source: hosted + version: "2.1.0" + path: + dependency: transitive + description: + name: path + url: "https://pub.dartlang.org" + source: hosted + version: "1.8.2" + path_provider: + dependency: transitive + description: + name: path_provider + url: "https://pub.dartlang.org" + source: hosted + version: "2.0.15" + path_provider_android: + dependency: transitive + description: + name: path_provider_android + url: "https://pub.dartlang.org" + source: hosted + version: "2.0.27" + path_provider_foundation: + dependency: transitive + description: + name: path_provider_foundation + url: "https://pub.dartlang.org" + source: hosted + version: "2.2.3" + path_provider_linux: + dependency: transitive + description: + name: path_provider_linux + url: "https://pub.dartlang.org" + source: hosted + version: "2.1.11" + path_provider_platform_interface: + dependency: transitive + description: + name: path_provider_platform_interface + url: "https://pub.dartlang.org" + source: hosted + version: "2.0.6" + path_provider_windows: + dependency: transitive + description: + name: path_provider_windows + url: "https://pub.dartlang.org" + source: hosted + version: "2.1.7" + platform: + dependency: transitive + description: + name: platform + url: "https://pub.dartlang.org" + source: hosted + version: "3.1.0" + plugin_platform_interface: + dependency: transitive + description: + name: plugin_platform_interface + url: "https://pub.dartlang.org" + source: hosted + version: "2.1.4" + pool: + dependency: transitive + description: + name: pool + url: "https://pub.dartlang.org" + source: hosted + version: "1.5.1" + process: + dependency: transitive + description: + name: process + url: "https://pub.dartlang.org" + source: hosted + version: "4.2.4" + pub_semver: + dependency: transitive + description: + name: pub_semver + url: "https://pub.dartlang.org" + source: hosted + version: "2.1.4" + pubspec_parse: + dependency: transitive + description: + name: pubspec_parse + url: "https://pub.dartlang.org" + source: hosted + version: "1.2.3" + quiver: + dependency: transitive + description: + name: quiver + url: "https://pub.dartlang.org" + source: hosted + version: "3.2.1" + scoped_model: + dependency: "direct main" + description: + name: scoped_model + url: "https://pub.dartlang.org" + source: hosted + version: "2.0.0" + shelf: + dependency: transitive + description: + name: shelf + url: "https://pub.dartlang.org" + source: hosted + version: "1.4.1" + shelf_web_socket: + dependency: transitive + description: + name: shelf_web_socket + url: "https://pub.dartlang.org" + source: hosted + version: "1.0.4" + sky_engine: + dependency: transitive + description: flutter + source: sdk + version: "0.0.99" + source_gen: + dependency: transitive + description: + name: source_gen + url: "https://pub.dartlang.org" + source: hosted + version: "1.3.2" + source_helper: + dependency: transitive + description: + name: source_helper + url: "https://pub.dartlang.org" + source: hosted + version: "1.3.3" + source_span: + dependency: transitive + description: + name: source_span + url: "https://pub.dartlang.org" + source: hosted + version: "1.9.0" + stack_trace: + dependency: transitive + description: + name: stack_trace + url: "https://pub.dartlang.org" + source: hosted + version: "1.10.0" + stream_channel: + dependency: transitive + description: + name: stream_channel + url: "https://pub.dartlang.org" + source: hosted + version: "2.1.0" + stream_transform: + dependency: transitive + description: + name: stream_transform + url: "https://pub.dartlang.org" + source: hosted + version: "2.1.0" + string_scanner: + dependency: transitive + description: + name: string_scanner + url: "https://pub.dartlang.org" + source: hosted + version: "1.1.1" + term_glyph: + dependency: transitive + description: + name: term_glyph + url: "https://pub.dartlang.org" + source: hosted + version: "1.2.1" + test_api: + dependency: transitive + description: + name: test_api + url: "https://pub.dartlang.org" + source: hosted + version: "0.4.12" + timing: + dependency: transitive + description: + name: timing + url: "https://pub.dartlang.org" + source: hosted + version: "1.0.1" + typed_data: + dependency: transitive + description: + name: typed_data + url: "https://pub.dartlang.org" + source: hosted + version: "1.3.2" + vector_math: + dependency: transitive + description: + name: vector_math + url: "https://pub.dartlang.org" + source: hosted + version: "2.1.2" + watcher: + dependency: transitive + description: + name: watcher + url: "https://pub.dartlang.org" + source: hosted + version: "1.0.2" + web_socket_channel: + dependency: transitive + description: + name: web_socket_channel + url: "https://pub.dartlang.org" + source: hosted + version: "2.4.0" + win32: + dependency: transitive + description: + name: win32 + url: "https://pub.dartlang.org" + source: hosted + version: "4.1.4" + xdg_directories: + dependency: transitive + description: + name: xdg_directories + url: "https://pub.dartlang.org" + source: hosted + version: "1.0.0" + yaml: + dependency: transitive + description: + name: yaml + url: "https://pub.dartlang.org" + source: hosted + version: "3.1.1" + yaml_edit: + dependency: transitive + description: + name: yaml_edit + url: "https://pub.dartlang.org" + source: hosted + version: "2.1.0" +sdks: + dart: ">=2.18.6 <3.0.0" + flutter: ">=3.3.0" diff --git a/example/pubspec.yaml b/example/pubspec.yaml new file mode 100644 index 0000000..dfa734e --- /dev/null +++ b/example/pubspec.yaml @@ -0,0 +1,45 @@ +name: flutter_example_packages +description: An application demonstrating the operation of Flutter plugins on the Aurora OS. + +publish_to: "none" + +version: 1.0.0+1 + +environment: + sdk: ">=2.18.6 <3.0.0" + +dependencies: + flutter: + sdk: flutter + flutter_localizations: + sdk: flutter + #################################### + ## Platform dependent plugins Aurora OS + + #################################### + ## Package verified + cupertino_icons: ^1.0.2 + google_fonts: ^4.0.3 + scoped_model: ^2.0.0 + get_it: ^7.2.0 + json_annotation: ^4.8.0 + ffi: ^2.0.2 + intl: ^0.17.0 + +dev_dependencies: + flutter_test: + sdk: + flutter + #################################### + ## Package verified + flutter_lints: ^2.0.0 + build_runner: ^2.3.3 + json_serializable: ^6.6.1 + ffigen: ^7.2.7 + +flutter: + generate: true + uses-material-design: true + assets: + - assets/ + - assets/images/ diff --git a/example/run.sh b/example/run.sh new file mode 100755 index 0000000..0ff40b8 --- /dev/null +++ b/example/run.sh @@ -0,0 +1,94 @@ +#!/bin/bash + +# Copyright (c) 2023. Open Mobile Platform LLC. +# License: Proprietary. + +## Build example, sign rpm, upload/install/run rpm to device + +## Usage +## +## chmod +x ./run.sh +## +## ./run.sh \ +## -d : \ +## -s /home/user/sign/folder + +## Flutter path +FLUTTER="$HOME/.local/opt/flutter-sdk/bin/flutter" + +## https://developer.auroraos.ru/doc/software_development/psdk/setup +## Install Platform SDK path +## You may not have set the PSDK_DIR environment variable. +## export PSDK_DIR=$HOME/AuroraPlatformSDK/sdks/aurora_psdk + +while getopts d:s: flag; do + case "${flag}" in + d) device=${OPTARG} ;; + s) sign=${OPTARG} ;; + *) + echo "usage: $0 [-d] [-s]" >&2 + exit 1 + ;; + esac +done + +## Update dependency +$FLUTTER pub get + +## Generate internationalizing +$FLUTTER gen-l10n + +## Run ffigen +# $FLUTTER pub run ffigen + +## Build aurora example app +{ + $FLUTTER build aurora --release +} || { + exit 1; +} + +if [ -n "$sign" ]; then + + key=$(ls "$sign"/*key.pem) + + if [ -z "$key" ]; then + echo "Key *key.pem not found." + exit + fi + + cert=$(ls "$sign"/*cert.pem) + + if [ -z "$cert" ]; then + echo "Key *cert.pem not found." + exit + fi + + ## Sign rpm system key + "$PSDK_DIR"/sdk-chroot rpmsign-external sign \ + --key "$key" \ + --cert "$cert" \ + build/aurora/arm/release/RPMS/*.rpm +fi + +if [ -n "$device" ]; then + + PACKAGE="ru.auroraos.flutter_example_packages" + + IFS=':' read -ra ADDR <<< "$device" + + D_IP="${ADDR[0]}" + D_PASS="${ADDR[1]}" + + # shellcheck disable=SC2012 + rpm=$(ls "$PWD"/build/aurora/arm/release/RPMS/*.rpm | sort -r | head -n 1) + + # upload rpm + scp "$rpm" defaultuser@"$D_IP:/home/defaultuser/Downloads" + + # install rpm + ssh -t defaultuser@"$D_IP" "echo $D_PASS | devel-su pkcon -y install-local /home/defaultuser/Downloads/$PACKAGE*.rpm" + + # run application + ssh -t defaultuser@"$D_IP" "/usr/bin/$PACKAGE" +fi diff --git a/example/web/favicon.png b/example/web/favicon.png new file mode 100644 index 0000000..8aaa46a Binary files /dev/null and b/example/web/favicon.png differ diff --git a/example/web/icons/Icon-192.png b/example/web/icons/Icon-192.png new file mode 100644 index 0000000..b749bfe Binary files /dev/null and b/example/web/icons/Icon-192.png differ diff --git a/example/web/icons/Icon-512.png b/example/web/icons/Icon-512.png new file mode 100644 index 0000000..88cfd48 Binary files /dev/null and b/example/web/icons/Icon-512.png differ diff --git a/example/web/icons/Icon-maskable-192.png b/example/web/icons/Icon-maskable-192.png new file mode 100644 index 0000000..eb9b4d7 Binary files /dev/null and b/example/web/icons/Icon-maskable-192.png differ diff --git a/example/web/icons/Icon-maskable-512.png b/example/web/icons/Icon-maskable-512.png new file mode 100644 index 0000000..d69c566 Binary files /dev/null and b/example/web/icons/Icon-maskable-512.png differ diff --git a/example/web/index.html b/example/web/index.html new file mode 100644 index 0000000..be172b7 --- /dev/null +++ b/example/web/index.html @@ -0,0 +1,58 @@ + + + + + + + + + + + + + + + + + + + + flutter_example_packages + + + + + + + + + + diff --git a/example/web/manifest.json b/example/web/manifest.json new file mode 100644 index 0000000..090d9c0 --- /dev/null +++ b/example/web/manifest.json @@ -0,0 +1,35 @@ +{ + "name": "flutter_example_packages", + "short_name": "flutter_example_packages", + "start_url": ".", + "display": "standalone", + "background_color": "#0175C2", + "theme_color": "#0175C2", + "description": "A new Flutter project.", + "orientation": "portrait-primary", + "prefer_related_applications": false, + "icons": [ + { + "src": "icons/Icon-192.png", + "sizes": "192x192", + "type": "image/png" + }, + { + "src": "icons/Icon-512.png", + "sizes": "512x512", + "type": "image/png" + }, + { + "src": "icons/Icon-maskable-192.png", + "sizes": "192x192", + "type": "image/png", + "purpose": "maskable" + }, + { + "src": "icons/Icon-maskable-512.png", + "sizes": "512x512", + "type": "image/png", + "purpose": "maskable" + } + ] +}