Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
47 changes: 47 additions & 0 deletions .github/ISSUE_TEMPLATE/bug_report.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
# ============================================================================
# Bug Report Template
# ============================================================================
---
name: Bug Report
about: Create a report to help us improve
title: '[BUG]'
labels: bug
assignees: ''
---

## 🐛 Bug Description
<!-- A clear and concise description of the bug -->

## Environment
- **Device**
- **OS Version**:
- **App Version**:
- **Build**: Dev/Staging/Production

## 🔄 Steps To Reproduce
1. Go to '...'
2. Click on '....'
3. Scroll down to '....'
4. See error

## ✅ Expected Behavior
<!-- What should happen -->

## ❌ Actual Behavior
<!-- What actually happens -->

## 📸 Screenshots
<!-- Add screenshots if applicable -->

## 📋 Logs
<!-- Paste relevant logs or error messages -->

```
Paste logs here
```

## 💡 Possible Solution
<!-- Optional: suggest a fix -->

## 📝 Additional Context
<!-- Any other relevant information -->
28 changes: 28 additions & 0 deletions .github/ISSUE_TEMPLATE/feature_request.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
# ============================================================================
# Feature Request Template
# ============================================================================
---
name: Feature Request
about: Suggest a feature for this project
title: '[FEATURE] '
labels: enhancement
assignees: ''
---

## ✨ Feature Description
<!-- Clear description of the feature -->

## 🎯 Problem/Motivation
<!-- What problem does this solve? -->

## 💡 Proposed Solution
<!-- How should this feature work? -->

## 🔄 Alternatives Considered
<!-- What other approaches did you consider? -->

## 📸 Mockups/Examples
<!-- Visual examples if applicable -->

## 📝 Additional Context
<!-- Any other information -->
50 changes: 50 additions & 0 deletions .github/PULL_REQUEST_TEMPLATE.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
#=======================================================================
# Pull Request Template
#=======================================================================
## 📋 Description
<!-- Describe your changes in detail -->

## 🎯 Type of Change
- [ ] 🐛 Bug fix (non-breaking change that fixes an issue)
- [ ] ✨ New feature (non-breaking change that adds functionality)
- [ ] 💥 Breaking change (fix or feature that causes existing functionality to change)
- [ ] 📝 Documentation update
- [ ] 🎨 UI/UX improvement
- [ ] ⚡ Performance improvement
- [ ] 🔒 Security fix

## 🧪 Testing
- [ ] Unit tests pass locally
- [ ] Integration tests pass (if applicable)
- [ ] Manual testing completed
- [ ] Tested on physical device

## Test Coverage
- [ ] Added tests for new features
- [ ] Updated existing tests
- [ ] Coverage increased/maintained

## 📱 Tested On
- [ ] Android (API level: ___)
- [ ] iOS (version: ___)
- [ ] Physical device (model: ___)
- [ ] Emulator/Simulator

## 📸 Screenshots (if UI changes)
<!-- Add screenshots or screen recordings -->

## ✅ Checklist
- [ ] Code follows project style guidelines
- [ ] Self-reviewed the code
- [ ] Commented complex code sections
- [ ] Updated documentation (if needed)
- [ ] No new warnings generated
- [ ] Added tests that prove fix/feature works
- [ ] All tests pass locally
- [ ] Conflicts resolved with base branch

## 🔗 Related Issues
<!-- Link related issues: Closes #123, Fixes #456 -->

## 📝 Additional Notes
<!-- Any additional information for reviewers -->
23 changes: 23 additions & 0 deletions .github/dependabot.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
# ============================================================================
# .github/dependabot.yml
# Automated dependency updates
# ============================================================================
version: 2
updates:
# GitHub Actions
- package-ecosystem: "github-actions"
directory: "/"
schedule:
interval: "weekly"
labels:
- "dependencies"
- "github-actions"

