├── android ├── settings_aar.gradle ├── gradle.properties ├── app │ ├── src │ │ ├── main │ │ │ ├── res │ │ │ │ ├── mipmap-hdpi │ │ │ │ │ └── ic_launcher.png │ │ │ │ ├── mipmap-mdpi │ │ │ │ │ └── ic_launcher.png │ │ │ │ ├── mipmap-xhdpi │ │ │ │ │ └── ic_launcher.png │ │ │ │ ├── mipmap-xxhdpi │ │ │ │ │ └── ic_launcher.png │ │ │ │ ├── mipmap-xxxhdpi │ │ │ │ │ └── ic_launcher.png │ │ │ │ ├── values │ │ │ │ │ └── styles.xml │ │ │ │ ├── drawable │ │ │ │ │ └── launch_background.xml │ │ │ │ ├── drawable-v21 │ │ │ │ │ └── launch_background.xml │ │ │ │ └── values-night │ │ │ │ │ └── styles.xml │ │ │ ├── java │ │ │ │ └── com │ │ │ │ │ └── lucao │ │ │ │ │ └── limpazap │ │ │ │ │ └── MainActivity.java │ │ │ └── AndroidManifest.xml │ │ ├── debug │ │ │ └── AndroidManifest.xml │ │ └── profile │ │ │ └── AndroidManifest.xml │ └── build.gradle.kts ├── gradle │ └── wrapper │ │ └── gradle-wrapper.properties ├── .gitignore ├── build.gradle.kts └── settings.gradle.kts ├── fastlane └── metadata │ └── android │ ├── pt │ ├── title.txt │ ├── short_description.txt │ ├── video.txt │ ├── images │ │ ├── icon.png │ │ ├── featureGraphic.png │ │ └── phoneScreenshots │ │ │ ├── 1.jpg │ │ │ ├── 2.jpg │ │ │ ├── 3.jpg │ │ │ ├── 4.jpg │ │ │ ├── 5.jpg │ │ │ └── 6.jpg │ └── full_description.txt │ └── en-US │ ├── title.txt │ ├── short_description.txt │ ├── video.txt │ ├── images │ ├── icon.png │ ├── featureGraphic.png │ └── phoneScreenshots │ │ ├── 1.jpg │ │ ├── 2.jpg │ │ ├── 3.jpg │ │ ├── 4.jpg │ │ ├── 5.jpg │ │ └── 6.jpg │ └── full_description.txt ├── demo.webm ├── media ├── logo.png ├── icone-azul.png ├── icone-verde.png ├── icone-azul.svg ├── icone-verde.svg └── logo.svg ├── renovate.json ├── privacidade.md ├── create_backup ├── lib ├── view │ ├── SemArquivosWidget.dart │ ├── ArquivosWidget.dart │ ├── ArquivoWidget.dart │ └── ArquivosView.dart ├── model │ └── ArquivoDeletavelModel.dart ├── main.dart └── controller │ └── ArquivoDeletavelController.dart ├── mise.toml ├── .devcontainer ├── devcontainer.json └── Dockerfile ├── LICENSE ├── README.md ├── .github └── workflows │ └── release.yml ├── analysis_options.yaml ├── .gitignore ├── .metadata ├── shell.nix ├── pubspec.yaml └── pubspec.lock /android/settings_aar.gradle: -------------------------------------------------------------------------------- 1 | include ':app' 2 | -------------------------------------------------------------------------------- /fastlane/metadata/android/pt/title.txt: -------------------------------------------------------------------------------- 1 | Limpazap 2 | -------------------------------------------------------------------------------- /fastlane/metadata/android/en-US/title.txt: -------------------------------------------------------------------------------- 1 | Limpazap 2 | -------------------------------------------------------------------------------- /demo.webm: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lucasew/limpazap/HEAD/demo.webm -------------------------------------------------------------------------------- /media/logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lucasew/limpazap/HEAD/media/logo.png -------------------------------------------------------------------------------- /fastlane/metadata/android/en-US/short_description.txt: -------------------------------------------------------------------------------- 1 | Clean old WhatsApp backups 2 | 3 | -------------------------------------------------------------------------------- /fastlane/metadata/android/pt/short_description.txt: -------------------------------------------------------------------------------- 1 | Limpa backups antigos do WhatsApp 2 | -------------------------------------------------------------------------------- /media/icone-azul.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lucasew/limpazap/HEAD/media/icone-azul.png -------------------------------------------------------------------------------- /media/icone-verde.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lucasew/limpazap/HEAD/media/icone-verde.png -------------------------------------------------------------------------------- /fastlane/metadata/android/en-US/video.txt: -------------------------------------------------------------------------------- 1 | https://raw.githubusercontent.com/lucasew/limpazap/master/demo.webp 2 | -------------------------------------------------------------------------------- /fastlane/metadata/android/pt/video.txt: -------------------------------------------------------------------------------- 1 | https://raw.githubusercontent.com/lucasew/limpazap/master/demo.webp 2 | -------------------------------------------------------------------------------- /fastlane/metadata/android/pt/images/icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lucasew/limpazap/HEAD/fastlane/metadata/android/pt/images/icon.png -------------------------------------------------------------------------------- /android/gradle.properties: -------------------------------------------------------------------------------- 1 | org.gradle.jvmargs=-Xmx1536M 2 | android.useAndroidX=true 3 | android.enableJetifier=true 4 | android.enableR8=true 5 | -------------------------------------------------------------------------------- /fastlane/metadata/android/en-US/images/icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lucasew/limpazap/HEAD/fastlane/metadata/android/en-US/images/icon.png -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-hdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lucasew/limpazap/HEAD/android/app/src/main/res/mipmap-hdpi/ic_launcher.png -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-mdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lucasew/limpazap/HEAD/android/app/src/main/res/mipmap-mdpi/ic_launcher.png -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-xhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lucasew/limpazap/HEAD/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lucasew/limpazap/HEAD/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lucasew/limpazap/HEAD/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png -------------------------------------------------------------------------------- /fastlane/metadata/android/pt/images/featureGraphic.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lucasew/limpazap/HEAD/fastlane/metadata/android/pt/images/featureGraphic.png -------------------------------------------------------------------------------- /fastlane/metadata/android/en-US/images/featureGraphic.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lucasew/limpazap/HEAD/fastlane/metadata/android/en-US/images/featureGraphic.png -------------------------------------------------------------------------------- /fastlane/metadata/android/pt/images/phoneScreenshots/1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lucasew/limpazap/HEAD/fastlane/metadata/android/pt/images/phoneScreenshots/1.jpg -------------------------------------------------------------------------------- /fastlane/metadata/android/pt/images/phoneScreenshots/2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lucasew/limpazap/HEAD/fastlane/metadata/android/pt/images/phoneScreenshots/2.jpg -------------------------------------------------------------------------------- /fastlane/metadata/android/pt/images/phoneScreenshots/3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lucasew/limpazap/HEAD/fastlane/metadata/android/pt/images/phoneScreenshots/3.jpg -------------------------------------------------------------------------------- /fastlane/metadata/android/pt/images/phoneScreenshots/4.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lucasew/limpazap/HEAD/fastlane/metadata/android/pt/images/phoneScreenshots/4.jpg -------------------------------------------------------------------------------- /fastlane/metadata/android/pt/images/phoneScreenshots/5.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lucasew/limpazap/HEAD/fastlane/metadata/android/pt/images/phoneScreenshots/5.jpg -------------------------------------------------------------------------------- /fastlane/metadata/android/pt/images/phoneScreenshots/6.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lucasew/limpazap/HEAD/fastlane/metadata/android/pt/images/phoneScreenshots/6.jpg -------------------------------------------------------------------------------- /fastlane/metadata/android/en-US/images/phoneScreenshots/1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lucasew/limpazap/HEAD/fastlane/metadata/android/en-US/images/phoneScreenshots/1.jpg -------------------------------------------------------------------------------- /fastlane/metadata/android/en-US/images/phoneScreenshots/2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lucasew/limpazap/HEAD/fastlane/metadata/android/en-US/images/phoneScreenshots/2.jpg -------------------------------------------------------------------------------- /fastlane/metadata/android/en-US/images/phoneScreenshots/3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lucasew/limpazap/HEAD/fastlane/metadata/android/en-US/images/phoneScreenshots/3.jpg -------------------------------------------------------------------------------- /fastlane/metadata/android/en-US/images/phoneScreenshots/4.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lucasew/limpazap/HEAD/fastlane/metadata/android/en-US/images/phoneScreenshots/4.jpg -------------------------------------------------------------------------------- /fastlane/metadata/android/en-US/images/phoneScreenshots/5.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lucasew/limpazap/HEAD/fastlane/metadata/android/en-US/images/phoneScreenshots/5.jpg -------------------------------------------------------------------------------- /fastlane/metadata/android/en-US/images/phoneScreenshots/6.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lucasew/limpazap/HEAD/fastlane/metadata/android/en-US/images/phoneScreenshots/6.jpg -------------------------------------------------------------------------------- /renovate.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "https://docs.renovatebot.com/renovate-schema.json", 3 | "extends": [ 4 | "github>lewtec/renovate-config:base", 5 | "config:recommended" 6 | ] 7 | } 8 | -------------------------------------------------------------------------------- /android/app/src/main/java/com/lucao/limpazap/MainActivity.java: -------------------------------------------------------------------------------- 1 | package com.lucao.limpazap; 2 | 3 | import io.flutter.embedding.android.FlutterActivity; 4 | 5 | public class MainActivity extends FlutterActivity { 6 | } 7 | -------------------------------------------------------------------------------- /privacidade.md: -------------------------------------------------------------------------------- 1 | :us: 2 | 3 | - Nothing is collected by the app 4 | - All processing happens locally 5 | 6 | :brazil: 7 | 8 | - Nada é coletado pelo aplicativo 9 | - Todo o processamento acontece localmente 10 | -------------------------------------------------------------------------------- /create_backup: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | set -euf -o pipefail 3 | 4 | MB=$1;shift 5 | adb shell mkdir -p /sdcard/WhatsApp/Databases 6 | adb shell dd if=/dev/zero of=/sdcard/WhatsApp/Databases/msgstore-$RANDOM-$RANDOM-$RANDOM.1.db.crypt12 bs=1m count=$MB 7 | -------------------------------------------------------------------------------- /android/gradle/wrapper/gradle-wrapper.properties: -------------------------------------------------------------------------------- 1 | #Fri Jun 23 08:50:38 CEST 2017 2 | distributionBase=GRADLE_USER_HOME 3 | distributionPath=wrapper/dists 4 | zipStoreBase=GRADLE_USER_HOME 5 | zipStorePath=wrapper/dists 6 | distributionUrl=https\://services.gradle.org/distributions/gradle-9.1.0-all.zip 7 | -------------------------------------------------------------------------------- /lib/view/SemArquivosWidget.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/material.dart'; 2 | 3 | class SemArquivosWidget extends StatelessWidget { 4 | Widget build(BuildContext ctx) { 5 | return Center( 6 | child: Icon(Icons.done_sharp, size: 250, color: Colors.green) 7 | ); 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /mise.toml: -------------------------------------------------------------------------------- 1 | [tools] 2 | android-sdk = "19.0" 3 | flutter = "3.35.7-stable" 4 | java = "22.0.0" 5 | usage = "latest" 6 | yq = "latest" 7 | 8 | [tasks.setup-androidsdk] 9 | run = "yes | sdkmanager \"platforms;android-29\" \"build-tools;29.0.3\" \"platform-tools\" && yes | flutter doctor --android-licenses" 10 | -------------------------------------------------------------------------------- /android/.gitignore: -------------------------------------------------------------------------------- 1 | gradle-wrapper.jar 2 | /.gradle 3 | /captures/ 4 | /gradlew 5 | /gradlew.bat 6 | /local.properties 7 | GeneratedPluginRegistrant.java 8 | .cxx/ 9 | 10 | # Remember to never publicly share your keystore. 11 | # See https://flutter.dev/to/reference-keystore 12 | key.properties 13 | **/*.keystore 14 | **/*.jks 15 | -------------------------------------------------------------------------------- /lib/model/ArquivoDeletavelModel.dart: -------------------------------------------------------------------------------- 1 | import 'dart:io'; 2 | 3 | class ArquivoDeletavel { 4 | final FileSystemEntity arquivo; 5 | late DateTime dataCriacao; 6 | late int tamanho; 7 | late bool isUltimo; 8 | ArquivoDeletavel(this.arquivo, {this.isUltimo = false}) { 9 | var stat = this.arquivo.statSync(); 10 | this.dataCriacao = stat.modified; 11 | this.tamanho = stat.size; 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /android/app/src/main/res/values/styles.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 8 | 9 | -------------------------------------------------------------------------------- /android/app/src/debug/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 3 | 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /android/app/src/profile/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 3 | 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /fastlane/metadata/android/en-US/full_description.txt: -------------------------------------------------------------------------------- 1 | For those who don't know, WhatsApp needs to backup the conversations because it doesn't work based on cloud, like Telegram or Messenger, but instead of just keeping the last one. It keeps the last one and up to 7 backups prior to it. Why? I don't know. When I run out of space the first thing I do is delete these old backups and that's what this application is for. 2 | 3 | The big letters were a feedback received by potential users who no longer have such a good view. 4 | 5 | -------------------------------------------------------------------------------- /fastlane/metadata/android/pt/full_description.txt: -------------------------------------------------------------------------------- 1 | Para quem não sabe, o WhatsApp necessita fazer backup das conversas por que não trabalha baseado em núvem, como o Telegram ou o Messenger, porém, ao invés de só manter o último ele mantém o ultimo e até 7 backups anteriores a este. Por que? Eu não sei. Quando eu fico sem espaço a primeira coisa que eu faço é apagar esses backups antigos e é para isso que esse aplicativo serve. 2 | 3 | As letras grandes foram um feedback recebido por potenciais usuários que já não tem uma visão tão boa. 4 | -------------------------------------------------------------------------------- /android/app/src/main/res/drawable/launch_background.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 12 | 13 | -------------------------------------------------------------------------------- /android/app/src/main/res/drawable-v21/launch_background.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 12 | 13 | -------------------------------------------------------------------------------- /lib/view/ArquivosWidget.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/material.dart'; 2 | import '../model/ArquivoDeletavelModel.dart'; 3 | import './ArquivoWidget.dart'; 4 | import 'dart:async'; 5 | 6 | class ArquivosWidget extends StatelessWidget { 7 | late List arquivos; 8 | late List widgets; 9 | late StreamController chan; 10 | ArquivosWidget(this.arquivos, this.chan) { 11 | this.widgets = arquivos.map((a) => ArquivoWidget(a, chan)).toList(); 12 | } 13 | Widget build(BuildContext ctx) { 14 | return ListView(children: widgets); 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /.devcontainer/devcontainer.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "flutter_docker", 3 | "context": "..", 4 | "dockerFile": "Dockerfile", 5 | "remoteUser": "developer", 6 | "mounts": [ 7 | "source=/dev/bus/usb,target=/dev/bus/usb,type=bind" 8 | ], 9 | "settings": { 10 | "terminal.integrated.shell.linux": null 11 | }, 12 | "runArgs": ["--privileged"], 13 | "extensions": ["dart-code.flutter"], 14 | "workspaceMount": "source=${localWorkspaceFolder},target=/home/developer/workspace,type=bind,consistency=delegated", 15 | "workspaceFolder": "/home/developer/workspace" 16 | } -------------------------------------------------------------------------------- /android/build.gradle.kts: -------------------------------------------------------------------------------- 1 | allprojects { 2 | repositories { 3 | google() 4 | mavenCentral() 5 | } 6 | } 7 | 8 | val newBuildDir: Directory = rootProject.layout.buildDirectory.dir("../../build").get() 9 | rootProject.layout.buildDirectory.value(newBuildDir) 10 | 11 | subprojects { 12 | val newSubprojectBuildDir: Directory = newBuildDir.dir(project.name) 13 | project.layout.buildDirectory.value(newSubprojectBuildDir) 14 | } 15 | subprojects { 16 | project.evaluationDependsOn(":app") 17 | } 18 | 19 | tasks.register("clean") { 20 | delete(rootProject.layout.buildDirectory) 21 | } 22 | -------------------------------------------------------------------------------- /android/settings.gradle.kts: -------------------------------------------------------------------------------- 1 | pluginManagement { 2 | val flutterSdkPath = run { 3 | val properties = java.util.Properties() 4 | file("local.properties").inputStream().use { properties.load(it) } 5 | val flutterSdkPath = properties.getProperty("flutter.sdk") 6 | require(flutterSdkPath != null) { "flutter.sdk not set in local.properties" } 7 | flutterSdkPath 8 | } 9 | 10 | includeBuild("$flutterSdkPath/packages/flutter_tools/gradle") 11 | 12 | repositories { 13 | google() 14 | mavenCentral() 15 | gradlePluginPortal() 16 | } 17 | } 18 | 19 | plugins { 20 | id("dev.flutter.flutter-plugin-loader") version "1.0.0" 21 | id("com.android.application") version "8.11.1" apply false 22 | id("org.jetbrains.kotlin.android") version "2.2.21" apply false 23 | } 24 | 25 | include(":app") 26 | -------------------------------------------------------------------------------- /lib/main.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/material.dart'; 2 | import 'view/ArquivosView.dart'; 3 | 4 | import 'package:wakelock_plus/wakelock_plus.dart'; 5 | import 'package:flutter/foundation.dart'; 6 | import 'package:permission_handler/permission_handler.dart'; 7 | 8 | Future checarPermissao() async { 9 | while (true) { 10 | if (!await Permission.manageExternalStorage.status.isGranted) { 11 | Permission.manageExternalStorage.request(); 12 | } 13 | if (await Permission.storage.status.isGranted) { 14 | return; 15 | } else if (await Permission.storage.isPermanentlyDenied) { 16 | await openAppSettings(); 17 | } else { 18 | print(await Permission.storage.request()); 19 | } 20 | } 21 | } 22 | 23 | void main() async { 24 | WidgetsFlutterBinding.ensureInitialized(); 25 | if (!kReleaseMode) { 26 | await WakelockPlus.enable(); 27 | } 28 | checarPermissao(); 29 | runApp( 30 | MaterialApp(home: ArquivosView()) 31 | ); 32 | } 33 | 34 | -------------------------------------------------------------------------------- /android/app/src/main/res/values-night/styles.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 9 | 15 | 18 | 19 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2021 Lucas Eduardo Wendt 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /.devcontainer/Dockerfile: -------------------------------------------------------------------------------- 1 | FROM ubuntu:24.04@sha256:c35e29c9450151419d9448b0fd75374fec4fff364a27f176fb458d472dfc9e54 2 | 3 | # Prerequisites 4 | RUN apt update && apt install -y curl git unzip xz-utils zip libglu1-mesa openjdk-8-jdk wget 5 | 6 | # Set up new user 7 | RUN useradd -ms /bin/bash developer 8 | USER developer 9 | WORKDIR /home/developer 10 | 11 | # Prepare Android directories and system variables 12 | RUN mkdir -p Android/sdk 13 | ENV ANDROID_SDK_ROOT /home/developer/Android/sdk 14 | RUN mkdir -p .android && touch .android/repositories.cfg 15 | 16 | # Set up Android SDK 17 | RUN wget -O sdk-tools.zip https://dl.google.com/android/repository/sdk-tools-linux-4333796.zip 18 | RUN unzip sdk-tools.zip && rm sdk-tools.zip 19 | RUN mv tools Android/sdk/tools 20 | RUN cd Android/sdk/tools/bin && yes | ./sdkmanager --licenses 21 | RUN cd Android/sdk/tools/bin && ./sdkmanager "build-tools;29.0.2" "patcher;v4" "platform-tools" "platforms;android-29" "sources;android-29" 22 | ENV PATH "$PATH:/home/developer/Android/sdk/platform-tools" 23 | 24 | # Download Flutter SDK 25 | RUN git clone https://github.com/flutter/flutter.git 26 | ENV PATH "$PATH:/home/developer/flutter/bin" 27 | 28 | # Run basic check to download Dark SDK 29 | RUN flutter doctor -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 |
2 | 3 |
4 | 5 |

