{"id":32649273,"url":"https://github.com/shadow60539/encrypto_app","last_synced_at":"2025-10-31T06:53:39.088Z","repository":{"id":37239408,"uuid":"505326890","full_name":"Shadow60539/encrypto_app","owner":"Shadow60539","description":"Want to securely encrypt your private and confidential files?","archived":false,"fork":false,"pushed_at":"2022-06-21T11:43:46.000Z","size":592,"stargazers_count":8,"open_issues_count":0,"forks_count":4,"subscribers_count":1,"default_branch":"master","last_synced_at":"2025-05-18T16:54:20.723Z","etag":null,"topics":["aes-encryption","dart","flutter","googlemobileads","inapppurchase","inappupdate","pkcs7-padding","playstore"],"latest_commit_sha":null,"homepage":"https://play.google.com/store/apps/details?id=com.sanjeev.flutter_encrypto","language":"Dart","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/Shadow60539.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2022-06-20T06:51:20.000Z","updated_at":"2024-10-05T11:56:51.000Z","dependencies_parsed_at":"2022-08-18T17:43:11.907Z","dependency_job_id":null,"html_url":"https://github.com/Shadow60539/encrypto_app","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/Shadow60539/encrypto_app","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Shadow60539%2Fencrypto_app","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Shadow60539%2Fencrypto_app/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Shadow60539%2Fencrypto_app/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Shadow60539%2Fencrypto_app/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/Shadow60539","download_url":"https://codeload.github.com/Shadow60539/encrypto_app/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Shadow60539%2Fencrypto_app/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":281946316,"owners_count":26587973,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","status":"online","status_checked_at":"2025-10-31T02:00:07.401Z","response_time":57,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["aes-encryption","dart","flutter","googlemobileads","inapppurchase","inappupdate","pkcs7-padding","playstore"],"created_at":"2025-10-31T06:53:24.376Z","updated_at":"2025-10-31T06:53:39.081Z","avatar_url":"https://github.com/Shadow60539.png","language":"Dart","funding_links":[],"categories":[],"sub_categories":[],"readme":"[![Dart](https://img.shields.io/badge/Dart-0175C2)](https://pub.dev/packages/fancy_text_reveal)\n![Flutter](https://img.shields.io/badge/Flutter-02569B)\n[![Test](https://github.com/Shadow60539/encrypto_app/actions/workflows/test.yml/badge.svg)](https://github.com/Shadow60539/encrypto_app/actions/workflows/test.yml)\n![License](https://img.shields.io/github/license/Shadow60539/encrypto_app?color=08C6A8)\n\n\n\n![lib](images/poster.png)\n\n[![Playstore](images/google-play-badge.png)](https://play.google.com/store/apps/details?id=com.sanjeev.flutter_encrypto)\n\n# 💎Encrypto: Easy File Encryption \n\n\n### Introduction 🚀\n\n\u003e Want to securely encrypt your private and confidential files?\n\n\u003e With Encrypto you easily and securely protect all your important files, in an interface that is fun and simple to use.\n\n\n### Demo 👀\n\n\nhttps://user-images.githubusercontent.com/59445273/174485877-42a3a771-2940-486d-aebf-4164f500f0d0.mp4\n\n### Key Features 🔑\n\n✔ Supports all file types (PDF, MP3, MP4, PNG, DOCX,...)\u003cbr\u003e\n✔ Add files from outside the app\u003cbr\u003e\n✔ Share the converted file from the app\n\n\n### Algorithm 🔒\n\nEverything is encrypted using the strong encryption algorithm: AES with PKCS7 padding\n\n\n### Usage 🔎\n\nTo clone and run this application, you'll need [git](https://git-scm.com) and [flutter](https://flutter.dev/docs/get-started/install) installed on your computer. From your command line:\n\n```bash\n# Clone this repository\n$ git clone https://github.com/Shadow60539/encrypto_app.git\n\n# Go into the repository\n$ cd encrypto_app\n\n# Install dependencies\n$ flutter packages get\n\n# Run the app\n$ flutter run\n```\n\n\n### Packages 📦\n\n\nPackage | Description\n---|---\n[file_cryptor](https://pub.dev/packages/file_cryptor) | FileCryptor is for encryption and decryption files.\n[file_picker](https://pub.dev/packages/file_picker) | A package that allows you to use the native file explorer to pick single or multiple files, with extensions filtering support.\n[mockito](https://pub.dev/packages/mockito) | A mock framework inspired by Mockito with APIs for Fakes, Mocks, behavior verification, and stubbing.\n[open_file](https://pub.dev/packages/open_file) | A plug-in that can call native APP to open files with string result in flutter.\n[path_provider](https://pub.dev/packages/path_provider) | A Flutter plugin for finding commonly used locations on the filesystem\n[permission_handler](https://pub.dev/packages/permission_handler) | This plugin provides a cross-platform (iOS, Android) API to request permissions and check their status.\n[lottie](https://pub.dev/packages/lottie) | Lottie is a mobile library for Android and iOS that parses Adobe After Effects animations exported as json with Bodymovin and renders them natively on mobile.\n[share_plus](https://pub.dev/packages/share_plus) | A Flutter plugin to share content from your Flutter app via the platform's share dialog.\n[flutter_archive](https://pub.dev/packages/flutter_archive) | Create and extract ZIP archive files.\n[flutter_bloc](https://pub.dev/packages/flutter_bloc) | State management.\n[freezed](https://pub.dev/packages/freezed) | Code generation for immutable classes that has a simple syntax/API without compromising on the features.\n[dartz](https://pub.dev/packages/dartz) | Functional Programming in Dart.\n[injectable](https://pub.dev/packages/injectable) | Injectable is a convenient code generator for get_it.\n[fancy_text_reveal](https://pub.dev/packages/fancy_text_reveal) | 💁‍♂️ \u003cb\u003eMy package\u003c/b\u003e. Fancy way to reveal widgets.\n[animated_text_kit](https://pub.dev/packages/animated_text_kit) | A flutter package project which contains a collection of cool and beautiful text animations.\n[flutter_svg](https://pub.dev/packages/flutter_svg) | An SVG rendering and widget library for Flutter.\n[package_info_plus](https://pub.dev/packages/package_info_plus) | Flutter plugin for querying information about the application package, such as CFBundleVersion on iOS or versionCode on Android.\n[flutter_isolate](https://pub.dev/packages/flutter_isolate) | FlutterIsolate provides a way to launch dart isolate in flutter that work with flutter plugins.\n[change_app_package_name](https://pub.dev/packages/change_app_package_name) | Change App Package Name with single command.\n[firebase_core](https://pub.dev/packages/firebase_core) | Flutter plugin for Firebase Core, enabling connecting to multiple Firebase apps.\n[cloud_firestore](https://pub.dev/packages/cloud_firestore) | Flutter plugin for Cloud Firestore, a cloud-hosted, noSQL database with live synchronization and offline support on Android and iOS.\n[equatable](https://pub.dev/packages/equatable) | A Dart package that helps to implement value based equality without needing to explicitly override == and hashCode.\n[countup](https://pub.dev/packages/countup) | An flutter plugin that will help you to build animated counter texts.\n[flutter_keyboard_visibility](https://pub.dev/packages/flutter_keyboard_visibility) | Flutter plugin for discovering the state of the soft-keyboard visibility on Android and iOS\n[flutter_launcher_icons](https://pub.dev/packages/flutter_launcher_icons) | A package which simplifies the task of updating your Flutter app's launcher icon.\n[flutter_native_splash](https://pub.dev/packages/flutter_native_splash) | Customize Flutter's default white native splash screen with background color and splash image.\n[fake_cloud_firestore](https://pub.dev/packages/fake_cloud_firestore) | Fake implementation of Cloud Firestore\n[in_app_update](https://pub.dev/packages/in_app_update) | Enables In App Updates on Android using the official Android APIs.\n[restart_app](https://pub.dev/packages/restart_app) | A simple package that helps you to restart the whole android app with a single function call.\n[flutter_lints](https://pub.dev/packages/flutter_lints) | This package contains a recommended set of lints for Flutter apps, packages, and plugins to encourage good coding practices.\n[receive_sharing_intent](https://pub.dev/packages/receive_sharing_intent) | A flutter plugin that enables flutter apps to receive sharing photos, videos, text, urls or any other file types from another app.\n\n\n\n### Directory Structure 🏢\n\nThe [lib](lib) directory structure is as follows:\n\n```\n├── application\n|    ├── crypto\n|    |    ├── crypto_bloc.dart\n|    |    ├── crypto_event.dart\n|    |    ├── crypto_state.dart\n|    |── save\n|    |    ├── save_bloc.dart\n|    |    ├── save_event.dart\n|    |    ├── save_state.dart\n├── core\n|    |── enums.dart\n|    |── extension.dart\n|    |── navigation_service.dart\n|    |── usecase.dart\n├── domain\n|    |── entity\n|    |    ├── file_count.dart\n|    |── failure\n|    |    ├── crypto_failure.dart\n|    |    ├── save_failure.dart\n|    |── repoitory\n|    |    ├── i_crypto_repo.dart\n|    |    ├── i_save_repo.dart\n|    |── usecase\n|    |    ├── decrypt_file.dart\n|    |    ├── encrypt_file.dart\n|    |    ├── get_file_count.dart\n|    |    ├── increment_file_count.dart\n|    |    ├── save_file.dart\n|    |    ├── share_file.dart\n├── infrastructure\n|    |── core\n|    |    ├── firebase_helper.dart    \n|    |    ├── injection_module.dart    \n|    |    ├── permission_handler.dart    \n|    |── data\n|    |    ├── crypto_data_source.dart\n|    |    ├── save_data_source.dart\n|    |── exception\n|    |    ├── crypto_exception.dart\n|    |    ├── save_exception.dart\n|    |── model\n|    |    ├── file_count_model.dart\n|    |── repository\n|    |    ├── crypto_repo.dart\n|    |    ├── save_repo.dart\n├── presentation\n|    |── core\n|    |    ├── palette.dart\n|    |── pages\n|    |    ├── home_page.dart\n|    |    ├── result_page.dart\n|    |    ├── splash_page.dart\n|    |── widgets\n|    |    ├── add_file_widget.dart\n|    |    ├── app_version_widget.dart\n|    |    ├── app_widget.dart\n|    |    ├── count_animated_widget.dart\n|    |    ├── key_widget.dart\n|    |    ├── moon_animated_widget.dart\n|    |    ├── permission_dialog.dart\n|    |    ├── title_animated_widget.dart\n|    |    ├── usecase_button.dart\n├── injection.dart\n├── main.dart\n\n```\n\n#### In App Purchase v3.0.5 \n\n```dart\nimport 'dart:async';\n\nimport 'package:flutter/material.dart';\nimport 'package:flutter_bloc/flutter_bloc.dart';\nimport 'package:flutter_encrypto/application/ad/ad_bloc.dart';\nimport 'package:flutter_encrypto/core/navigation_service.dart';\nimport 'package:in_app_purchase/in_app_purchase.dart';\n\nconst String kRemoveAds = \"remove_ads\";\n\nclass PurchaseProvider with ChangeNotifier {\n  bool _isAvailable = false;\n  final InAppPurchase _iap = InAppPurchase.instance;\n  List\u003cProductDetails\u003e _products = [];\n  List\u003cPurchaseDetails\u003e _purchases = [];\n  late StreamSubscription _subscription;\n  InAppPurchase get iap =\u003e _iap;\n  bool get isAvailable =\u003e _isAvailable;\n\n  Future\u003cvoid\u003e initialize() async {\n    _isAvailable = await _iap.isAvailable();\n    _subscription = _iap.purchaseStream.listen(_listener);\n    _getProducts();\n    _getPastPurchases();\n  }\n\n  void _listener(List\u003cPurchaseDetails\u003e purchaseDetails) {\n    if (purchaseDetails.isEmpty) {\n      return;\n    }\n\n    _verifyPurchase(purchaseDetails[0]);\n    _purchases.addAll(purchaseDetails);\n    notifyListeners();\n  }\n\n  Future\u003cvoid\u003e _verifyPurchase(PurchaseDetails purchaseDetail) async {\n    final bool isRemoveAdsPurchase = purchaseDetail.productID == kRemoveAds;\n\n    if (!isRemoveAdsPurchase) {\n      return;\n    }\n\n    final bool isPurchasePending = purchaseDetail.pendingCompletePurchase;\n\n    if (isPurchasePending) {\n      await _iap.completePurchase(purchaseDetail);\n    }\n\n    final bool isPurchaseSuccess =\n        purchaseDetail.status == PurchaseStatus.purchased ||\n            purchaseDetail.status == PurchaseStatus.restored;\n\n    if (!isPurchaseSuccess) {\n      return;\n    }\n\n    // Remove ads\n    BlocProvider.of\u003cAdBloc\u003e(globalContext, listen: false)\n        .add(AdEvent.removeAds());\n  }\n\n  void cancelSubscription() {\n    _subscription.cancel();\n  }\n\n  Future\u003cvoid\u003e _getPastPurchases() async {\n    await _iap.restorePurchases();\n  }\n\n  Future\u003cvoid\u003e _getProducts() async {\n    final ProductDetailsResponse response =\n        await _iap.queryProductDetails({kRemoveAds});\n\n    _products = response.productDetails;\n    notifyListeners();\n  }\n\n  Future\u003cvoid\u003e buyRemoveAds() async {\n    final PurchaseParam _removeAdParam =\n        PurchaseParam(productDetails: _products[0]);\n    await _iap.buyNonConsumable(purchaseParam: _removeAdParam);\n  }\n}\n```\n#### In App Update v3.0.0\n\n```dart\n  Future\u003cvoid\u003e _checkForUpdate() async {\n    final AppUpdateInfo info = await InAppUpdate.checkForUpdate();\n    final bool isUpdateAvailable =\n        info.updateAvailability == UpdateAvailability.updateAvailable;\n    if (isUpdateAvailable) {\n      final result = await InAppUpdate.performImmediateUpdate();\n      if (result == AppUpdateResult.userDeniedUpdate ||\n          result == AppUpdateResult.inAppUpdateFailed) {\n        // close the app\n        SystemNavigator.pop();\n      }\n\n      if (result == AppUpdateResult.success) {\n        Restart.restartApp();\n      }\n    }\n  }\n\n```\n\n#### Google Mobile Ads v1.2.0\n\nInside main.dart\n```dart\n\nvoid main() async {\n  WidgetsFlutterBinding.ensureInitialized();\n  // Include\n  MobileAds.instance.initialize();\n  // runApp(const MyApp());\n}\n```\nDeclare ```bannerAd```, ```isBannerAdLoaded```, ```interstitialAd``` in the state\n```dart\n  late BannerAd bannerAd;\n  bool isBannerAdLoaded = false;\n  InterstitialAd? interstitialAd;\n```\n```dart\n  @override\n  void initState() {\n    _createInterstitialAd();\n    _createBannerAd();\n    super.initState();\n  }\n\n  @override\n  void dispose() {\n    bannerAd.dispose();\n    interstitialAd?.dispose();\n    super.dispose();\n  }\n```\nInterstitial Ad setup\n\n```dart\n  Future\u003cvoid\u003e _createInterstitialAd({int counter=0}) async {\n    if (counter \u003e 3) return;\n    await InterstitialAd.load(\n      adUnitId: \"ca-app-pub-3940256099942544/8691691433\",\n      request: const AdRequest(),\n      adLoadCallback: InterstitialAdLoadCallback(\n        onAdLoaded: (ad) {\n          interstitialAd = ad;\n          setState(() {});\n        },\n        onAdFailedToLoad: (ad) {\n          interstitialAd = null;\n          _createInterstitialAd( counter: counter + 1);\n          setState(() {});\n        },\n      ),\n    );\n  }\n\n    Future\u003cvoid\u003e _showInterstitialAd() async {\n    if (interstitialAd == null) return;\n    interstitialAd!.fullScreenContentCallback = FullScreenContentCallback(\n      onAdDismissedFullScreenContent: (ad) {\n        ad.dispose();\n        _createInterstitialAd();\n      },\n      onAdFailedToShowFullScreenContent: (ad, _) {\n        ad.dispose();\n        _createInterstitialAd();\n      },\n    );\n    await interstitialAd!.show();\n  }\n```\n\nBanner Ad setup\n\n```dart\nFuture\u003cvoid\u003e _createBannerAd() async {\n    bannerAd = BannerAd(\n      size: AdSize.banner,\n      adUnitId: \"ca-app-pub-3940256099942544/6300978111\",\n      listener: BannerAdListener(\n        onAdLoaded: (_) {\n          setState(() {\n            isBannerAdLoaded = true;\n          });\n        },\n        onAdFailedToLoad: (ad, _) {\n          ad.dispose();\n        },\n      ),\n      request: const AdRequest(),\n    );\n\n    await bannerAd.load();\n  }\n```","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fshadow60539%2Fencrypto_app","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fshadow60539%2Fencrypto_app","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fshadow60539%2Fencrypto_app/lists"}