mirror of
https://github.com/Dvorinka/1356.git
synced 2026-06-03 19:42:57 +00:00
build
This commit is contained in:
+32
@@ -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/
|
||||
|
||||
+25
-61
@@ -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,77 +12,41 @@ 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 "====================================="
|
||||
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. Verify .env file exists and is properly formatted"
|
||||
|
||||
# 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 "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"
|
||||
|
||||
exit 1
|
||||
fi
|
||||
exit 1
|
||||
fi
|
||||
|
||||
echo ""
|
||||
|
||||
@@ -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 -->
|
||||
|
||||
@@ -1,3 +1,13 @@
|
||||
buildscript {
|
||||
repositories {
|
||||
google()
|
||||
mavenCentral()
|
||||
}
|
||||
dependencies {
|
||||
classpath("com.google.gms:google-services:4.4.0")
|
||||
}
|
||||
}
|
||||
|
||||
allprojects {
|
||||
repositories {
|
||||
google()
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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';
|
||||
|
||||
@@ -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(
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user