# Gradle (Android)
- package-ecosystem: "gradle"
directory: "/android"
schedule:
interval: "weekly"
labels:
- "dependencies"
- "android"
153 changes: 153 additions & 0 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,153 @@
# ============================================================================
# CONTINUOUS INTEGRATION PIPELINE
# Runs on every PR and push to develop/main
# ============================================================================
name: Continuous Integration

on:
pull_request:
branches: [develop, main]
push:
branches: [develop, main]
workflow_dispatch:

env:
FLUTTER_VERSION: '3.35.7'
JAVA_VERSION: '17'

jobs:
# ============================================================================
# CODE QUALITY CHECKS
# ============================================================================
code-quality:
name: Code Quality Analysis
runs-on: ubuntu-latest
timeout-minutes: 10

steps:
- name: 📦 Checkout Code
uses: actions/checkout@v4
with:
fetch-depth: 0

- name: 🎯 Setup Flutter
uses: subosito/flutter-action@v2
with:
flutter-version: ${{ env.FLUTTER_VERSION }}
channel: 'stable'
cache: true

- name: 📊 Get Dependencies
run: flutter pub get

- name: 🔍 Run Flutter Analyzer
run: flutter analyze --no-fatal-infos

- name: 🎨 Check Code Formatting
run: dart format --set-exit-if-changed .

- name: 🔐 Check for Secrets
uses: trufflesecurity/trufflehog@main
with:
path: ./
base: ${{ github.event.repository.default_branch }}
head: HEAD


# ============================================================================
# UNIT & WIDGET TESTS
# ============================================================================
tests:
name: Run Tests
runs-on: ubuntu-latest
needs: code-quality
timeout-minutes: 15

steps:
- name: 📦 Checkout Code
uses: actions/checkout@v4

- name: 🎯 Setup Flutter
uses: subosito/flutter-action@v2
with:
flutter-version: ${{ env.FLUTTER_VERSION }}
channel: 'stable'
cache: true

- name: 📊 Get Dependencies
run: flutter pub get

- name: 🧪 Run Tests with Coverage
run: flutter test --coverage --reporter expanded

- name: 📈 Upload Coverage to Codecov
uses: codecov/codecov-action@v3
with:
files: ./coverage/lcov.info
fail_ci_if_error: false
verbose: true

- name: 📊 Generate Coverage Report
run: |
flutter pub global activate coverage
flutter pub global run coverage:format_coverage --lcov --in=coverage --out=coverage/lcov.info --report-on=lib


# ============================================================================
# BUILD VERIFICATION (Debug APK)
# ============================================================================
build-verification:
name: Build Verification
runs-on: ubuntu-latest
needs: tests
timeout-minutes: 20

strategy:
matrix:
flavor: [dev, staging, prod]

steps:
- name: 📦 Checkout Code
uses: actions/checkout@v4

- name: 🎯 Setup Flutter
uses: subosito/flutter-action@v2
with:
flutter-version: ${{ env.FLUTTER_VERSION }}
channel: 'stable'
cache: true

- name: ☕ Setup Java
uses: actions/setup-java@v4
with:
distribution: 'zulu'
java-version: ${{ env.JAVA_VERSION }}
cache: 'gradle'

- name: 📦 Get Dependencies
run: flutter pub get

- name: 🔨 Run Code Generation
run: flutter pub run build_runner build --delete-conflicting-outputs

- name: 📝 Create Environment File
run: |
mkdir -p assets/config
echo "APP_NAME=Password Manager ${{ matrix.flavor }}" > assets/config/.env.${{ matrix.flavor }}
echo "APP_ENV=${{ matrix.flavor }}" >> assets/config/.env.${{ matrix.flavor }}
echo "API_BASE_URL=${{ secrets[format('{0}_API_BASE_URL', matrix.flavor)] }}" >> assets/config/.env.${{ matrix.flavor }}

- name: 🔨 Build Debug APK
run: |
flutter build apk \
-t lib/main_${{ matrix.flavor }}.dart \
--debug \
--flavor ${{ matrix.flavor }} \
--dart-define=FLAVOR=${{ matrix.flavor }}

