Skip to content
Snippets Groups Projects

Compare revisions

Changes are shown as if the source revision was being merged into the target revision. Learn more about comparing revisions.

Source

Select target project
No results found
Select Git revision
  • dev
  • dubp_rs
  • duniterV1Latest
  • hugo_RML16
  • implementLightnode
  • master
  • polkadart-stuff
  • provider-to-riverpod
  • refactorOnboardingSlideshow
  • scanNetwork
  • subscribesSplit
  • 0.0.0+10
  • 0.0.0+13
  • 0.0.0+3
  • 0.0.0+4
  • 0.0.0+5
  • 0.0.0+7
  • 0.0.0+8
  • 0.0.0+9
  • polkawallet-sdk-latest
  • v0.0.1+0
  • v0.0.1+22
  • v0.0.1+6
  • v0.0.10+25
  • v0.0.10+26
  • v0.0.10+27
  • v0.0.11+28
  • v0.0.11+30
  • v0.0.11+31
  • v0.0.11+32
  • v0.0.12+33
  • v0.0.12+34
  • v0.0.12+35
  • v0.0.12+36
  • v0.0.12+37
  • v0.0.12+38
  • v0.0.12+39
  • v0.0.13+40
  • v0.0.13+41
  • v0.0.13+42
  • v0.0.14+43
  • v0.0.14+44
  • v0.0.14+45
  • v0.0.14+46
  • v0.0.15+47
  • v0.0.15+48
  • v0.0.15+49
  • v0.0.15+50
  • v0.0.15+51
  • v0.0.2+5
  • v0.0.2+7
  • v0.0.6+2
  • v0.0.6+3
  • v0.0.6+5
  • v0.0.6+8
  • v0.0.7+1
  • v0.0.7+10
  • v0.0.7+4
  • v0.0.7+5
  • v0.0.7+6
  • v0.0.7+7
  • v0.0.7+8
  • v0.0.7+9
  • v0.0.8+0
  • v0.0.8+3
  • v0.0.8+6
  • v0.0.8+7
  • v0.0.8+9
  • v0.0.9+10
  • v0.0.9+11
  • v0.0.9+12
  • v0.0.9+13
  • v0.0.9+14
  • v0.0.9+15
  • v0.0.9+16
  • v0.0.9+17
  • v0.0.9+18
  • v0.0.9+19
  • v0.0.9+2
  • v0.0.9+20
  • v0.0.9+23
  • v0.0.9+24
  • v0.1.0+52
  • v0.1.0+53
  • v0.1.0+54
  • v0.1.0+56
  • v0.1.1+58
  • v0.1.10+81
  • v0.1.11+82
  • v0.1.12+83
  • v0.1.12+84
  • v0.1.13+85
  • v0.1.14+86
  • v0.1.15+87
  • v0.1.16+88
  • v0.1.17+89
  • v0.1.18+90
  • v0.1.19+91
  • v0.1.2+59
  • v0.1.20+92
  • v0.1.21+93
  • v0.1.21+94
  • v0.1.21+95
  • v0.1.21+96
  • v0.1.21+97
  • v0.1.21+98
  • v0.1.22+100
  • v0.1.22+99
  • v0.1.23+101
  • v0.1.24+102
  • v0.1.25+105
111 results

Target

Select target project
  • clients/gecko
  • Eloitor/gecko
  • scanlegentil/gecko
  • kapis/gecko
