This commit is contained in:
Tomas Dvorak
2026-01-04 17:28:01 +01:00
parent 37ffb93923
commit 71af3a0828
15 changed files with 103 additions and 147 deletions
+32
View File
@@ -87,3 +87,35 @@ coverage/
# OS generated files
Thumbs.db
# Documentation and project files
ANALYTICS_SETUP_GUIDE.md
APK_BUILD_GUIDE.md
APP_STORE_ASSETS_GUIDE.md
APP_STORE_METADATA.md
architecture.md
build_apk.sh
CODE_REVIEW_REPORT.md
database-schema.md
development-roadmap.md
flutter-project-structure.md
GIT_RELEASE_GUIDE.md
navigation-and-user-flows.md
project.md
requirements-functional.md
requirements-nonfunctional.md
SECURITY_AUDIT_REPORT.md
security-and-privacy.md
timeline.md
ui-ux-spec.md
# Images
image.png
image copy.png
image copy 2.png
Screenshot 2026-01-03 172853.png
Screenshot 2026-01-03 172901.png
Screenshot 2026-01-03 172907.png
# Supabase directory
supabase/
+22 -58
View File
@@ -1,7 +1,7 @@
#!/bin/bash
# Build APK Script for LifeTimer Flutter App
# This script provides multiple approaches to build the APK
# Build Script for LifeTimer Flutter App
# Creates versioned APK in build/release directory
echo "LifeTimer APK Build Script"
echo "=========================="
@@ -12,78 +12,42 @@ cd lifetimer
echo "Current directory: $(pwd)"
echo "Flutter version: $(flutter --version | head -n 1)"
# Approach 1: Try building debug APK with minimal changes
echo ""
echo "Approach 1: Building debug APK..."
echo "================================"
# Get version from pubspec.yaml
VERSION=$(grep "version:" pubspec.yaml | cut -d' ' -f2 | cut -d'+' -f1)
BUILD_NUMBER=$(grep "version:" pubspec.yaml | cut -d'+' -f2)
# Temporarily disable problematic plugins
echo "Temporarily disabling problematic plugins..."
echo "Building LifeTimer version $VERSION (build $BUILD_NUMBER)"
# Create a temporary pubspec.yaml without problematic dependencies
cp pubspec.yaml pubspec.yaml.backup
# Create release directory
mkdir -p build/release
# Comment out problematic dependencies
sed -i 's/^ sign_in_with_apple:/ # sign_in_with_apple:/' pubspec.yaml
sed -i 's/^ supabase_flutter:/ # supabase_flutter:/' pubspec.yaml
# Clean and get dependencies
flutter clean
flutter pub get
# Try building APK
echo "Attempting to build APK..."
if flutter build apk --debug; then
# Build APK with version info and .env configuration
echo "Building APK with .env configuration..."
if flutter build apk --dart-define-from-file=.env --build-name=$VERSION --build-number=$BUILD_NUMBER; then
echo "✅ APK build successful!"
echo "APK location: build/app/outputs/flutter-apk/app-debug.apk"
# Copy to release directory with versioned name
cp build/app/outputs/flutter-apk/app-release.apk build/release/lifetimer-$VERSION-$BUILD_NUMBER.apk
echo "✅ Build complete: build/release/lifetimer-$VERSION-$BUILD_NUMBER.apk"
# Show APK info
ls -lh build/app/outputs/flutter-apk/app-debug.apk
# Restore original pubspec.yaml
mv pubspec.yaml.backup pubspec.yaml
flutter pub get
ls -lh build/release/lifetimer-$VERSION-$BUILD_NUMBER.apk
echo ""
echo "Build completed successfully!"
echo "You can install the APK with: adb install build/app/outputs/flutter-apk/app-debug.apk"
echo "You can install the APK with: adb install build/release/lifetimer-$VERSION-$BUILD_NUMBER.apk"
else
echo "❌ APK build failed with Approach 1"
# Restore original pubspec.yaml
mv pubspec.yaml.backup pubspec.yaml
flutter pub get
echo "❌ APK build failed"
echo ""
echo "Approach 2: Building with release mode..."
echo "====================================="
# Try release build
if flutter build apk --release; then
echo "✅ Release APK build successful!"
echo "APK location: build/app/outputs/flutter-apk/app-release.apk"
# Show APK info
ls -lh build/app/outputs/flutter-apk/app-release.apk
echo ""
echo "Build completed successfully!"
echo "You can install the APK with: adb install build/app/outputs/flutter-apk/app-release.apk"
else
echo "❌ Both approaches failed"
echo ""
echo "Manual troubleshooting steps:"
echo "1. Update Flutter to latest version: flutter upgrade"
echo "Troubleshooting steps:"
echo "1. Update Flutter: flutter upgrade"
echo "2. Clean project: flutter clean && flutter pub get"
echo "3. Check Android SDK installation"
echo "4. Try building with specific target: flutter build apk --target-platform android-arm64"
echo "5. Consider updating problematic dependencies in pubspec.yaml"
echo "4. Verify .env file exists and is properly formatted"
exit 1
fi
fi
echo ""
echo "Build script completed."
+5 -4
View File
@@ -1,7 +1,7 @@
plugins {
id("com.android.application")
id("kotlin-android")
// id("com.google.gms.google-services")
id("com.google.gms.google-services")
// The Flutter Gradle Plugin must be applied after the Android and Kotlin Gradle plugins.
id("dev.flutter.flutter-gradle-plugin")
}
@@ -54,8 +54,9 @@ flutter {
dependencies {
coreLibraryDesugaring("com.android.tools:desugar_jdk_libs:2.0.4")
implementation("com.google.android.gms:play-services-auth:20.7.0")
}
configurations.all {
exclude(group = "com.aboutyou.dart_packages", module = "sign_in_with_apple")
}
// configurations.all {
// exclude(group = "com.aboutyou.dart_packages", module = "sign_in_with_apple")
// }
@@ -0,0 +1 @@
{"project_info": {"project_number": "123456789012", "project_id": "lifetimer-1356", "storage_bucket": "lifetimer-1356.appspot.com"}, "client": [{"client_info": {"mobilesdk_app_id": "1:123456789012:android:abcdef1234567890", "android_client_info": {"package_name": "com.example.lifetimer"}}, "oauth_client": [{"client_id": "123456789012-abcdef1234567890.apps.googleusercontent.com", "client_type": 3}], "api_key": [{"current_key": "AIzaSyabcdef1234567890abcdef1234567890"}], "services": {"appinvite_service": {"other_platform_oauth_client": [{"client_id": "123456789012-abcdef1234567890.apps.googleusercontent.com", "client_type": 3}]}}}], "configuration_version": "1"}
@@ -26,6 +26,12 @@
<action android:name="android.intent.action.MAIN"/>
<category android:name="android.intent.category.LAUNCHER"/>
</intent-filter>
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
<data android:scheme="lifetimer" />
</intent-filter>
</activity>
<!-- Don't delete the meta-data below.
This is used by the Flutter tool to generate GeneratedPluginRegistrant.java -->
+10
View File
@@ -1,3 +1,13 @@
buildscript {
repositories {
google()
mavenCentral()
}
dependencies {
classpath("com.google.gms:google-services:4.4.0")
}
}
allprojects {
repositories {
google()
+8
View File
@@ -47,6 +47,14 @@
<true/>
<key>CFBundleURLTypes</key>
<array>
<dict>
<key>CFBundleTypeRole</key>
<string>Editor</string>
<key>CFBundleURLSchemes</key>
<array>
<string>lifetimer</string>
</array>
</dict>
<dict>
<key>CFBundleTypeRole</key>
<string>Editor</string>
+4 -1
View File
@@ -37,7 +37,10 @@ class AppScaffold extends StatelessWidget {
actions: actions,
)
: null,
body: SafeArea(child: body),
body: body,
extendBodyBehindAppBar: true,
extendBody: true,
backgroundColor: Theme.of(context).scaffoldBackgroundColor,
floatingActionButton: floatingActionButton,
bottomNavigationBar: bottomNavigationBar,
);
@@ -1,10 +1,8 @@
import 'dart:async';
import 'package:flutter/foundation.dart' show kIsWeb;
import '../models/user_model.dart';
import '../../bootstrap/supabase_client.dart';
import 'package:supabase_flutter/supabase_flutter.dart' as supabase;
import 'package:google_sign_in/google_sign_in.dart';
import 'package:sign_in_with_apple/sign_in_with_apple.dart';
class AuthRepository {
final supabase.SupabaseClient _client;
@@ -110,30 +108,6 @@ class AuthRepository {
}
}
Future<void> signInWithApple() async {
final credential = await SignInWithApple.getAppleIDCredential(
scopes: [
AppleIDAuthorizationScopes.email,
AppleIDAuthorizationScopes.fullName,
],
);
final identityToken = credential.identityToken;
if (identityToken == null) {
throw Exception('No identity token from Apple sign-in');
}
final response = await _client.auth.signInWithIdToken(
provider: supabase.OAuthProvider.apple,
idToken: identityToken,
accessToken: credential.authorizationCode,
);
if (response.user != null) {
await _ensureUserProfileExists(response.user!.id, response.user!);
}
}
Future<void> signInWithGithub() async {
await _client.auth.signInWithOAuth(
supabase.OAuthProvider.github,
@@ -56,11 +56,6 @@ class AuthController extends StateNotifier<User?> {
_analytics.logSignIn(method: 'google');
}
Future<void> signInWithApple() async {
await _authRepository.signInWithApple();
_analytics.logSignIn(method: 'apple');
}
Future<void> signInWithGithub() async {
await _authRepository.signInWithGithub();
_analytics.logSignIn(method: 'github');
@@ -35,23 +35,6 @@ class _AuthChoiceScreenState extends ConsumerState<AuthChoiceScreen> {
}
Future<void> _handleAppleSignIn() async {
setState(() => _isLoading = true);
try {
await ref.read(authControllerProvider.notifier).signInWithApple();
} catch (e) {
if (mounted) {
ScaffoldMessenger.of(context).showSnackBar(
SnackBar(content: Text('Apple sign-in failed: $e')),
);
}
} finally {
if (mounted) {
setState(() => _isLoading = false);
}
}
}
Future<void> _handleGithubSignIn() async {
setState(() => _isLoading = true);
try {
@@ -164,13 +147,6 @@ class _AuthChoiceScreenState extends ConsumerState<AuthChoiceScreen> {
onPressed: _handleGoogleSignIn,
),
const SizedBox(height: 12),
_SocialButton(
icon: Icons.apple,
label: 'Continue with Apple',
isLoading: _isLoading,
onPressed: _handleAppleSignIn,
),
const SizedBox(height: 12),
_SocialButton(
icon: Icons.code,
label: 'Continue with GitHub',
@@ -1,5 +1,4 @@
import 'dart:io';
import 'dart:typed_data';
import 'package:flutter/foundation.dart' show kIsWeb;
import 'package:flutter/material.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
+12
View File
@@ -1,4 +1,5 @@
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'bootstrap/bootstrap.dart';
import 'core/theme/app_theme.dart';
@@ -8,6 +9,17 @@ import 'core/state/providers.dart';
void main() async {
WidgetsFlutterBinding.ensureInitialized();
SystemChrome.setSystemUIOverlayStyle(
const SystemUiOverlayStyle(
statusBarColor: Colors.transparent,
systemNavigationBarColor: Colors.transparent,
),
);
SystemChrome.setEnabledSystemUIMode(
SystemUiMode.edgeToEdge,
);
await bootstrap();
runApp(
-24
View File
@@ -1319,30 +1319,6 @@ packages:
url: "https://pub.dev"
source: hosted
version: "2.0.1"
sign_in_with_apple:
dependency: "direct main"
description:
name: sign_in_with_apple
sha256: e84a62e17b7e463abf0a64ce826c2cd1f0b72dff07b7b275e32d5302d76fb4c5
url: "https://pub.dev"
source: hosted
version: "6.1.4"
sign_in_with_apple_platform_interface:
dependency: transitive
description:
name: sign_in_with_apple_platform_interface
sha256: c2ef2ce6273fce0c61acd7e9ff5be7181e33d7aa2b66508b39418b786cca2119
url: "https://pub.dev"
source: hosted
version: "1.1.0"
sign_in_with_apple_web:
dependency: transitive
description:
name: sign_in_with_apple_web
sha256: "2f7c38368f49e3f2043bca4b46a4a61aaae568c140a79aa0675dc59ad0ca49bc"
url: "https://pub.dev"
source: hosted
version: "2.1.1"
sky_engine:
dependency: transitive
description: flutter
-1
View File
@@ -20,7 +20,6 @@ dependencies:
# OAuth Authentication
google_sign_in: ^6.2.1
sign_in_with_apple: ^6.0.0
# Navigation
go_router: ^12.1.3