- name: 📤 Upload Build Artifact
uses: actions/upload-artifact@v4
with:
name: apk-${{ matrix.flavor }}-debug
path: build/app/outputs/flutter-apk/app-${{ matrix.flavor }}-debug.apk
retention-days: 7
5 changes: 3 additions & 2 deletions .github/workflows/deploy_dev.yml
Original file line number Diff line number Diff line change
Expand Up @@ -354,16 +354,17 @@ jobs:
<div>
<span class="status">${{ needs.deploy-android-dev.result == 'success' && 'Deployed' || 'Failed' }}</span>
</div>
<br>

<h2>Development Build #${{ github.run_number }}</h2>

<div class="info-grid">
<div class="info-row">
<span class="label">Branch</span>
<span class="label">Branch </span>
<span class="value">${{ github.ref_name }}</span>
</div>
<div class="info-row">
<span class="label">Commit</span>
<span class="label">Commit </span>
<span class="value">${{ github.sha }}</span>
</div>
<div class="info-row">
Expand Down
Binary file modified android/app/src/main/res/mipmap-hdpi/ic_launcher.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file modified android/app/src/main/res/mipmap-mdpi/ic_launcher.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file modified android/app/src/main/res/mipmap-xhdpi/ic_launcher.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file modified android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file modified android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file modified assets/logo/app_logo.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
19 changes: 10 additions & 9 deletions lib/config/routes/app_router.dart
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ import 'package:password_manager/feature/auth/presentation/pages/master-password
import 'package:password_manager/feature/auth/presentation/pages/master-password-success/master_password_success.dart';
import 'package:password_manager/feature/auth/presentation/pages/unlock-vault/unlock_vault.dart';
import 'package:password_manager/feature/home/domain/entities/password_entry.dart';
import 'package:password_manager/feature/home/presentation/mainscreen/pages/camera_screen.dart';
import 'package:password_manager/feature/home/presentation/mainscreen/pages/main_screen.dart';
import 'package:password_manager/feature/home/presentation/password_detail/password_add_screen.dart';
import 'package:password_manager/feature/home/presentation/password_detail/password_detail_screen.dart';
Expand Down Expand Up @@ -179,15 +180,15 @@ class AppRouter {
// // ======================================================================
// // CATEGORIES
// // ======================================================================
// GoRoute(
// path: Routes.categories,
// name: RouteNames.categories,
// pageBuilder: (context, state) => CustomTransitionPage(
// key: state.pageKey,
// child: const CategoriesPage(),
// transitionsBuilder: RouteTransitions.slide,
// ),
// ),
GoRoute(
path: Routes.camera,
name: RouteNames.camera,
pageBuilder: (context, state) => CustomTransitionPage(
key: state.pageKey,
child: SnapCameraPro(),
transitionsBuilder: RouteTransitions.slide,
),
),

// GoRoute(
// path: Routes.addCategory,
Expand Down
1 change: 1 addition & 0 deletions lib/config/routes/route_guards.dart
Original file line number Diff line number Diff line change
Expand Up @@ -203,6 +203,7 @@ class AuthGuard {
Routes.masterPasswordSetup,
Routes.masterPasswordSuccess,
Routes.unlock,
Routes.camera,
];

return publicRoutes.contains(path);
Expand Down
4 changes: 4 additions & 0 deletions lib/config/routes/route_names.dart
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,8 @@
class Routes {
Routes._();

static const String camera ='/camera';

// Core App Routes
static const String splash = '/';
static const String onboarding = '/onboarding';
Expand Down Expand Up @@ -43,6 +45,8 @@ class Routes {
class RouteNames {
RouteNames._();

static const String camera= 'camera';

static const String splash = 'splash';
static const String onboarding = 'onboarding';
static const String masterPasswordSetup = 'masterPasswordSetup';
Expand Down
Loading
Loading