6 | ultima tentativa de compilação 7 | ultima versão 8 | downloads ultima versão 9 |

10 | 11 | Para quem não sabe, o WhatsApp necessita fazer backup das conversas por que não trabalha baseado em núvem, como o Telegram ou o Messenger, porém, ao invés de só manter o último ele mantém o ultimo e até 7 backups anteriores a este. Por que? Eu não sei. Quando eu fico sem espaço a primeira coisa que eu faço é apagar esses backups antigos e é para isso que esse aplicativo serve. 12 | 13 | As letras grandes foram um feedback recebido por potenciais usuários que já não tem uma visão tão boa. 14 | 15 | ![Demonstração do APP](demo.webm) 16 | 17 | [Get it on F-Droid](https://f-droid.org/packages/com.lucao.limpazap/) 20 | 21 | # TODO 22 | - [ ] [Mandar para a PlayStore](https://github.com/lucasew/limpazap/issues/41) 23 | -------------------------------------------------------------------------------- /.github/workflows/release.yml: -------------------------------------------------------------------------------- 1 | # This is a basic workflow to help you get started with Actions 2 | 3 | name: release 4 | on: push 5 | jobs: 6 | build: 7 | name: Build APK 8 | runs-on: ubuntu-latest 9 | steps: 10 | - uses: actions/checkout@93cb6efe18208431cddfb8368fd83d5badbf9bfd # v5.0.1 11 | - name: Setup environment 12 | uses: jdx/mise-action@146a28175021df8ca24f8ee1828cc2a60f980bd5 # v3 13 | 14 | - name: Setup the Android SDK part that sucks 15 | run: mise run setup-androidsdk 16 | 17 | - name: Extract branch name 18 | shell: bash 19 | run: echo "##[set-output name=branch;]$(echo ${GITHUB_REF#refs/heads/})" 20 | id: extract_branch 21 | 22 | - run: flutter pub get 23 | - run: flutter pub run flutter_launcher_icons:main 24 | # - run: flutter test 25 | - run: flutter build apk --release 26 | - run: flutter build appbundle --release 27 | 28 | - name: Create a Release APK 29 | uses: ncipollo/release-action@b7eabc95ff50cbeeedec83973935c8f306dfcd0b # v1 30 | with: 31 | artifacts: "build/app/outputs/bundle/release/app-release.aab,build/app/outputs/flutter-apk/app-release.apk" 32 | name: Compilação automática ${{ github.sha }} para branch ${{ steps.extract_branch.outputs.branch }} 33 | token: ${{ secrets.GITHUB_TOKEN }} 34 | commit: ${{ steps.extract_branch.outputs.branch }} 35 | tag: commit-${{ github.sha }} 36 | draft: true 37 | prerelease: true 38 | -------------------------------------------------------------------------------- /analysis_options.yaml: -------------------------------------------------------------------------------- 1 | # This file configures the analyzer, which statically analyzes Dart code to 2 | # check for errors, warnings, and lints. 3 | # 4 | # The issues identified by the analyzer are surfaced in the UI of Dart-enabled 5 | # IDEs (https://dart.dev/tools#ides-and-editors). The analyzer can also be 6 | # invoked from the command line by running `flutter analyze`. 7 | 8 | # The following line activates a set of recommended lints for Flutter apps, 9 | # packages, and plugins designed to encourage good coding practices. 10 | include: package:flutter_lints/flutter.yaml 11 | 12 | linter: 13 | # The lint rules applied to this project can be customized in the 14 | # section below to disable rules from the `package:flutter_lints/flutter.yaml` 15 | # included above or to enable additional rules. A list of all available lints 16 | # and their documentation is published at https://dart.dev/lints. 17 | # 18 | # Instead of disabling a lint rule for the entire project in the 19 | # section below, it can also be suppressed for a single line of code 20 | # or a specific dart file by using the `// ignore: name_of_lint` and 21 | # `// ignore_for_file: name_of_lint` syntax on the line or in the file 22 | # producing the lint. 23 | rules: 24 | # avoid_print: false # Uncomment to disable the `avoid_print` rule 25 | # prefer_single_quotes: true # Uncomment to enable the `prefer_single_quotes` rule 26 | 27 | # Additional information about this file can be found at 28 | # https://dart.dev/guides/language/analysis-options 29 | -------------------------------------------------------------------------------- /media/icone-azul.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /media/icone-verde.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /android/app/build.gradle.kts: -------------------------------------------------------------------------------- 1 | plugins { 2 | id("com.android.application") 3 | id("kotlin-android") 4 | // The Flutter Gradle Plugin must be applied after the Android and Kotlin Gradle plugins. 5 | id("dev.flutter.flutter-gradle-plugin") 6 | } 7 | 8 | android { 9 | namespace = "com.lucao.limpazap" 10 | compileSdk = flutter.compileSdkVersion 11 | // ndkVersion = flutter.ndkVersion 12 | ndkVersion = "27.0.12077973" 13 | 14 | compileOptions { 15 | sourceCompatibility = JavaVersion.VERSION_11 16 | targetCompatibility = JavaVersion.VERSION_11 17 | } 18 | 19 | kotlinOptions { 20 | jvmTarget = JavaVersion.VERSION_11.toString() 21 | } 22 | 23 | defaultConfig { 24 | // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). 25 | applicationId = "com.lucao.limpazap" 26 | // You can update the following values to match your application needs. 27 | // For more information, see: https://flutter.dev/to/review-gradle-config. 28 | minSdk = flutter.minSdkVersion 29 | targetSdk = flutter.targetSdkVersion 30 | versionCode = flutter.versionCode 31 | versionName = flutter.versionName 32 | } 33 | 34 | buildTypes { 35 | release { 36 | // TODO: Add your own signing config for the release build. 37 | // Signing with the debug keys for now, so `flutter run --release` works. 38 | signingConfig = signingConfigs.getByName("debug") 39 | } 40 | } 41 | } 42 | 43 | flutter { 44 | source = "../.." 45 | } 46 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # custom 2 | .flutter-plugins-dependencies 3 | 4 | # Miscellaneous 5 | *.class 6 | # *.lock 7 | *.log 8 | *.pyc 9 | *.swp 10 | .DS_Store 11 | .atom/ 12 | .buildlog/ 13 | .history 14 | .svn/ 15 | 16 | # IntelliJ related 17 | *.iml 18 | *.ipr 19 | *.iws 20 | .idea/ 21 | 22 | # Visual Studio Code related 23 | .vscode/ 24 | 25 | # Flutter/Dart/Pub related 26 | **/doc/api/ 27 | .dart_tool/ 28 | .flutter-plugins 29 | .packages 30 | .pub-cache/ 31 | .pub/ 32 | build/ 33 | 34 | # Android related 35 | **/android/**/gradle-wrapper.jar 36 | **/android/.gradle 37 | **/android/captures/ 38 | **/android/gradlew 39 | **/android/gradlew.bat 40 | **/android/local.properties 41 | **/android/**/GeneratedPluginRegistrant.java 42 | 43 | # iOS/XCode related 44 | **/ios/**/*.mode1v3 45 | **/ios/**/*.mode2v3 46 | **/ios/**/*.moved-aside 47 | **/ios/**/*.pbxuser 48 | **/ios/**/*.perspectivev3 49 | **/ios/**/*sync/ 50 | **/ios/**/.sconsign.dblite 51 | **/ios/**/.tags* 52 | **/ios/**/.vagrant/ 53 | **/ios/**/DerivedData/ 54 | **/ios/**/Icon? 55 | **/ios/**/Pods/ 56 | **/ios/**/.symlinks/ 57 | **/ios/**/profile 58 | **/ios/**/xcuserdata 59 | **/ios/.generated/ 60 | **/ios/Flutter/App.framework 61 | **/ios/Flutter/Flutter.framework 62 | **/ios/Flutter/Generated.xcconfig 63 | **/ios/Flutter/app.flx 64 | **/ios/Flutter/app.zip 65 | **/ios/Flutter/flutter_assets/ 66 | **/ios/ServiceDefinitions.json 67 | **/ios/Runner/GeneratedPluginRegistrant.* 68 | 69 | # Exceptions to above rules. 70 | !**/ios/**/default.mode1v3 71 | !**/ios/**/default.mode2v3 72 | !**/ios/**/default.pbxuser 73 | !**/ios/**/default.perspectivev3 74 | !/packages/flutter_tools/test/data/dart_dependencies_test/**/.packages 75 | -------------------------------------------------------------------------------- /lib/controller/ArquivoDeletavelController.dart: -------------------------------------------------------------------------------- 1 | import '../model/ArquivoDeletavelModel.dart'; 2 | import 'dart:io'; 3 | 4 | class ArquivoDeletavelController { 5 | final dbAntigo = 6 | RegExp("msgstore-"); // O nome dos backups antigos bate com esse aqui 7 | bool inverter; 8 | bool exibirUltimo; 9 | ArquivoDeletavelController({this.inverter = false, this.exibirUltimo = false}); 10 | static const pastas = [ 11 | "/sdcard/Android/media/com.whatsapp/WhatsApp/Databases", 12 | "/sdcard/Android/media/com.whatsapp.w4b/WhatsApp Business/Databases", 13 | "/sdcard/WhatsApp/Databases", 14 | "/sdcard/GBWhatsApp/Databases" 15 | ]; 16 | 17 | List get arquivos { 18 | var ret = pastas 19 | .map((p) => Directory(p)) // Transforma tudo em Directory 20 | .where((p) => p.existsSync()) // Filtra só os que existem 21 | .map((p) => p.listSync()) // Dá ls em todas as pastas 22 | .expand( 23 | (att) => att) // Teremos uma lista de listas, agora não mais hehe 24 | .map((arq) => ArquivoDeletavel(arq, 25 | isUltimo: !dbAntigo.hasMatch( 26 | arq.path))) // Gera model verificando se é backup antigo ou não 27 | .where((a) => 28 | this.exibirUltimo || 29 | dbAntigo.hasMatch( 30 | a.arquivo.path)) // Ignora o ultimo backup se especificado 31 | .toList(); // Expande o iterador 32 | ret.sort( 33 | (x, y) => x.dataCriacao.compareTo(y.dataCriacao)); // Ordena todo mundo 34 | return this.inverter 35 | ? ret.reversed.toList() 36 | : ret; // Inverte se especificado e retorna 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /.metadata: -------------------------------------------------------------------------------- 1 | # This file tracks properties of this Flutter project. 2 | # Used by Flutter tool to assess capabilities and perform upgrades etc. 3 | # 4 | # This file should be version controlled and should not be manually edited. 5 | 6 | version: 7 | revision: "nixpkgs000000000000000000000000000000000" 8 | channel: "stable" 9 | 10 | project_type: app 11 | 12 | # Tracks metadata for the flutter migrate command 13 | migration: 14 | platforms: 15 | - platform: root 16 | create_revision: nixpkgs000000000000000000000000000000000 17 | base_revision: nixpkgs000000000000000000000000000000000 18 | - platform: android 19 | create_revision: nixpkgs000000000000000000000000000000000 20 | base_revision: nixpkgs000000000000000000000000000000000 21 | - platform: ios 22 | create_revision: nixpkgs000000000000000000000000000000000 23 | base_revision: nixpkgs000000000000000000000000000000000 24 | - platform: linux 25 | create_revision: nixpkgs000000000000000000000000000000000 26 | base_revision: nixpkgs000000000000000000000000000000000 27 | - platform: macos 28 | create_revision: nixpkgs000000000000000000000000000000000 29 | base_revision: nixpkgs000000000000000000000000000000000 30 | - platform: web 31 | create_revision: nixpkgs000000000000000000000000000000000 32 | base_revision: nixpkgs000000000000000000000000000000000 33 | - platform: windows 34 | create_revision: nixpkgs000000000000000000000000000000000 35 | base_revision: nixpkgs000000000000000000000000000000000 36 | 37 | # User provided section 38 | 39 | # List of Local paths (relative to this file) that should be 40 | # ignored by the migrate tool. 41 | # 42 | # Files that are not part of the templates will be ignored by default. 43 | unmanaged_files: 44 | - 'lib/main.dart' 45 | - 'ios/Runner.xcodeproj/project.pbxproj' 46 | -------------------------------------------------------------------------------- /shell.nix: -------------------------------------------------------------------------------- 1 | let 2 | nixpkgs = builtins.fetchTarball { 3 | url = "https://github.com/NixOS/nixpkgs/archive/257cbbcd3ab7bd96f5d24d50adc807de7c82e06d.tar.gz"; 4 | sha256 = "sha256-hCsGe2nDz+SX4uO+lj0qPVcSGZdt52R9Yk5MOYs4djw="; 5 | }; 6 | in 7 | { pkgs ? import nixpkgs { 8 | config.android_sdk.accept_license = true; 9 | }}: 10 | 11 | let 12 | buildToolsVersion = "28.0.3"; 13 | android = pkgs.androidenv.composeAndroidPackages { 14 | platformVersions = [ "27" "28" "29" ]; 15 | abiVersions = ["armeabi-v7a" "arm64-v8a"]; 16 | buildToolsVersions = [buildToolsVersion]; 17 | useGoogleAPIs = true; 18 | }; 19 | jdk = pkgs.jdk8; 20 | JAVA_HOME = "${jdk.home}"; 21 | sdk = android.androidsdk.overrideAttrs (oldAttrs: { 22 | installPhase = oldAttrs.installPhase + '' 23 | mkdir -p "$out/libexec/android-sdk/licenses" 24 | function lic { 25 | echo -e "\n$2" >> "$out/libexec/android-sdk/licenses/$1" 26 | } 27 | lic android-googletv-license 601085b94cd77f0b54ff86406957099ebe79c4d6 28 | lic android-sdk-arm-dbt-license 859f317696f67ef3d7f30a50a5560e7834b43903 29 | lic android-sdk-license 8933bad161af4178b1185d1a37fbf41ea5269c55 30 | lic android-sdk-license 24333f8a63b6825ea9c5514f83c2829b004d1fee 31 | lic android-sdk-preview-license 84831b9409646a918e30573bab4c9c91346d8abd 32 | lic google-gdk-license 33b6a2b64607f11b759f320ef9dff4ae5c47d97a 33 | lic mips-android-sysimage-license e9acab5b5fbb560a72cfaecce8946896ff6aab9d 34 | ''; 35 | }); 36 | ANDROID_HOME = "${sdk}/libexec/android-sdk"; 37 | in 38 | pkgs.mkShell { 39 | shellHook = '' 40 | echo ${sdk} 41 | flutter packages get 42 | flutter packages run flutter_launcher_icons:main 43 | ''; 44 | buildInputs = with pkgs; [ 45 | sdk 46 | glibc 47 | flutter 48 | jre 49 | dart 50 | ]; 51 | # override the aapt2 that gradle uses with the nix-shipped version 52 | GRADLE_OPTS = "-Dorg.gradle.project.android.aapt2FromMavenOverride=${ANDROID_HOME}/build-tools/${buildToolsVersion}/aapt2"; 53 | inherit ANDROID_HOME; 54 | } 55 | -------------------------------------------------------------------------------- /android/app/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 3 | 4 | 5 | 6 | 11 | 14 | 22 | 26 | 29 | 30 | 31 | 32 | 33 | 34 | 37 | 38 | 39 | -------------------------------------------------------------------------------- /lib/view/ArquivoWidget.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/material.dart'; 2 | import '../model/ArquivoDeletavelModel.dart'; 3 | import 'dart:async'; 4 | 5 | class ArquivoWidget extends StatelessWidget { 6 | final ArquivoDeletavel arquivo; 7 | final StreamController chan; 8 | ArquivoWidget(this.arquivo, this.chan); 9 | 10 | Widget build(BuildContext ctx) { 11 | var d = arquivo.dataCriacao; 12 | var texto = 13 | "${d.day}.${d.month}.${d.year} ${d.hour}:${d.minute < 10 ? '0' : ''}${d.minute}"; 14 | var tamanho = "${(this.arquivo.tamanho / 1000000).round()} MB"; 15 | var elemento = ListTile( 16 | title: ConstrainedBox( 17 | constraints: BoxConstraints( 18 | maxHeight: 50 19 | ), 20 | child: FittedBox( 21 | alignment: Alignment.centerLeft, 22 | child: Row(children: [ 23 | Icon(arquivo.isUltimo ? Icons.warning : Icons.history, size: 36), 24 | Text( 25 | texto, 26 | style: TextStyle(fontSize: 36), // TextStyle 27 | ), // Text 28 | ]), // Row 29 | ) // FittedBox 30 | ), // ConstrainedBox 31 | subtitle: Row(children: [ 32 | Icon(Icons.sd_card, size: 36), 33 | Text( 34 | tamanho, 35 | style: TextStyle(fontSize: 28), // TextStyle 36 | ) // Text 37 | ], ) // Row 38 | ); // ListTile 39 | return Center( 40 | child: Dismissible( 41 | key: Key(this.arquivo.arquivo.path), 42 | child: Center(child: elemento), 43 | background: Container( 44 | alignment: Alignment.centerLeft, 45 | color: Colors.red, 46 | child: Icon(Icons.delete, size: 36), // Icon 47 | padding: EdgeInsets.symmetric(horizontal: 30) 48 | ), // Container 49 | secondaryBackground: Container( 50 | alignment: Alignment.centerRight, 51 | color: Colors.red, 52 | child: Icon(Icons.delete,size: 36), 53 | padding: EdgeInsets.symmetric(horizontal: 30) 54 | ), 55 | onDismissed: (_) { 56 | chan.add(this.arquivo); 57 | }) // Dismissible 58 | ); 59 | } 60 | } 61 | -------------------------------------------------------------------------------- /lib/view/ArquivosView.dart: -------------------------------------------------------------------------------- 1 | import 'dart:async'; 2 | import 'package:flutter/material.dart'; 3 | import '../model/ArquivoDeletavelModel.dart'; 4 | import '../controller/ArquivoDeletavelController.dart'; 5 | import './ArquivosWidget.dart'; 6 | import './SemArquivosWidget.dart'; 7 | 8 | class ArquivosView extends StatefulWidget { 9 | createState() => ArquivosViewState(); 10 | } 11 | 12 | 13 | class ArquivosViewState extends State { 14 | final chan = new StreamController(); // Esse cara recebe os eventos do que tenque apagar, dps ele atualiza os widgets 15 | List arquivos = []; 16 | bool inverter = false; 17 | bool exibirUltimo = false; 18 | 19 | ArquivosViewState() { 20 | listen(); 21 | this.arquivos = updateArquivos(); 22 | } 23 | 24 | List updateArquivos() { 25 | return ArquivoDeletavelController( 26 | inverter: this.inverter, exibirUltimo: this.exibirUltimo) 27 | .arquivos; 28 | } 29 | 30 | update() async { 31 | this.setState(() => this.arquivos = updateArquivos()); 32 | // this.setState(() => this.arquivos = []); 33 | } 34 | 35 | listen() async { 36 | chan.stream.listen((ad) { 37 | ad.arquivo.deleteSync(); 38 | update(); 39 | }); 40 | } 41 | 42 | Widget build(BuildContext ctx) { 43 | return Scaffold( 44 | appBar: AppBar( 45 | title: Text("Limpazap", overflow: TextOverflow.visible), 46 | backgroundColor: Colors.green, 47 | actions: [ 48 | IconButton( 49 | icon: Icon(Icons.refresh), 50 | onPressed: update 51 | ), 52 | IconButton( 53 | icon: Icon(this.inverter 54 | ? Icons.fast_forward 55 | : Icons.fast_rewind), // Icon 56 | onPressed: () { 57 | this.inverter = !this.inverter; 58 | update(); 59 | }), // IconButton 60 | IconButton( 61 | icon: Icon(this.exibirUltimo 62 | ? Icons.visibility_off 63 | : Icons.visibility), 64 | onPressed: () { 65 | this.exibirUltimo = !this.exibirUltimo; 66 | update(); 67 | }) 68 | ]), // AppBar 69 | floatingActionButton: FloatingActionButton( 70 | backgroundColor: Colors.green, 71 | child: Icon(Icons.delete_sweep), 72 | onPressed: () => arquivos.forEach((arq) => chan.add(arq))), 73 | body: this.arquivos.length == 0 74 | ? SemArquivosWidget() 75 | : ArquivosWidget(this.arquivos, chan) // ArquivosWidget 76 | ); // Scaffold 77 | } 78 | } 79 | -------------------------------------------------------------------------------- /pubspec.yaml: -------------------------------------------------------------------------------- 1 | name: limpazap 2 | description: Aplicativo que realiza limpeza de arquivos desnecessários criados pelo WhatsApp 3 | 4 | publish_to: 'none' 5 | # The following defines the version and build number for your application. 6 | # A version number is three numbers separated by dots, like 1.2.43 7 | # followed by an optional build number separated by a +. 8 | # Both the version and the builder number may be overridden in flutter 9 | # build by specifying --build-name and --build-number, respectively. 10 | # In Android, build-name is used as versionName while build-number used as versionCode. 11 | # Read more about Android versioning at https://developer.android.com/studio/publish/versioning 12 | # In iOS, build-name is used as CFBundleShortVersionString while build-number used as CFBundleVersion. 13 | # Read more about iOS versioning at 14 | # https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html 15 | version: 4.1.0+17 16 | 17 | environment: 18 | sdk: '^3.8.0' 19 | 20 | dependencies: 21 | flutter: 22 | sdk: flutter 23 | 24 | # The following adds the Cupertino Icons font to your application. 25 | # Use with the CupertinoIcons class for iOS style icons. 26 | cupertino_icons: ^1.0.0 27 | permission_handler: ^12.0.1 28 | flutter_launcher_icons: "^0.14.0" # workaround: this doesn't get downloaded on fdroid 29 | wakelock_plus: ^1.3.2 # for dev mode 30 | 31 | dev_dependencies: 32 | flutter_test: 33 | sdk: flutter 34 | 35 | flutter_icons: 36 | image_path: "media/icone-verde.png" 37 | ios: false 38 | android: true 39 | 40 | 41 | # For information on the generic Dart part of this file, see the 42 | # following page: https://www.dartlang.org/tools/pub/pubspec 43 | 44 | # The following section is specific to Flutter. 45 | flutter: 46 | 47 | # The following line ensures that the Material Icons font is 48 | # included with your application, so that you can use the icons in 49 | # the material Icons class. 50 | uses-material-design: true 51 | 52 | # To add assets to your application, add an assets section, like this: 53 | # assets: 54 | # - images/a_dot_burr.jpeg 55 | # - images/a_dot_ham.jpeg 56 | 57 | # An image asset can refer to one or more resolution-specific "variants", see 58 | # https://flutter.dev/assets-and-images/#resolution-aware. 59 | 60 | # For details regarding adding assets from package dependencies, see 61 | # https://flutter.dev/assets-and-images/#from-packages 62 | 63 | # To add custom fonts to your application, add a fonts section here, 64 | # in this "flutter" section. Each entry in this list should have a 65 | # "family" key with the font family name, and a "fonts" key with a 66 | # list giving the asset and other descriptors for the font. For 67 | # example: 68 | # fonts: 69 | # - family: Schyler 70 | # fonts: 71 | # - asset: fonts/Schyler-Regular.ttf 72 | # - asset: fonts/Schyler-Italic.ttf 73 | # style: italic 74 | # - family: Trajan Pro 75 | # fonts: 76 | # - asset: fonts/TrajanPro.ttf 77 | # - asset: fonts/TrajanPro_Bold.ttf 78 | # weight: 700 79 | # 80 | # For details regarding fonts from package dependencies, 81 | # see https://flutter.dev/custom-fonts/#from-packages 82 | -------------------------------------------------------------------------------- /media/logo.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /pubspec.lock: -------------------------------------------------------------------------------- 1 | # Generated by pub 2 | # See https://dart.dev/tools/pub/glossary#lockfile 3 | packages: 4 | archive: 5 | dependency: transitive 6 | description: 7 | name: archive 8 | sha256: "2fde1607386ab523f7a36bb3e7edb43bd58e6edaf2ffb29d8a6d578b297fdbbd" 9 | url: "https://pub.dev" 10 | source: hosted 11 | version: "4.0.7" 12 | args: 13 | dependency: transitive 14 | description: 15 | name: args 16 | sha256: d0481093c50b1da8910eb0bb301626d4d8eb7284aa739614d2b394ee09e3ea04 17 | url: "https://pub.dev" 18 | source: hosted 19 | version: "2.7.0" 20 | async: 21 | dependency: transitive 22 | description: 23 | name: async 24 | sha256: "758e6d74e971c3e5aceb4110bfd6698efc7f501675bcfe0c775459a8140750eb" 25 | url: "https://pub.dev" 26 | source: hosted 27 | version: "2.13.0" 28 | boolean_selector: 29 | dependency: transitive 30 | description: 31 | name: boolean_selector 32 | sha256: "8aab1771e1243a5063b8b0ff68042d67334e3feab9e95b9490f9a6ebf73b42ea" 33 | url: "https://pub.dev" 34 | source: hosted 35 | version: "2.1.2" 36 | characters: 37 | dependency: transitive 38 | description: 39 | name: characters 40 | sha256: f71061c654a3380576a52b451dd5532377954cf9dbd272a78fc8479606670803 41 | url: "https://pub.dev" 42 | source: hosted 43 | version: "1.4.0" 44 | checked_yaml: 45 | dependency: transitive 46 | description: 47 | name: checked_yaml 48 | sha256: "959525d3162f249993882720d52b7e0c833978df229be20702b33d48d91de70f" 49 | url: "https://pub.dev" 50 | source: hosted 51 | version: "2.0.4" 52 | cli_util: 53 | dependency: transitive 54 | description: 55 | name: cli_util 56 | sha256: ff6785f7e9e3c38ac98b2fb035701789de90154024a75b6cb926445e83197d1c 57 | url: "https://pub.dev" 58 | source: hosted 59 | version: "0.4.2" 60 | clock: 61 | dependency: transitive 62 | description: 63 | name: clock 64 | sha256: fddb70d9b5277016c77a80201021d40a2247104d9f4aa7bab7157b7e3f05b84b 65 | url: "https://pub.dev" 66 | source: hosted 67 | version: "1.1.2" 68 | collection: 69 | dependency: transitive 70 | description: 71 | name: collection 72 | sha256: "2f5709ae4d3d59dd8f7cd309b4e023046b57d8a6c82130785d2b0e5868084e76" 73 | url: "https://pub.dev" 74 | source: hosted 75 | version: "1.19.1" 76 | crypto: 77 | dependency: transitive 78 | description: 79 | name: crypto 80 | sha256: c8ea0233063ba03258fbcf2ca4d6dadfefe14f02fab57702265467a19f27fadf 81 | url: "https://pub.dev" 82 | source: hosted 83 | version: "3.0.7" 84 | cupertino_icons: 85 | dependency: "direct main" 86 | description: 87 | name: cupertino_icons 88 | sha256: ba631d1c7f7bef6b729a622b7b752645a2d076dba9976925b8f25725a30e1ee6 89 | url: "https://pub.dev" 90 | source: hosted 91 | version: "1.0.8" 92 | dbus: 93 | dependency: transitive 94 | description: 95 | name: dbus 96 | sha256: "79e0c23480ff85dc68de79e2cd6334add97e48f7f4865d17686dd6ea81a47e8c" 97 | url: "https://pub.dev" 98 | source: hosted 99 | version: "0.7.11" 100 | fake_async: 101 | dependency: transitive 102 | description: 103 | name: fake_async 104 | sha256: "5368f224a74523e8d2e7399ea1638b37aecfca824a3cc4dfdf77bf1fa905ac44" 105 | url: "https://pub.dev" 106 | source: hosted 107 | version: "1.3.3" 108 | ffi: 109 | dependency: transitive 110 | description: 111 | name: ffi 112 | sha256: "289279317b4b16eb2bb7e271abccd4bf84ec9bdcbe999e278a94b804f5630418" 113 | url: "https://pub.dev" 114 | source: hosted 115 | version: "2.1.4" 116 | flutter: 117 | dependency: "direct main" 118 | description: flutter 119 | source: sdk 120 | version: "0.0.0" 121 | flutter_launcher_icons: 122 | dependency: "direct main" 123 | description: 124 | name: flutter_launcher_icons 125 | sha256: "10f13781741a2e3972126fae08393d3c4e01fa4cd7473326b94b72cf594195e7" 126 | url: "https://pub.dev" 127 | source: hosted 128 | version: "0.14.4" 129 | flutter_test: 130 | dependency: "direct dev" 131 | description: flutter 132 | source: sdk 133 | version: "0.0.0" 134 | flutter_web_plugins: 135 | dependency: transitive 136 | description: flutter 137 | source: sdk 138 | version: "0.0.0" 139 | http: 140 | dependency: transitive 141 | description: 142 | name: http 143 | sha256: "87721a4a50b19c7f1d49001e51409bddc46303966ce89a65af4f4e6004896412" 144 | url: "https://pub.dev" 145 | source: hosted 146 | version: "1.6.0" 147 | http_parser: 148 | dependency: transitive 149 | description: 150 | name: http_parser 151 | sha256: "178d74305e7866013777bab2c3d8726205dc5a4dd935297175b19a23a2e66571" 152 | url: "https://pub.dev" 153 | source: hosted 154 | version: "4.1.2" 155 | image: 156 | dependency: transitive 157 | description: 158 | name: image 159 | sha256: "4e973fcf4caae1a4be2fa0a13157aa38a8f9cb049db6529aa00b4d71abc4d928" 160 | url: "https://pub.dev" 161 | source: hosted 162 | version: "4.5.4" 163 | json_annotation: 164 | dependency: transitive 165 | description: 166 | name: json_annotation 167 | sha256: "1ce844379ca14835a50d2f019a3099f419082cfdd231cd86a142af94dd5c6bb1" 168 | url: "https://pub.dev" 169 | source: hosted 170 | version: "4.9.0" 171 | leak_tracker: 172 | dependency: transitive 173 | description: 174 | name: leak_tracker 175 | sha256: "33e2e26bdd85a0112ec15400c8cbffea70d0f9c3407491f672a2fad47915e2de" 176 | url: "https://pub.dev" 177 | source: hosted 178 | version: "11.0.2" 179 | leak_tracker_flutter_testing: 180 | dependency: transitive 181 | description: 182 | name: leak_tracker_flutter_testing 183 | sha256: "1dbc140bb5a23c75ea9c4811222756104fbcd1a27173f0c34ca01e16bea473c1" 184 | url: "https://pub.dev" 185 | source: hosted 186 | version: "3.0.10" 187 | leak_tracker_testing: 188 | dependency: transitive 189 | description: 190 | name: leak_tracker_testing 191 | sha256: "8d5a2d49f4a66b49744b23b018848400d23e54caf9463f4eb20df3eb8acb2eb1" 192 | url: "https://pub.dev" 193 | source: hosted 194 | version: "3.0.2" 195 | matcher: 196 | dependency: transitive 197 | description: 198 | name: matcher 199 | sha256: dc58c723c3c24bf8d3e2d3ad3f2f9d7bd9cf43ec6feaa64181775e60190153f2 200 | url: "https://pub.dev" 201 | source: hosted 202 | version: "0.12.17" 203 | material_color_utilities: 204 | dependency: transitive 205 | description: 206 | name: material_color_utilities 207 | sha256: f7142bb1154231d7ea5f96bc7bde4bda2a0945d2806bb11670e30b850d56bdec 208 | url: "https://pub.dev" 209 | source: hosted 210 | version: "0.11.1" 211 | meta: 212 | dependency: transitive 213 | description: 214 | name: meta 215 | sha256: "23f08335362185a5ea2ad3a4e597f1375e78bce8a040df5c600c8d3552ef2394" 216 | url: "https://pub.dev" 217 | source: hosted 218 | version: "1.17.0" 219 | package_info_plus: 220 | dependency: transitive 221 | description: 222 | name: package_info_plus 223 | sha256: f69da0d3189a4b4ceaeb1a3defb0f329b3b352517f52bed4290f83d4f06bc08d 224 | url: "https://pub.dev" 225 | source: hosted 226 | version: "9.0.0" 227 | package_info_plus_platform_interface: 228 | dependency: transitive 229 | description: 230 | name: package_info_plus_platform_interface 231 | sha256: "202a487f08836a592a6bd4f901ac69b3a8f146af552bbd14407b6b41e1c3f086" 232 | url: "https://pub.dev" 233 | source: hosted 234 | version: "3.2.1" 235 | path: 236 | dependency: transitive 237 | description: 238 | name: path 239 | sha256: "75cca69d1490965be98c73ceaea117e8a04dd21217b37b292c9ddbec0d955bc5" 240 | url: "https://pub.dev" 241 | source: hosted 242 | version: "1.9.1" 243 | permission_handler: 244 | dependency: "direct main" 245 | description: 246 | name: permission_handler 247 | sha256: bc917da36261b00137bbc8896bf1482169cd76f866282368948f032c8c1caae1 248 | url: "https://pub.dev" 249 | source: hosted 250 | version: "12.0.1" 251 | permission_handler_android: 252 | dependency: transitive 253 | description: 254 | name: permission_handler_android 255 | sha256: "1e3bc410ca1bf84662104b100eb126e066cb55791b7451307f9708d4007350e6" 256 | url: "https://pub.dev" 257 | source: hosted 258 | version: "13.0.1" 259 | permission_handler_apple: 260 | dependency: transitive 261 | description: 262 | name: permission_handler_apple 263 | sha256: f000131e755c54cf4d84a5d8bd6e4149e262cc31c5a8b1d698de1ac85fa41023 264 | url: "https://pub.dev" 265 | source: hosted 266 | version: "9.4.7" 267 | permission_handler_html: 268 | dependency: transitive 269 | description: 270 | name: permission_handler_html 271 | sha256: "38f000e83355abb3392140f6bc3030660cfaef189e1f87824facb76300b4ff24" 272 | url: "https://pub.dev" 273 | source: hosted 274 | version: "0.1.3+5" 275 | permission_handler_platform_interface: 276 | dependency: transitive 277 | description: 278 | name: permission_handler_platform_interface 279 | sha256: eb99b295153abce5d683cac8c02e22faab63e50679b937fa1bf67d58bb282878 280 | url: "https://pub.dev" 281 | source: hosted 282 | version: "4.3.0" 283 | permission_handler_windows: 284 | dependency: transitive 285 | description: 286 | name: permission_handler_windows 287 | sha256: "1a790728016f79a41216d88672dbc5df30e686e811ad4e698bfc51f76ad91f1e" 288 | url: "https://pub.dev" 289 | source: hosted 290 | version: "0.2.1" 291 | petitparser: 292 | dependency: transitive 293 | description: 294 | name: petitparser 295 | sha256: "1a97266a94f7350d30ae522c0af07890c70b8e62c71e8e3920d1db4d23c057d1" 296 | url: "https://pub.dev" 297 | source: hosted 298 | version: "7.0.1" 299 | plugin_platform_interface: 300 | dependency: transitive 301 | description: 302 | name: plugin_platform_interface 303 | sha256: "4820fbfdb9478b1ebae27888254d445073732dae3d6ea81f0b7e06d5dedc3f02" 304 | url: "https://pub.dev" 305 | source: hosted 306 | version: "2.1.8" 307 | posix: 308 | dependency: transitive 309 | description: 310 | name: posix 311 | sha256: "6323a5b0fa688b6a010df4905a56b00181479e6d10534cecfecede2aa55add61" 312 | url: "https://pub.dev" 313 | source: hosted 314 | version: "6.0.3" 315 | sky_engine: 316 | dependency: transitive 317 | description: flutter 318 | source: sdk 319 | version: "0.0.0" 320 | source_span: 321 | dependency: transitive 322 | description: 323 | name: source_span 324 | sha256: "254ee5351d6cb365c859e20ee823c3bb479bf4a293c22d17a9f1bf144ce86f7c" 325 | url: "https://pub.dev" 326 | source: hosted 327 | version: "1.10.1" 328 | stack_trace: 329 | dependency: transitive 330 | description: 331 | name: stack_trace 332 | sha256: "8b27215b45d22309b5cddda1aa2b19bdfec9df0e765f2de506401c071d38d1b1" 333 | url: "https://pub.dev" 334 | source: hosted 335 | version: "1.12.1" 336 | stream_channel: 337 | dependency: transitive 338 | description: 339 | name: stream_channel 340 | sha256: "969e04c80b8bcdf826f8f16579c7b14d780458bd97f56d107d3950fdbeef059d" 341 | url: "https://pub.dev" 342 | source: hosted 343 | version: "2.1.4" 344 | string_scanner: 345 | dependency: transitive 346 | description: 347 | name: string_scanner 348 | sha256: "921cd31725b72fe181906c6a94d987c78e3b98c2e205b397ea399d4054872b43" 349 | url: "https://pub.dev" 350 | source: hosted 351 | version: "1.4.1" 352 | term_glyph: 353 | dependency: transitive 354 | description: 355 | name: term_glyph 356 | sha256: "7f554798625ea768a7518313e58f83891c7f5024f88e46e7182a4558850a4b8e" 357 | url: "https://pub.dev" 358 | source: hosted 359 | version: "1.2.2" 360 | test_api: 361 | dependency: transitive 362 | description: 363 | name: test_api 364 | sha256: ab2726c1a94d3176a45960b6234466ec367179b87dd74f1611adb1f3b5fb9d55 365 | url: "https://pub.dev" 366 | source: hosted 367 | version: "0.7.7" 368 | typed_data: 369 | dependency: transitive 370 | description: 371 | name: typed_data 372 | sha256: f9049c039ebfeb4cf7a7104a675823cd72dba8297f264b6637062516699fa006 373 | url: "https://pub.dev" 374 | source: hosted 375 | version: "1.4.0" 376 | vector_math: 377 | dependency: transitive 378 | description: 379 | name: vector_math 380 | sha256: d530bd74fea330e6e364cda7a85019c434070188383e1cd8d9777ee586914c5b 381 | url: "https://pub.dev" 382 | source: hosted 383 | version: "2.2.0" 384 | vm_service: 385 | dependency: transitive 386 | description: 387 | name: vm_service 388 | sha256: "45caa6c5917fa127b5dbcfbd1fa60b14e583afdc08bfc96dda38886ca252eb60" 389 | url: "https://pub.dev" 390 | source: hosted 391 | version: "15.0.2" 392 | wakelock_plus: 393 | dependency: "direct main" 394 | description: 395 | name: wakelock_plus 396 | sha256: "9296d40c9adbedaba95d1e704f4e0b434be446e2792948d0e4aa977048104228" 397 | url: "https://pub.dev" 398 | source: hosted 399 | version: "1.4.0" 400 | wakelock_plus_platform_interface: 401 | dependency: transitive 402 | description: 403 | name: wakelock_plus_platform_interface 404 | sha256: "036deb14cd62f558ca3b73006d52ce049fabcdcb2eddfe0bf0fe4e8a943b5cf2" 405 | url: "https://pub.dev" 406 | source: hosted 407 | version: "1.3.0" 408 | web: 409 | dependency: transitive 410 | description: 411 | name: web 412 | sha256: "868d88a33d8a87b18ffc05f9f030ba328ffefba92d6c127917a2ba740f9cfe4a" 413 | url: "https://pub.dev" 414 | source: hosted 415 | version: "1.1.1" 416 | win32: 417 | dependency: transitive 418 | description: 419 | name: win32 420 | sha256: d7cb55e04cd34096cd3a79b3330245f54cb96a370a1c27adb3c84b917de8b08e 421 | url: "https://pub.dev" 422 | source: hosted 423 | version: "5.15.0" 424 | xml: 425 | dependency: transitive 426 | description: 427 | name: xml 428 | sha256: "971043b3a0d3da28727e40ed3e0b5d18b742fa5a68665cca88e74b7876d5e025" 429 | url: "https://pub.dev" 430 | source: hosted 431 | version: "6.6.1" 432 | yaml: 433 | dependency: transitive 434 | description: 435 | name: yaml 436 | sha256: b9da305ac7c39faa3f030eccd175340f968459dae4af175130b3fc47e40d76ce 437 | url: "https://pub.dev" 438 | source: hosted 439 | version: "3.1.3" 440 | sdks: 441 | dart: ">=3.8.0 <4.0.0" 442 | flutter: ">=3.24.0" 443 | --------------------------------------------------------------------------------