4 results
Select Git revision
  • dubp_rs
  • duniterV1Latest
  • hugo_RML16
  • implementLightnode
  • master
  • refactoWidgetInsteadMethods
  • refactorOnboardingSlideshow
  • scanNetwork
  • subscribesSplit
  • tmp
  • 0.0.0+10
  • 0.0.0+13
  • 0.0.0+3
  • 0.0.0+4
  • 0.0.0+5
  • 0.0.0+7
  • 0.0.0+8
  • 0.0.0+9
  • v0.0.1+0
  • v0.0.1+22
  • v0.0.1+6
  • v0.0.10+25
  • v0.0.10+26
  • v0.0.10+27
  • v0.0.11+28
  • v0.0.11+30
  • v0.0.11+31
  • v0.0.11+32
  • v0.0.12+33
  • v0.0.12+34
  • v0.0.2+5
  • v0.0.2+7
  • v0.0.6+2
  • v0.0.6+3
  • v0.0.6+5
  • v0.0.6+8
  • v0.0.7+1
  • v0.0.7+10
  • v0.0.7+4
  • v0.0.7+5
  • v0.0.7+6
  • v0.0.7+7
  • v0.0.7+8
  • v0.0.7+9
  • v0.0.8+0
  • v0.0.8+3
  • v0.0.8+6
  • v0.0.8+7
  • v0.0.8+9
  • v0.0.9+10
  • v0.0.9+11
  • v0.0.9+12
  • v0.0.9+13
  • v0.0.9+14
  • v0.0.9+15
  • v0.0.9+16
  • v0.0.9+17
  • v0.0.9+18
  • v0.0.9+19
  • v0.0.9+2
  • v0.0.9+20
  • v0.0.9+23
  • v0.0.9+24
63 results
Show changes
Commits on Source (705)
Showing
with 618 additions and 131 deletions
# iOS Build Configuration
APPLE_ID=your.email@example.com
APP_SPECIFIC_PASSWORD=xxxx-xxxx-xxxx-xxxx
BUNDLE_ID=com.example.gecko
TEAM_ID=XXXXXXXXXX
\ No newline at end of file
{
"flutterSdkVersion": "3.32.5"
}
\ No newline at end of file
3.32.5
\ No newline at end of file
3.32.5
\ No newline at end of file
{
"flutter": "3.32.5"
}
\ No newline at end of file
......@@ -15,9 +15,6 @@
*.iws
.idea/
# VS Code related
.vscode/
# Flutter/Dart/Pub related
**/doc/api/
**/ios/Flutter/.last_build_id
......@@ -47,11 +44,164 @@ android/key.properties
# Rust things
/target
# Linux builds
linux/
# Custom
scripts/private/
AppDir/
appimage-builder-cache/
AppImageBuilder.yml
integration_test/duniter/data/chains/
# Ignore PC deps
scripts/pushGecko
android-old
# Environment variables
.env
# Helios related
/ios/Flutter/Helios.xcconfig
/ios/Helios.xcconfig
/ios/Runner/GoogleService-Info.plist
goldensExports
/test/**/failures
# Miscellaneous
*.class
*.log
*.pyc
*.swp
.DS_Store
.atom/
.build/
.buildlog/
.history
.svn/
.swiftpm/
migrate_working_dir/
# IntelliJ related
*.iml
*.ipr
*.iws
.idea/
# Visual Studio Code related
.classpath
.project
.settings/
.ccls-cache
# Flutter/Dart/Pub related
**/doc/api/
**/ios/Flutter/.last_build_id
.dart_tool/
.flutter-plugins
.flutter-plugins-dependencies
**/generated_plugin_registrant.dart
.packages
.packages.generated
.pub-preload-cache/
.pub-cache/
.pub/
/build/
flutter_*.png
linked_*.ds
unlinked.ds
unlinked_spec.ds
# Symbolication related
app.*.symbols
# Obfuscation related
app.*.map.json
# Android related
**/android/**/gradle-wrapper.jar
.gradle/
**/android/captures/
**/android/gradlew
**/android/gradlew.bat
**/android/**/GeneratedPluginRegistrant.java
**/android/key.properties
*.jks
local.properties
**/.cxx/
/android/app/debug
/android/app/profile
/android/app/release
# android build folder
android/app/build/*
# iOS/XCode related
**/ios/**/*.mode1v3
**/ios/**/*.mode2v3
**/ios/**/*.moved-aside
**/ios/**/*.pbxuser
**/ios/**/*.perspectivev3
**/ios/**/*sync/
**/ios/**/.sconsign.dblite
**/ios/**/.tags*
**/ios/**/.vagrant/
**/ios/**/DerivedData/
**/ios/**/Icon?
**/ios/**/Pods/
**/ios/**/.symlinks/
**/ios/**/profile
**/ios/**/xcuserdata
**/ios/.generated/
**/ios/Flutter/.last_build_id
**/ios/Flutter/App.framework
**/ios/Flutter/Flutter.framework
**/ios/Flutter/Flutter.podspec
**/ios/Flutter/Generated.xcconfig
**/ios/Flutter/ephemeral
**/ios/Flutter/app.flx
**/ios/Flutter/app.zip
**/ios/Flutter/flutter_assets/
**/ios/Flutter/flutter_export_environment.sh
**/ios/ServiceDefinitions.json
**/ios/Runner/GeneratedPluginRegistrant.*
/ios/build
/ios/Podfile.lock
# macOS
**/Flutter/ephemeral/
**/Pods/
**/macos/Flutter/GeneratedPluginRegistrant.swift
**/macos/Flutter/ephemeral
**/xcuserdata/
# Windows
**/windows/flutter/ephemeral/
**/windows/flutter/generated_plugin_registrant.cc
**/windows/flutter/generated_plugin_registrant.h
**/windows/flutter/generated_plugins.cmake
# Linux
**/linux/flutter/ephemeral/
**/linux/flutter/generated_plugin_registrant.cc
**/linux/flutter/generated_plugin_registrant.h
**/linux/flutter/generated_plugins.cmake
# Coverage
coverage/
# zsh
.autoenv*
# FVM Version Cache
.fvm/flutter_sdk/
.fvm/versions/
# Exceptions to above rules
!**/ios/**/default.mode1v3
!**/ios/**/default.mode2v3
!**/ios/**/default.pbxuser
!**/ios/**/default.perspectivev3
!/packages/flutter_tools/test/data/dart_dependencies_test/**/.packages
!/dev/ci/**/Gemfile.lock
# Tests related
integration_test/screenshots/
.fvm/flutter_sdk
......@@ -5,9 +5,9 @@ stages:
- package
.env:
image: axiomteam/gecko-ci:v0.0.8
image: ghcr.io/cirruslabs/flutter:3.24.3
tags:
- redshift
- docker
format:
extends: .env
......@@ -17,6 +17,8 @@ format:
- if: $CI_COMMIT_TAG || $CI_MERGE_REQUEST_ID
- when: manual
stage: format
script:
- dart format --set-exit-if-changed lib
build_and_test:
extends: .env
......@@ -26,29 +28,11 @@ build_and_test:
- if: $CI_COMMIT_TAG || $CI_MERGE_REQUEST_ID
- when: manual
stage: build_and_test
tags:
- redshift
script:
- flutter clean
- rm -rf /root/.pub-cache
- flutter pub get
- flutter analyze
# - flutter test
lint:
extends: .env
rules:
- if: $CI_COMMIT_REF_NAME =~ /^wip*$/
when: manual
- if: $CI_COMMIT_TAG || $CI_MERGE_REQUEST_ID
- when: manual
stage: quality
audit_dependencies:
extends: .env
rules:
- if: $CI_COMMIT_REF_NAME =~ /^wip*$/
when: manual
- if: $CI_COMMIT_TAG || $CI_MERGE_REQUEST_ID
- when: manual
stage: quality
releases:test:
extends: .env
......
......@@ -4,7 +4,27 @@
# This file should be version controlled and should not be manually edited.
version:
revision: 1aafb3a8b9b0c36241c5f5b34ee914770f015818
channel: stable
revision: "6fba2447e95c451518584c35e25f5433f14d888c"
channel: "stable"
project_type: app
# Tracks metadata for the flutter migrate command
migration:
platforms:
- platform: root
create_revision: 6fba2447e95c451518584c35e25f5433f14d888c
base_revision: 6fba2447e95c451518584c35e25f5433f14d888c
- platform: ios
create_revision: 6fba2447e95c451518584c35e25f5433f14d888c
base_revision: 6fba2447e95c451518584c35e25f5433f14d888c
# 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'
{
"version": "0.2.0",
"configurations": [
{
"name": "Flutter (Debug)",
"type": "dart",
"request": "launch",
"program": "lib/main.dart",
"args": ["--no-enable-impeller"],
"flutterMode": "debug"
},
{
"name": "Flutter (Profile)",
"type": "dart",
"request": "launch",
"program": "lib/main.dart",
"args": ["--no-enable-impeller"],
"flutterMode": "profile"
},
{
"name": "Flutter (Release)",
"type": "dart",
"request": "launch",
"program": "lib/main.dart",
"flutterMode": "release"
}
],
"compounds": []
}
\ No newline at end of file
{
"dart.flutterSdkPath": ".fvm/versions/3.32.5"
}
\ No newline at end of file
# Ğecko
Ğecko is a transaction client owned by [Axiom-Team association] and written in Dart. It is fast and secure thanks to native code compilation. It is not intended to manage member accounts, but rather simple wallets.
Ğecko is mobile client for Duniter v2s blockchain (Ḡ1v2): https://duniter.org/blog/duniter-substrate<br>
It use polkawallet_sdk package to interact with Duniter: https://github.com/polkawallet-io/sdk
The development is quite early, you can participate in the discussion [on the Duniter forum](https://forum.duniter.org/t/gecko-nouveau-client-de-paiements-1-sur-mobile-en-cours-de-developpement-dart-flutter/7857) (mostly FR)
This application is maintained by [Axiom-Team association](https://axiom-team.fr/).
[Axiom-Team association]: https://axiom-team.fr/
You can download the last version of the app [here](https://forum.duniter.org/t/gecko-gdev-last-build/9367/last).<br>
You can ask questions about Ḡecko developpement in our [Duniter forum](https://forum.duniter.org/t/gecko-talks-user-support/9372/last).
## Getting Started
<div align="center">
![Demo Gif](https://git.p2p.legal/axiom-team/gecko/raw/branch/master/assets/Demo-0.0.1+0.gif)
![Demo Gif](https://git.duniter.org/clients/gecko/-/raw/master/images/demo-0.0.9+2.gif)
<br><br>
![Foo](https://git.p2p.legal/axiom-team/gecko/raw/commit/1cd2d63fe02949edabb69aa5fc498512c01db416/images/art/bb_gecko.png)
</div>
## Develop
To contribute to the code, we advise you to install the following development environment.
To contribute to the code, we advise you to install the following development environment:
1. [Android Studio](https://developer.android.com/studio/install)
2. [Flutter](https://docs.flutter.dev/get-started/install)
3. [VSCode](https://code.visualstudio.com/docs/setup/linux) or [VSCodium](https://vscodium.com/)
1. Android Studio
- Android VM
- Android NDK
1. Flutter SDK
1. VSCode/Codium Flutter extension
This will take about 12GB on your drive and 20 min of your time (with a good connection). Don't
hesitate to ask on the forum for a peer-coding session if you are stuck.
This will take about 12GB on your drive and 30 min of your time (with a good connection). Don't hesitate to ask on the forum for a peer-coding session if you are stuck.
At the end, `flutter doctor` command should be OK for what you need.
### Android Studio
Android Studio will let you set up an Android VM and install tools you need.
- Install [Android Studio](https://developer.android.com/studio/) using your favorite installation method.
- Install [Android Studio](https://developer.android.com/studio/) using your favorite installation
method.
- At startup, do not open a project but click "configure" at the bottom of the "Welcome" menu
- In "SDK Manager"
- SDK Platforms Ttab
- note your SDK folder location (later used for Rust environment variables)
- select Android 11 (R) API level 30 (default)
- SDK Tools
- select NDK (native development kit used to compile Rust to native target)
- SDK Platforms tab
- select Android 11 (R) API level 30 (default) or higher
- In "AVD Manager"
- create a virtual machine (ours is Pixel 4 32bits machine)
- launch it in the emulator
- create a virtual machine
If you reach this point without trouble, you're good to go for the next step.
### iOS (Xcode on Mac)
TODO: documentation
### Flutter SDK
Flutter is a powerfull SDK to develop Android apps. [Install it](https://flutter.dev/docs/get-started/install/linux) with your favorite installation method.
Flutter is a powerfull SDK to develop Android
apps. [Install it](https://flutter.dev/docs/get-started/install/linux) with your favorite
installation method.
### VSCode
We are using VSCode and therefore document the process for this IDE. Of course you're free to use whatever you want.
Clone the ğecko repo and open a dart file (e.g. `lib/main.dart`). VSCode will suggest you to insall relevant extensions.
We are using VSCode and therefore document the process for this IDE. Of course you're free to use
whatever you want.
Clone the ğecko repo and open a dart file (e.g. `lib/main.dart`). VSCode will suggest you to insall
relevant extensions.
### Build the app
### Launch the app in debug mode
In a dart file (e.g. `lib/main.dart`), type the `F5` key to build the code. The app should open automatically in your VM which is running.
Start a VM, then open a dart file (e.g. `lib/main.dart`), type the `F5` key to build the code. The app should open
automatically in your VM which is running.
### Build your app for Desktop
### Build APK
#### Linux
You will need to generate PlayStore key or disable signing APK before continue.
Then, check this script and launch it:
Install dependancies:
```
./scripts/build-apk.sh
```
### Integration tests
`sudo apt-get install clang cmake ninja-build pkg-config libgtk-3-dev`
Open an android or iOS emulator, then launch this script:
Then build debug for linux:
```
./integration_test/launch_test.sh
```
`flutter run -d linux`
It will start the [default test scenario](https://git.duniter.org/clients/gecko/-/blob/master/integration_test/scenarios/gecko_complete.dart).
If you get this error:
You can start another scenario defined [here](https://git.duniter.org/clients/gecko/-/tree/master/integration_test/scenarios) specifying the name of the file without its extension, for example to run migrate_cesium_identity.dart test:
```
flutter /usr/share/cmake-3.16/Modules/FindPkgConfig.cmake:643 (_pkg_check_modules_internal)
./integration_test/launch_test.sh migrate_cesium_identity
```
Please try:
`sudo apt install liblzma-dev`
then
`flutter clean && flutter run -d linux`
## Roadmap
- v0.1.0 (expected date: 21-08-16)
- Reorganization of persistent data
- Complete implementation of Figma model (made by Boris)
- Account management (creation, security)
- Payment (QR-code generation / reading, form)
- Viewing transaction history
- Finalization of integration tests and unit tests
- Completing the network scan when starting the application
- F-Droid publication
- v1.0
- Multi-vault management
- Cesium import
- Advanced search
- Item basket management
- Transaction monitoring
- Contacts / Messaging
- IOS compatibility
- Sharding (sharing of key fragments)
- Apple AppStore and Google PlayStore publication
- Mock-up and UX design of future functionalities
- v2.0
- Opaque bypass
- NFC payment
- Desktop compatibility
- Web of trust management (certifications, promises of certifications)
- Calendar / community
### A problem ?
Please open an issue here: https://git.duniter.org/clients/gecko/-/boards
# Universal Dividends Integration
This document explains how to use the new universal dividends (UD) integration feature in the Gecko wallet.
## Overview
The wallet now supports displaying universal dividends alongside regular transactions in the account history. This feature allows users to see a complete picture of their account activity, including both peer-to-peer transfers and universal dividend payments.
## New Features
### 1. Extended Transaction Display Model
The `TransactionDisplayItem` class now supports both transactions and universal dividends:
```dart
enum TransactionType { transfer, universalDividend }
class TransactionDisplayItem {
final TransactionType type;
// ... other fields
bool get isUniversalDividend => type == TransactionType.universalDividend;
String get displayType => isUniversalDividend ? "Universal Dividend" : "Transfer";
}
```
### 2. Enhanced Transaction History Provider
The `TransactionHistoryNotifier` now includes methods to control universal dividend display:
```dart
// Toggle universal dividends on/off
historyNotifier.toggleUniversalDividends();
// Set universal dividends display explicitly
historyNotifier.setIncludeUniversalDividends(true);
// Get statistics about current loaded data
final stats = historyNotifier.getTransactionStats();
```
### 3. New GraphQL Query
A new GraphQL query `GetUdHistory` has been added to fetch universal dividend history:
```graphql
query GetUdHistory($identityRow: identity_scalar!, $after: String, $first: Int = 20) {
getUdHistory_connection(
args: { identity_row: $identityRow }
after: $after
first: $first
orderBy: { timestamp: DESC }
) {
edges {
node {
id
amount
timestamp
blockNumber
identityId
identity {
name
accountId
}
}
}
pageInfo {
endCursor
hasNextPage
}
}
}
```
### 4. Combined Service Method
A new service method `getCombinedAccountHistory` fetches and combines both transaction and UD data:
```dart
final result = await d.SquidService.client.getCombinedAccountHistory(
address,
number: 20,
cursor: null,
includeUniversalDividends: true,
);
```
## Usage Examples
### Basic Usage in Widget
```dart
class AccountHistoryWidget extends ConsumerWidget {
final String address;
@override
Widget build(BuildContext context, WidgetRef ref) {
final historyState = ref.watch(transactionHistoryProvider(address));
final historyNotifier = ref.read(transactionHistoryProvider(address).notifier);
return Column(
children: [
// Toggle button for universal dividends
ElevatedButton(
onPressed: () => historyNotifier.toggleUniversalDividends(),
child: Text(historyState.includeUniversalDividends
? 'Hide Universal Dividends'
: 'Show Universal Dividends'),
),
// Display transaction list
Expanded(
child: ListView.builder(
itemCount: historyState.transactions.length,
itemBuilder: (context, index) {
final transaction = historyState.transactions[index];
return ListTile(
leading: Icon(transaction.isUniversalDividend
? Icons.savings
: Icons.swap_horiz),
title: Text(transaction.displayType),
subtitle: Text(transaction.amount.toString()),
trailing: Text(transaction.timestamp.toString()),
);
},
),
),
],
);
}
}
```
### Advanced Usage with Statistics
```dart
class AccountStatsWidget extends ConsumerWidget {
final String address;
@override
Widget build(BuildContext context, WidgetRef ref) {
final historyNotifier = ref.read(transactionHistoryProvider(address).notifier);
final stats = historyNotifier.getTransactionStats();
return Card(
child: Column(
children: [
Text('Total Items: ${stats['total_items']}'),
Text('Transfers: ${stats['transfers']}'),
Text('Universal Dividends: ${stats['universal_dividends']}'),
Text('UDs Enabled: ${stats['include_uds_enabled']}'),
],
),
);
}
}
```
## Data Flow
1. **User toggles UD display**`toggleUniversalDividends()` called
2. **Provider refreshes data**`getCombinedAccountHistory()` called with `includeUniversalDividends` flag
3. **Service fetches data** → Both transfer and UD GraphQL queries executed
4. **Data combined and sorted** → Items sorted by timestamp, newest first
5. **UI updated**`TransactionDisplayItem` objects created for both types
## Key Points
- Universal dividends are always marked as "received" since they are always credited to the account
- Universal dividends don't have comments (unlike transfers)
- The feature is backward compatible - existing code continues to work
- Pagination works across both data types
- Real-time updates via subscriptions are maintained
## Implementation Details
- **GraphQL Schema**: Uses `getUdHistory_connection` with `identity_scalar` parameter
- **Type Safety**: Strong typing with `TransactionType` enum
- **Performance**: Data is fetched in parallel and combined client-side
- **Pagination**: Simplified pagination using transfer connection's page info
- **Error Handling**: Graceful fallback if UD queries fail
This integration provides a comprehensive view of account activity while maintaining the existing functionality and performance characteristics of the wallet.
\ No newline at end of file
# Intégration UX/UI des Dividendes Universels
## Vue d'ensemble
L'intégration des dividendes universels (DU) dans l'écran d'activité a été conçue pour être **discrète mais pratique**, suivant les principes d'UX de l'application Gecko existante.
## Emplacement et Design
### Position : AppBar
- **Localisation** : Intégré dans le `WalletAppBar` à côté des actions existantes (contact et QR code)
- **Justification** : Position familière et accessible, suit les conventions UX standard
- **Cohérence** : S'intègre naturellement dans le design existant
### Icône et États Visuels
#### État DÉSACTIVÉ (par défaut)
- **Icône** : `Icons.savings_outlined` (contour)
- **Couleur** : `onSecondaryContainer` avec 60% d'opacité (grisée)
- **Tooltip** : "Afficher les dividendes universels"
#### État ACTIVÉ
- **Icône** : `Icons.savings` (pleine)
- **Couleur** : `primary` (couleur d'accent de l'app)
- **Tooltip** : "Masquer les dividendes universels"
## Comportement UX
### Interaction
1. **Tap simple** : Bascule instantanément entre les deux états
2. **Feedback visuel** : Changement immédiat d'icône et de couleur
3. **Feedback informatif** : Tooltip explicatif au survol
4. **Pas d'animation** : Transition instantanée pour une UX fluide
### Persistance d'État
- **Session courante** : L'état est maintenu pendant la navigation
- **Rafraîchissement automatique** : Les données se rechargent automatiquement
- **Pas de stockage persistant** : Retour à l'état par défaut à chaque ouverture
## Intégration Technique
### Provider Pattern
```dart
// Watch du state pour la réactivité
final historyState = ref.watch(transactionHistoryProvider(address));
final historyNotifier = ref.read(transactionHistoryProvider(address).notifier);
// Action simple
historyNotifier.toggleUniversalDividends();
```
### Localisation
- **4 langues supportées** : FR, EN, ES, IT
- **Clés de traduction** :
- `showUniversalDividends`
- `hideUniversalDividends`
## Avantages UX/UI
### ✅ **Discrétion**
- Ne perturbe pas le flux utilisateur existant
- Icône familière et intuitive (`savings`)
- Taille appropriée (24px) pour ne pas dominer l'interface
### ✅ **Praticité**
- Accessible en un seul tap
- Position logique (dans les actions du wallet)
- Feedback visuel clair de l'état actuel
### ✅ **Cohérence**
- Suit les patterns de design existants
- Même logique que les autres toggles de l'app
- Couleurs et espacements conformes au design system
### ✅ **Performance**
- Aucun impact sur les performances existantes
- Chargement intelligent (seulement si activé)
- Pagination maintenue
## États d'Usage
### Utilisateur Novice
- **Par défaut** : DU masqués pour éviter la confusion
- **Découverte** : Tooltip explicatif aide à comprendre la fonction
- **Learning curve** : Aucun impact sur l'apprentissage existant
### Utilisateur Avancé
- **Accès rapide** : Toggle facilement accessible
- **Contrôle granulaire** : Peut activer/désactiver selon le contexte
- **Vue complète** : Historique enrichi quand souhaité
## Exemples d'Utilisation
### Scénario 1 : Consultation rapide
L'utilisateur veut juste voir ses transactions récentes → DU désactivés par défaut
### Scénario 2 : Analyse complète
L'utilisateur veut analyser tous ses revenus → Active les DU d'un tap
### Scénario 3 : Démonstration
Un membre explique le système à un nouvel utilisateur → Toggle pour montrer/cacher les DU
## Future Évolutions Possibles
- **Persistance d'état** : Mémoriser la préférence utilisateur
- **Filtre avancé** : Options supplémentaires de filtrage
- **Indicateur de DU** : Badge montrant le nombre de DU dans la période
- **Mode compact** : Affichage condensé des DU
Cette intégration respecte la philosophie de Gecko : **simplicité, efficacité et respect de l'utilisateur**.
\ No newline at end of file
......@@ -27,3 +27,6 @@ linter:
# Additional information about this file can be found at
# https://dart.dev/guides/language/analysis-options
formatter:
page_width: 120
plugins {
id 'com.android.application'
id 'kotlin-android'
id "dev.flutter.flutter-gradle-plugin"
}
def localProperties = new Properties()
def localPropertiesFile = rootProject.file('local.properties')
if (localPropertiesFile.exists()) {
......@@ -6,11 +12,6 @@ if (localPropertiesFile.exists()) {
}
}
def flutterRoot = localProperties.getProperty('flutter.sdk')
if (flutterRoot == null) {
throw new GradleException("Flutter SDK not found. Define location with flutter.sdk in the local.properties file.")
}
def flutterVersionCode = localProperties.getProperty('flutter.versionCode')
if (flutterVersionCode == null) {
flutterVersionCode = '1'
......@@ -21,10 +22,6 @@ if (flutterVersionName == null) {
flutterVersionName = '1.0'
}
apply plugin: 'com.android.application'
apply plugin: 'kotlin-android'
apply from: "$flutterRoot/packages/flutter_tools/gradle/flutter.gradle"
def keystoreProperties = new Properties()
def keystorePropertiesFile = rootProject.file('key.properties')
if (keystorePropertiesFile.exists()) {
......@@ -32,21 +29,30 @@ if (keystorePropertiesFile.exists()) {
}
android {
compileSdkVersion 31
namespace "fr.axiomteam.gecko"
compileSdk flutter.compileSdkVersion
ndkVersion "27.2.12479018" //flutter.ndkVersion
sourceSets {
main.java.srcDirs += 'src/main/kotlin'
compileOptions {
sourceCompatibility JavaVersion.VERSION_17
targetCompatibility JavaVersion.VERSION_17
}
kotlinOptions {
jvmTarget = '17'
}
lintOptions {
disable 'InvalidPackage'
sourceSets {
main.java.srcDirs += 'src/main/kotlin'
}
defaultConfig {
// TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html).
applicationId "gecko.axiomteam.fr"
minSdkVersion 19
targetSdkVersion 31
applicationId "fr.axiomteam.gecko"
// You can update the following values to match your application needs.
// For more information, see: https://docs.flutter.dev/deployment/android#reviewing-the-gradle-build-configuration.
minSdkVersion flutter.minSdkVersion
targetSdkVersion flutter.targetSdkVersion
versionCode flutterVersionCode.toInteger()
versionName flutterVersionName
multiDexEnabled true
......@@ -65,18 +71,20 @@ android {
release {
// TODO: Add your own signing config for the release build.
// Signing with the debug keys for now, so `flutter run --release` works.
signingConfig signingConfigs.debug
useProguard true
signingConfig signingConfigs.release
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
debug {
signingConfig signingConfigs.debug
debuggable true
}
}
}
flutter {
source '../..'
}
dependencies {
implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"
}
dependencies {}
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="gecko.axiomteam.fr">
<manifest xmlns:android="http://schemas.android.com/apk/res/android">
<!-- Flutter needs it to communicate with the running application
to allow setting breakpoints, to provide hot reload, etc.
-->
......
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="gecko.axiomteam.fr">
<manifest xmlns:android="http://schemas.android.com/apk/res/android">
<!-- io.flutter.app.FlutterApplication is an android.app.Application that
calls FlutterMain.startInitialization(this); in its onCreate method.
In most cases you can leave this as-is, but you if you want to provide
......@@ -10,6 +9,7 @@
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
<application
android:enableOnBackInvokedCallback="true"
android:requestLegacyExternalStorage="true"
android:name="${applicationName}"
android:label="Ğecko"
......@@ -19,7 +19,6 @@
<activity
android:requestLegacyExternalStorage="true"
android:name=".MainActivity"
android:resource="@style/NormalTheme"
android:icon="@mipmap/ic_launcher"
android:launchMode="singleTop"
android:theme="@style/LaunchTheme"
......@@ -42,6 +41,10 @@
<category android:name="android.intent.category.LAUNCHER"/>
</intent-filter>
</activity>
<activity
android:name="com.yalantis.ucrop.UCropActivity"
android:screenOrientation="portrait"
android:theme="@style/Theme.AppCompat.Light.NoActionBar"/>
<!-- Don't delete the meta-data below.
This is used by the Flutter tool to generate GeneratedPluginRegistrant.java -->
<meta-data
......
android/app/src/main/ic_launcher-playstore.png

50 KiB | W: 0px | H: 0px

android/app/src/main/ic_launcher-playstore.png

49.4 KiB | W: 0px | H: 0px

android/app/src/main/ic_launcher-playstore.png
android/app/src/main/ic_launcher-playstore.png
android/app/src/main/ic_launcher-playstore.png
android/app/src/main/ic_launcher-playstore.png
  • 2-up
  • Swipe
  • Onion skin
package gecko.axiomteam.fr
package fr.axiomteam.gecko
import io.flutter.embedding.android.FlutterActivity
......
package gecko.axiomteam.gecko
import io.flutter.embedding.android.FlutterActivity
class MainActivity: FlutterActivity() {
}