Intelligent event planning and management solution for modern organizations
make every celebration, gathering, and occasion effortlessly memorable
PartyMaker is the smart way to plan any event. Our platform thinks for you - managing invites, coordinating schedules, and keeping everyone connected - so you spend less time organizing and more time celebrating. It's event planning that works.
PartyMaker follows a multi-tier enterprise architecture with clear separation of concerns and scalable design patterns:
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β CLIENT TIER β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€
β β’ Android Native Client (MVVM + Repository Pattern) β
β β’ UI Layer (Activities, Fragments, Adapters) β
β β’ Presentation Layer (ViewModels, LiveData) β
β β’ Domain Layer (Use Cases, Business Logic) β
β β’ Data Layer (Repositories, Data Sources) β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β HTTPS/REST
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β APPLICATION TIER β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€
β β’ Spring Boot Server (MVC Pattern) β
β β’ Controller Layer (REST Controllers) β
β β’ Service Layer (Business Logic) β
β β’ Configuration Layer (Firebase Admin, Security) β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β Firebase SDK
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β DATA TIER β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€
β β’ Firebase Ecosystem β
β β’ Authentication Service (User Management) β
β β’ Realtime Database (NoSQL Data Storage) β
β β’ Cloud Storage (File & Image Management) β
β β’ Local Storage (Room Database - Offline Support) β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
- π Clean Architecture: Clear separation between UI, business logic, and data layers
- π MVVM Pattern: Reactive programming with LiveData and ViewModels
- πͺ Repository Pattern: Centralized data access with multiple data sources
- π Dependency Injection: Singleton pattern for service management
- π Security-First Design: Authentication, encryption, and secure data handling
- β‘ Performance Optimization: Smart caching, lazy loading, and memory management
- π Offline-First Strategy: Local data persistence with sync capabilities
| Component | Technology | Version | Purpose |
|---|---|---|---|
| Language | Java + Kotlin | Java 11, Kotlin 2.0.21 | Core development languages |
| SDK | Android SDK | Min 33, Target 35 | Platform compatibility |
| Architecture | MVVM + Repository | - | Scalable app architecture |
| UI Framework | Android Views + Material Design | Material 1.12.0 | Modern UI components |
| Navigation | Custom Navigation Manager | - | Centralized navigation logic |
| Database | Room + SQLite | Room 2.7.2 | Local data persistence |
| Networking | OkHttp + Custom Clients | OkHttp 5.1.0 | HTTP communication |
| Image Loading | Glide | 4.15.1 | Optimized image management |
| Threading | Custom ThreadUtils | - | Background task management |
| Security | AndroidX Security Crypto | 1.1.0-alpha06 | Encrypted storage |
| DI Container | Custom Singleton Pattern | - | Dependency management |
| Component | Technology | Version | Purpose |
|---|---|---|---|
| Framework | Spring Boot | 2.7.5 | Web application framework |
| Language | Java | 11 | Server-side development |
| Architecture | MVC + Service Layer | - | Clean server architecture |
| Validation | Spring Boot Validation | - | Input validation & security |
| Database Integration | Firebase Admin SDK | 9.1.1 | Firebase backend integration |
| API Design | RESTful Web Services | - | Standard API architecture |
| Build System | Gradle | - | Project build management |
| Service | Purpose | Features |
|---|---|---|
| Authentication | User management | Email/password, Google Sign-In, session management |
| Realtime Database | NoSQL data storage | Real-time synchronization, offline support |
| Cloud Storage | File management | Image uploads, profile pictures, group media |
| Security Rules | Data access control | Role-based permissions, data validation |
| Service | Purpose | Integration |
|---|---|---|
| OpenAI GPT | AI chatbot assistance | Smart event planning suggestions |
| Google Maps | Location services | Event location mapping and discovery |
| Google Places | Venue discovery | Location search and autocomplete |
| Social sharing | Direct party invitations | |
| Social integration | Event sharing and promotion |
- Multi-provider Authentication: Email/password, Google Sign-In with Firebase Auth
- Secure Session Management: JWT tokens with automatic refresh
- Encrypted Local Storage: AndroidX Security Crypto for sensitive data
- Password Validation: Strong password policies with custom validator
- Biometric Authentication: Fingerprint and face unlock support (planned)
- Rich User Profiles: Comprehensive user information management
- Profile Image Upload: Optimized image compression and storage
- Privacy Controls: Granular privacy settings for user data
- Friend System: Add, remove, and manage social connections
- User Discovery: Browse and connect with other platform users
- Advanced Group Types: Public, private, and invite-only groups
- Role-based Permissions: Admin, moderator, and member roles
- Group Customization: Custom themes, images, and branding
- Membership Controls: Invitation management and member moderation
- Group Analytics: Engagement metrics and activity tracking
- Live Group Updates: Real-time member activities and notifications
- Smart Refresh Logic: Pull-to-refresh with intelligent caching
- Offline Group Access: Local caching with sync when online
- Conflict Resolution: Automatic handling of concurrent updates
- Rich Event Details: Date, time, location, description, and media
- Multi-date Events: Support for recurring and multi-day events
- Location Integration: Google Maps integration for venue selection
- Capacity Management: Attendee limits and waiting lists
- Event Templates: Pre-configured event types for quick setup
- Smart Invitations: Automated invitation management
- RSVP Tracking: Real-time attendance monitoring
- Reminder System: Automated event reminders and notifications
- Guest Management: Plus-one handling and dietary restrictions
- Group Chat: Instant messaging within event groups
- Message History: Persistent conversation storage with Room database
- Rich Media Support: Image, video, and file sharing
- Message Encryption: End-to-end encryption for sensitive communications
- Offline Messaging: Queue messages for delivery when online
- GPT Chatbot Integration: Intelligent event planning suggestions
- Natural Language Processing: Smart command interpretation
- Context-aware Responses: Personalized recommendations based on user history
- Multi-language Support: Localized AI responses (planned)
- Google Maps Integration: Full-featured mapping capabilities
- Venue Discovery: Google Places API for location search
- GPS Navigation: Direct navigation to event locations
- Location Sharing: Real-time location sharing for attendees
- Geofencing: Location-based notifications and check-ins
- Push Notifications: Real-time event updates and messages
- Email Notifications: Detailed event summaries and reminders
- SMS Integration: Critical event updates via text messaging
- In-app Notifications: Rich notification center with actions
- Smart Scheduling: Optimal notification timing based on user behavior
- Granular Controls: Per-event and per-category notification settings
- Do Not Disturb: Automatic quiet hours and user preferences
- Priority Notifications: Critical updates bypass user settings
- Notification Analytics: Delivery and engagement tracking
- Social Media Integration: Direct sharing to Facebook, Instagram, Twitter
- Messaging Apps: WhatsApp, Telegram, and SMS sharing
- Email Invitations: Rich HTML email templates
- Deep Linking: Direct app navigation from shared links
- QR Code Generation: Quick event access via QR codes
- Dynamic Content: Personalized sharing content based on recipient
- Rich Media Previews: Attractive link previews on social platforms
- Tracking Analytics: Share performance and conversion metrics
- A/B Testing: Optimized sharing content for better engagement
app/src/main/java/com/example/partymaker/
βββ π PartyApplication.java # Application entry point
βββ data/ # Data Layer
β βββ api/ # Network & API clients
β β βββ AppNetworkError.java # Custom error handling
β β βββ ConnectivityManager.java # Network connectivity
β β βββ FirebaseServerClient.java # Primary server client
β β βββ NetworkManager.java # Network state management
β β βββ NetworkUtils.java # Network utilities
β β βββ OpenAiApi.java # OpenAI integration
β β βββ Result.java # API result wrapper
β βββ firebase/ # Firebase integration
β β βββ DBRef.java # Firebase references
β β βββ FirebaseAccessManager.java # Direct Firebase access
β β βββ ServerDBRef.java # Server-mediated access
β βββ local/ # Local database (Room)
β β βββ AppDatabase.java # Room database
β β βββ ChatMessageDao.java # Message data access
β β βββ Converters.java # Type converters
β β βββ DatabaseMigrations.java # Schema migrations
β β βββ GroupDao.java # Group data access
β β βββ UserDao.java # User data access
β βββ model/ # Data models
β β βββ ChatMessage.java # Chat message model
β β βββ ChatMessageGpt.java # GPT message model
β β βββ Group.java # Group/party model
β β βββ User.java # User model
β βββ repository/ # Repository pattern
β βββ DataSource.java # Data source interface
β βββ GroupRepository.java # Group data repository
β βββ LocalGroupDataSource.java # Local data source
β βββ RemoteGroupDataSource.java # Remote data source
β βββ UserRepository.java # User data repository
βββ ui/ # Presentation Layer
β βββ adapters/ # RecyclerView adapters
β β βββ ChatAdapter.java # Chat message adapter
β β βββ ChatbotAdapter.java # Chatbot conversation
β β βββ GroupAdapter.java # Group list adapter
β β βββ InvitedAdapter.java # Invitation adapter
β β βββ OptimizedRecyclerAdapter.java # Performance-optimized adapter
β β βββ UserAdapter.java # User list adapter
β βββ features/ # Feature-based UI organization
β βββ auth/ # Authentication screens
β β βββ IntroActivity.java # App introduction
β β βββ LoginActivity.java # User login
β β βββ RegisterActivity.java # User registration
β β βββ ResetPasswordActivity.java # Password reset
β βββ auxiliary/ # Supporting features
β β βββ chatbot/
β β β βββ GptChatActivity.java # AI chat interface
β β βββ profile/
β β β βββ EditProfileActivity.java # Profile management
β β βββ security/
β β β βββ SecurityScanActivity.java # Security monitoring
β β βββ settings/
β β βββ ServerSettingsActivity.java # Server configuration
β βββ core/ # Core application screens
β β βββ MainActivity.java # Main dashboard
β β βββ SplashActivity.java # App startup
β βββ groups/ # Group management features
β βββ chat/
β β βββ ChatActivity.java # Group messaging
β βββ creation/
β β βββ CreateGroupActivity.java # Group creation
β βββ discovery/
β β βββ JoinGroupActivity.java # Join groups
β β βββ PublicGroupsActivity.java # Browse public groups
β βββ main/
β β βββ PartyMainActivity.java # Group main screen
β βββ management/ # Group administration
β β βββ AdminOptionsActivity.java # Admin tools
β β βββ AdminSettingsActivity.java # Admin settings
β β βββ ChangeDateActivity.java # Event date management
β βββ members/ # Member management
β βββ FriendsAddActivity.java # Add friends
β βββ FriendsRemoveActivity.java # Remove friends
β βββ MembersComingActivity.java # Attendee list
β βββ MembersInvitedActivity.java # Invitation list
β βββ UsersListActivity.java # User directory
βββ utils/ # Utility Classes
β βββ auth/ # Authentication utilities
β β βββ AuthenticationManager.java # Auth operations
β β βββ SecureAuthenticationManager.java # Enhanced security
β βββ business/ # Business logic utilities
β β βββ group/
β β β βββ GroupDataManager.java # Group data operations
β β β βββ GroupDateTimeManager.java # Date/time management
β β βββ sharing/
β β βββ ContentSharingManager.java # Content sharing logic
β βββ core/ # Core utilities
β β βββ AppConstants.java # Application constants
β β βββ ExtrasMetadata.java # Intent extras metadata
β β βββ IntentExtrasManager.java # Intent management
β βββ infrastructure/ # Infrastructure utilities
β β βββ async/
β β β βββ AsyncTaskReplacement.java # Async operations
β β βββ network/
β β β βββ NetworkErrorHandler.java # Network error handling
β β βββ permissions/
β β β βββ PermissionManager.java # Runtime permissions
β β βββ system/
β β βββ MemoryManager.java # Memory optimization
β β βββ ThreadUtils.java # Thread management
β βββ media/ # Media utilities
β β βββ FileManager.java # File operations
β β βββ GlideImageLoader.java # Image loading
β β βββ ImageCompressor.java # Image optimization
β βββ security/ # Security utilities
β β βββ core/
β β β βββ PasswordValidator.java # Password validation
β β β βββ SecureConfigManager.java # Secure configuration
β β β βββ SimpleSecureStorage.java # Encrypted storage
β β βββ encryption/
β β β βββ EncryptedSharedPreferencesManager.java
β β β βββ EnhancedSecureStorage.java
β β β βββ GroupKeyManager.java
β β β βββ GroupMessageEncryption.java
β β β βββ HybridMessageEncryption.java
β β β βββ MessageEncryptionManager.java
β β βββ monitoring/
β β β βββ SecurityAgent.java # Security monitoring
β β β βββ SecurityIssue.java # Security issue tracking
β β β βββ SecurityReport.java # Security reporting
β β βββ network/
β β βββ SSLPinningManager.java # SSL certificate pinning
β βββ server/
β β βββ ServerModeManager.java # Server configuration
β βββ ui/ # UI utilities
β βββ components/
β β βββ LoadingStateManager.java # Loading state management
β β βββ UiStateManager.java # UI state coordination
β βββ feedback/
β β βββ NotificationManager.java # Notification handling
β β βββ UserFeedbackManager.java # User feedback
β βββ maps/
β β βββ MapUtilitiesManager.java # Map utilities
β βββ navigation/
β βββ NavigationManager.java # Navigation coordination
βββ viewmodel/ # MVVM ViewModels
βββ BaseViewModel.java # Base ViewModel class
βββ auth/ # Authentication ViewModels
β βββ AuthViewModel.java # Authentication logic
β βββ IntroViewModel.java # Introduction flow
βββ core/ # Core ViewModels
β βββ MainActivityViewModel.java # Main screen logic
β βββ SplashViewModel.java # Splash screen logic
βββ features/ # Feature ViewModels
β βββ GptViewModel.java # AI chat logic
β βββ ProfileViewModel.java # Profile management
β βββ ServerSettingsViewModel.java # Settings logic
βββ groups/ # Group ViewModels
βββ GroupChatViewModel.java # Group chat logic
βββ GroupViewModel.java # Group management logic
app/server/src/main/java/com/example/partymaker/server/
βββ π PartyMakerServerApplication.java # Spring Boot application entry
βββ config/ # Configuration classes
β βββ FirebaseConfig.java # Firebase Admin SDK config
βββ controller/ # REST Controllers
β βββ FirebaseController.java # Firebase API endpoints
βββ service/ # Business Logic Services
βββ FirebaseService.java # Firebase operations service
PartyMaker/
βββ ποΈ build.gradle.kts # Root build configuration
βββ app/
β βββ build.gradle.kts # Android app build config
βββ app/server/
β βββ build.gradle # Spring Boot build config
βββ gradle/
β βββ libs.versions.toml # Centralized dependency versions
β βββ wrapper/ # Gradle wrapper
βββ settings.gradle.kts # Multi-module settings
βββ gradle.properties # Global Gradle properties
- Android Studio: Hedgehog (2023.1.1) or newer
- Java Development Kit: OpenJDK 11 or Oracle JDK 11+
- Android SDK: API 33+ (Android 13)
- Gradle: 8.9+ (via wrapper)
- Git: Latest version for source control
- Firebase Project: Complete Firebase project setup
- Google Cloud Platform: For Maps and Places APIs
- OpenAI Account: For GPT chatbot functionality
- Development Device: Android device or emulator (API 33+)
# Clone the repository
git clone https://github.com/Natifishman/PartyMaker.git
cd PartyMaker
# Verify repository structure
ls -la# Create Firebase configuration from template
cp google-services.json.template app/google-services.json
# Edit configuration with your Firebase project details
# Get from: Firebase Console > Project Settings > General
nano app/google-services.jsonFirebase Setup Checklist:
- β Create new Firebase project
- β Enable Authentication (Email/Password, Google Sign-In)
- β Enable Realtime Database with security rules
- β Enable Cloud Storage with appropriate permissions
- β Generate service account key for server
- β
Download
google-services.jsonfor Android
# Create secrets file from template
cp secrets.properties.template secrets.properties
# Add your API keys (never commit this file!)
cat >> secrets.properties << EOF
# Google Services
GOOGLE_MAPS_API_KEY=your_google_maps_api_key
PLACES_API_KEY=your_places_api_key
# OpenAI Integration
OPENAI_API_KEY=your_openai_api_key
# Firebase Server Key
FIREBASE_SERVER_KEY=your_firebase_server_key
EOF# Setup Firebase Admin SDK for server
cp firebase-service-account.json.template app/server/src/main/resources/firebase-service-account.json
# Edit with your Firebase service account credentials
# Get from: Firebase Console > Project Settings > Service Accounts
nano app/server/src/main/resources/firebase-service-account.json# Clean and build debug APK
./gradlew clean assembleDebug
# Install on connected device/emulator
./gradlew installDebug
# Alternative: Build without tests (faster)
./gradlew buildWithoutTests
# Format code before commits
./gradlew spotlessApply# Navigate to server directory
cd app/server
# Run server in development mode
./gradlew bootRun
# Build production JAR
./gradlew bootJar
# Run tests
./gradlew test# Terminal 1: Start Spring Boot server
cd app/server && ./gradlew bootRun
# Terminal 2: Run Android app
# Open Android Studio and run on device/emulator
# Or use command line:
./gradlew installDebug && adb shell am start -n com.example.partymaker/.ui.features.core.SplashActivity| Variable Name | Description | Required | Source |
|---|---|---|---|
GOOGLE_MAPS_API_KEY |
Google Maps integration | Yes | Google Cloud Console |
PLACES_API_KEY |
Google Places API | Yes | Google Cloud Console |
OPENAI_API_KEY |
OpenAI GPT integration | Yes | OpenAI Platform |
FIREBASE_SERVER_KEY |
Firebase server key | Yes | Firebase Console |
SERVER_URL |
Custom server URL | No | Development override |
// Realtime Database Rules
{
"rules": {
"Users": {
"$uid": {
".read": "$uid === auth.uid || root.child('Groups').child($uid).child('members').child(auth.uid).exists()",
".write": "$uid === auth.uid"
}
},
"Groups": {
"$groupId": {
".read": "data.child('members').child(auth.uid).exists() || data.child('isPublic').val() === true",
".write": "data.child('adminKey').val() === auth.uid || !data.exists()"
}
},
"GroupsMessages": {
"$groupId": {
".read": "root.child('Groups').child($groupId).child('members').child(auth.uid).exists()",
".write": "root.child('Groups').child($groupId).child('members').child(auth.uid).exists()"
}
}
}
}// Primary server communication client
FirebaseServerClient client = FirebaseServerClient.getInstance();
// User operations
client.createUser(user, callback);
client.updateUser(userKey, updates, callback);
client.deleteUser(userKey, callback);
// Group operations
client.createGroup(group, callback);
client.getGroups(userEmail, callback);
client.updateGroup(groupKey, updates, callback);
client.deleteGroup(groupKey, callback);
// Message operations
client.sendMessage(groupKey, message, callback);
client.getMessages(groupKey, callback);// Group Repository - Handles both local and remote data
GroupRepository repository = GroupRepository.getInstance();
repository.initialize(context);
// Get groups with caching
repository.getGroups(userEmail, forceRefresh, new Repository.Callback<List<Group>>() {
@Override
public void onSuccess(List<Group> groups) {
// Handle successful data retrieval
}
@Override
public void onError(Exception error) {
// Handle error scenarios
}
});
// Create new group
repository.createGroup(group, callback);- Production:
https://partymaker.onrender.com - Development:
http://localhost:8080 - Android Emulator:
http://10.0.2.2:8080
All API endpoints require proper Firebase authentication tokens.
Authorization: Bearer <firebase_id_token>
Content-Type: application/jsonGET /api/firebase/Users # Get all users
GET /api/firebase/Users/{userKey} # Get specific user
POST /api/firebase/Users # Create new user
PUT /api/firebase/Users/{userKey} # Update user
DELETE /api/firebase/Users/{userKey} # Delete userGET /api/firebase/Groups # Get all groups
GET /api/firebase/Groups/{groupKey} # Get specific group
POST /api/firebase/Groups # Create new group
PUT /api/firebase/Groups/{groupKey} # Update group
DELETE /api/firebase/Groups/{groupKey} # Delete groupGET /api/firebase/GroupsMessages # Get all messages
GET /api/firebase/GroupsMessages/{groupKey}# Get group messages
POST /api/firebase/GroupsMessages # Send message
PUT /api/firebase/GroupsMessages/{messageKey} # Update message
DELETE /api/firebase/GroupsMessages/{messageKey} # Delete messageGET /api/firebase/data/{path} # Get data from path
POST /api/firebase/data/{path} # Create data at path
PUT /api/firebase/data/{path} # Update data at path
DELETE /api/firebase/data/{path} # Delete data at pathPOST /api/firebase/Groups
{
"groupName": "Summer Pool Party",
"groupLocation": "123 Main St, City, State",
"adminKey": "user123",
"groupDays": "15",
"groupMonths": "July",
"groupYears": "2024",
"groupHours": "14:00",
"groupMinutes": "00",
"isPublic": true,
"maxMembers": 50,
"description": "Join us for an amazing summer pool party!"
}{
"success": true,
"message": "Group created successfully",
"data": {
"groupKey": "group_abc123",
"groupName": "Summer Pool Party",
"createdAt": "2024-07-01T10:00:00Z",
"adminKey": "user123",
"memberCount": 1
}
}{
"success": false,
"message": "Invalid request data",
"error": {
"code": "VALIDATION_ERROR",
"details": [
{
"field": "groupName",
"message": "Group name is required"
}
]
},
"timestamp": "2024-07-01T10:00:00Z"
}{
"Users": {
"user_unique_key": {
"username": "string",
"email": "string",
"userKey": "string",
"fullName": "string",
"phoneNumber": "string",
"profileImageUrl": "string",
"createdAt": "timestamp",
"lastActive": "timestamp",
"friends": {
"friend_key_1": true,
"friend_key_2": true
},
"settings": {
"notifications": "boolean",
"privacy": "string"
}
}
},
"Groups": {
"group_unique_key": {
"groupName": "string",
"groupKey": "string",
"groupLocation": "string",
"adminKey": "string",
"createdAt": "timestamp",
"groupDays": "string",
"groupMonths": "string",
"groupYears": "string",
"groupHours": "string",
"groupMinutes": "string",
"isPublic": "boolean",
"maxMembers": "number",
"description": "string",
"groupImageUrl": "string",
"members": {
"member_key_1": {
"joinedAt": "timestamp",
"role": "admin|member",
"status": "confirmed|pending|declined"
}
},
"invitations": {
"invitation_key_1": {
"invitedBy": "string",
"invitedAt": "timestamp",
"status": "pending|accepted|declined"
}
},
"settings": {
"allowInvites": "boolean",
"requireApproval": "boolean",
"chatEnabled": "boolean"
}
}
},
"GroupsMessages": {
"group_key": {
"message_unique_key": {
"messageText": "string",
"senderKey": "string",
"senderName": "string",
"timestamp": "timestamp",
"messageType": "text|image|system",
"imageUrl": "string",
"edited": "boolean",
"editedAt": "timestamp",
"reactions": {
"user_key": "emoji"
}
}
}
},
"Notifications": {
"user_key": {
"notification_key": {
"title": "string",
"message": "string",
"type": "group_invite|message|event_reminder",
"timestamp": "timestamp",
"read": "boolean",
"actionData": "object"
}
}
}
}CREATE TABLE users (
userKey TEXT PRIMARY KEY NOT NULL,
username TEXT,
email TEXT,
fullName TEXT,
phoneNumber TEXT,
profileImageUrl TEXT,
createdAt TEXT,
lastSynced INTEGER
);CREATE TABLE groups (
groupKey TEXT PRIMARY KEY NOT NULL,
group_name TEXT,
group_location TEXT,
admin_key TEXT,
created_at TEXT,
group_days TEXT,
group_months TEXT,
group_years TEXT,
group_hours TEXT,
group_minutes TEXT,
is_public INTEGER,
max_members INTEGER,
description TEXT,
group_image_url TEXT,
member_count INTEGER,
last_synced INTEGER
);CREATE TABLE chat_messages (
messageKey TEXT PRIMARY KEY NOT NULL,
groupKey TEXT NOT NULL,
messageText TEXT,
senderKey TEXT,
senderName TEXT,
timestamp INTEGER,
messageType TEXT,
imageUrl TEXT,
edited INTEGER DEFAULT 0,
editedAt INTEGER,
localOnly INTEGER DEFAULT 0,
FOREIGN KEY(groupKey) REFERENCES groups(groupKey)
);PartyMaker implements a comprehensive testing strategy with multiple layers:
# Run Android unit tests
./gradlew test
# Run server unit tests
cd app/server && ./gradlew test
# Generate test coverage report
./gradlew jacocoTestReport# Run Android instrumented tests
./gradlew connectedAndroidTest
# Run server integration tests
cd app/server && ./gradlew integrationTest@RunWith(AndroidJUnit4.class)
public class MainActivityTest {
@Rule
public ActivityTestRule<MainActivity> activityRule =
new ActivityTestRule<>(MainActivity.class);
@Test
public void testGroupListDisplay() {
onView(withId(R.id.recyclerViewGroups))
.check(matches(isDisplayed()));
}
}@Test
public void testCreateGroup() {
Group testGroup = new Group();
testGroup.setGroupName("Test Party");
FirebaseServerClient.getInstance().createGroup(testGroup, new Callback<Group>() {
@Override
public void onSuccess(Group result) {
assertNotNull(result.getGroupKey());
assertEquals("Test Party", result.getGroupName());
}
});
}dependencies {
// Unit Testing
testImplementation 'junit:junit:4.13.2'
testImplementation 'org.mockito:mockito-core:4.11.0'
testImplementation 'androidx.arch.core:core-testing:2.2.0'
// Android Testing
androidTestImplementation 'androidx.test.ext:junit:1.1.5'
androidTestImplementation 'androidx.test.espresso:espresso-core:3.5.1'
androidTestImplementation 'androidx.test:runner:1.5.2'
androidTestImplementation 'androidx.test:rules:1.5.0'
// Server Testing
testImplementation 'org.springframework.boot:spring-boot-starter-test'
testImplementation 'org.testcontainers:junit-jupiter'
}PartyMaker implements enterprise-grade security across all layers:
- Firebase Authentication: Secure user identity management
- JWT Tokens: Stateless authentication with automatic refresh
- Role-based Access Control: Admin, member, and guest permissions
- Session Management: Secure session handling with timeout
- End-to-End Encryption: Message encryption for sensitive communications
- Local Storage Encryption: AndroidX Security Crypto for local data
- API Communication: HTTPS/TLS 1.3 for all network communication
- Database Encryption: Firebase security rules and encryption at rest
// Server-side validation example
@RestController
@Validated
public class FirebaseController {
@PostMapping("/Groups")
public ResponseEntity<Map<String, Object>> createGroup(
@Valid @RequestBody Group group) {
// Validation annotations ensure data integrity
return firebaseService.createGroup(group);
}
}// Security monitoring implementation
public class SecurityAgent {
public void reportSecurityEvent(SecurityIssue issue) {
SecurityReport report = new SecurityReport();
report.setIssueType(issue.getType());
report.setSeverity(issue.getSeverity());
report.setTimestamp(System.currentTimeMillis());
// Log and potentially alert on security events
logSecurityEvent(report);
}
}- Input Validation: All inputs validated and sanitized
- Rate Limiting: API rate limiting to prevent abuse
- CORS Configuration: Proper CORS settings for web security
- Error Handling: No sensitive information in error responses
- Certificate Pinning: SSL certificate pinning for API calls
- Root Detection: Protection against rooted/jailbroken devices
- Code Obfuscation: Release builds use ProGuard/R8 obfuscation
- Debug Detection: Runtime detection of debugging attempts
android {
buildTypes {
release {
isMinifyEnabled = true
isShrinkResources = true
proguardFiles(
getDefaultProguardFile("proguard-android-optimize.txt"),
"proguard-rules.pro"
)
signingConfig = signingConfigs.getByName("release")
}
}
signingConfigs {
create("release") {
storeFile = file("keystore/release.keystore")
storePassword = System.getenv("KEYSTORE_PASSWORD")
keyAlias = System.getenv("KEY_ALIAS")
keyPassword = System.getenv("KEY_PASSWORD")
}
}
}# Generate signed APK
./gradlew assembleRelease
# Generate Android App Bundle (recommended for Play Store)
./gradlew bundleRelease
# Verify signatures
jarsigner -verify -verbose -certs app/build/outputs/apk/release/app-release.apk- Create Play Console account and app listing
- Upload signed AAB file
- Configure store listing with screenshots and descriptions
- Set up release management and testing tracks
- Publish to production
cd app/server
./gradlew clean bootJar
# JAR file created at: build/libs/partymaker-server-0.0.1-SNAPSHOT.jar# Dockerfile for server deployment
FROM openjdk:11-jre-slim
COPY build/libs/partymaker-server-*.jar app.jar
EXPOSE 8080
ENTRYPOINT ["java", "-jar", "/app.jar"]# Build and run Docker container
docker build -t partymaker-server .
docker run -p 8080:8080 -e SPRING_PROFILES_ACTIVE=production partymaker-server# render.yaml
services:
- type: web
name: partymaker-server
env: java
buildCommand: cd app/server && ./gradlew bootJar
startCommand: java -jar build/libs/partymaker-server-*.jar
envVars:
- key: SPRING_PROFILES_ACTIVE
value: production
- key: FIREBASE_CONFIG
fromFile: firebase-service-account.json# Install EB CLI
pip install awsebcli
# Initialize and deploy
eb init partymaker-server
eb create production
eb deploy# Deploy to Cloud Run
gcloud run deploy partymaker-server \
--image gcr.io/PROJECT_ID/partymaker-server \
--platform managed \
--region us-central1 \
--allow-unauthenticated# Server configuration
SPRING_PROFILES_ACTIVE=production
SERVER_PORT=8080
# Firebase configuration
GOOGLE_APPLICATION_CREDENTIALS=/path/to/firebase-service-account.json
# Database configuration
FIREBASE_DATABASE_URL=https://your-project.firebaseio.com
# Security configuration
JWT_SECRET=your-jwt-secret
CORS_ALLOWED_ORIGINS=https://your-domain.com
# Monitoring
LOGGING_LEVEL_ROOT=INFO
MANAGEMENT_ENDPOINTS_WEB_EXPOSURE_INCLUDE=health,info// Custom memory manager for low-memory scenarios
public class MemoryManager {
public static void performMemoryCleanup(Context context) {
// Clear image caches
Glide.get(context).clearMemory();
// Clear temporary files
FileManager.clearTemporaryFiles(context);
// Force garbage collection
System.gc();
}
public static String getDetailedMemoryInfo() {
Runtime runtime = Runtime.getRuntime();
long totalMemory = runtime.totalMemory();
long freeMemory = runtime.freeMemory();
long usedMemory = totalMemory - freeMemory;
return String.format("Memory: %d MB used, %d MB free",
usedMemory / 1024 / 1024, freeMemory / 1024 / 1024);
}
}// Optimized Glide configuration
public class GlideImageLoader {
public static void loadGroupImage(ImageView imageView, String imageUrl) {
Glide.with(imageView.getContext())
.load(imageUrl)
.timeout(5000) // 5-second timeout
.placeholder(R.drawable.default_group_image)
.error(R.drawable.default_group_image)
.diskCacheStrategy(DiskCacheStrategy.AUTOMATIC)
.into(imageView);
}
}// Custom thread utilities for optimal performance
public class ThreadUtils {
private static final ExecutorService BACKGROUND_EXECUTOR =
Executors.newFixedThreadPool(4);
public static void runOnBackground(Runnable task) {
BACKGROUND_EXECUTOR.execute(task);
}
public static void runOnUiThread(Activity activity, Runnable task) {
activity.runOnUiThread(task);
}
}# application.yml - Production configuration
spring:
datasource:
hikari:
maximum-pool-size: 20
minimum-idle: 5
connection-timeout: 30000
idle-timeout: 600000
max-lifetime: 1800000@Service
@EnableCaching
public class FirebaseService {
@Cacheable(value = "groups", key = "#userEmail")
public List<Group> getUserGroups(String userEmail) {
// Cached for better performance
return firebaseOperations.getUserGroups(userEmail);
}
}- App Startup Time: < 2 seconds cold start
- Screen Navigation: < 300ms transition time
- API Response Time: < 1 second average
- Image Loading: < 2 seconds for cached images
- Memory Usage: < 200MB average RAM usage
- Battery Usage: Optimized for minimal battery drain
// Firebase Crashlytics integration
public class CrashReportingManager {
public static void logCrash(Exception exception) {
FirebaseCrashlytics.getInstance().recordException(exception);
}
public static void setUserIdentifier(String userId) {
FirebaseCrashlytics.getInstance().setUserId(userId);
}
}// Custom performance tracking
public class PerformanceTracker {
public static void trackScreenLoad(String screenName, long loadTime) {
Map<String, Object> eventData = new HashMap<>();
eventData.put("screen_name", screenName);
eventData.put("load_time_ms", loadTime);
FirebaseAnalytics.getInstance(context)
.logEvent("screen_load_time", eventData);
}
}- Daily Active Users (DAU)
- Monthly Active Users (MAU)
- Session Duration
- Screen Flow Analysis
- Feature Usage Statistics
- Event Creation Rate
- Invitation Response Rate
- Group Participation Metrics
- Chat Activity Levels
- Location Usage Patterns
// Follow Java naming conventions and documentation standards
/**
* Manages group data operations with local and remote data sources.
*
* <p>This repository provides a unified interface for group data access,
* implementing smart caching and offline support capabilities.
*
* @author PartyMaker Team
* @version 1.0
* @since 1.0
*/
public class GroupRepository {
private static final String TAG = "GroupRepository";
/**
* Retrieves groups for the specified user with optional cache refresh.
*
* @param userEmail the user's email address
* @param forceRefresh whether to bypass cache and fetch fresh data
* @param callback callback for handling success/error responses
*/
public void getGroups(String userEmail, boolean forceRefresh,
Repository.Callback<List<Group>> callback) {
// Implementation
}
}# Create feature branch
git checkout -b feature/user-profile-enhancement
# Make commits with conventional commit format
git commit -m "feat: add user profile image upload functionality"
git commit -m "fix: resolve image compression memory leak"
git commit -m "docs: update API documentation for profile endpoints"
# Push and create pull request
git push origin feature/user-profile-enhancement## π― Purpose
Brief description of the changes and their purpose.
## π Changes Made
- [ ] New feature implementation
- [ ] Bug fix
- [ ] Documentation update
- [ ] Performance improvement
- [ ] Refactoring
## π§ͺ Testing
- [ ] Unit tests added/updated
- [ ] Integration tests pass
- [ ] Manual testing completed
- [ ] Performance impact assessed
## πΈ Screenshots
Include screenshots for UI changes.
## π Additional Notes
Any additional context or considerations.- Code implements requirements correctly
- Edge cases are handled appropriately
- Error handling is comprehensive
- Performance implications are considered
- Code follows established patterns and conventions
- Methods are appropriately sized and focused
- Documentation is clear and comprehensive
- No code duplication or unnecessary complexity
- No sensitive data is logged or exposed
- Input validation is properly implemented
- Authentication and authorization are correct
- No security vulnerabilities introduced
MIT License
Copyright (c) 2024 PartyMaker Team
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
- Android SDK: Apache License 2.0
- Spring Boot: Apache License 2.0
- Firebase SDK: Apache License 2.0
- OkHttp: Apache License 2.0
- Glide: BSD License
- Room Database: Apache License 2.0
- Google Maps API: Google APIs Terms of Service
- OpenAI API: OpenAI Terms of Use
- Firebase Services: Google Cloud Terms of Service
- Search existing issues first to avoid duplicates
- Use the bug report template with detailed information
- Include steps to reproduce the issue
- Provide relevant logs and error messages
- Specify environment details (Android version, device, etc.)
- Check existing feature requests to avoid duplicates
- Provide detailed use cases and business justification
- Include mockups or wireframes if applicable
- Consider implementation complexity and technical feasibility
- Stack Overflow: Tag questions with
partymaker-app - GitHub Discussions: For general questions and community discussion
- Discord Community: Real-time chat with other developers (coming soon)
- Wiki: Comprehensive guides and tutorials
- API Documentation: Complete API reference
- Architecture Guide: Deep dive into system design
- Best Practices: Development guidelines and patterns
- Getting Started Tutorial: Step-by-step setup guide
- Architecture Overview: System design explanation
- Feature Demos: Showcasing key capabilities
- Developer Interviews: Behind-the-scenes insights
- Firebase Team: For robust backend-as-a-service platform
- Google Maps Team: For comprehensive location services
- OpenAI Team: For powerful AI integration capabilities
- Spring Boot Community: For excellent web framework
- Android Developer Community: For continuous innovation
- Open Source Contributors: For invaluable third-party libraries
Contributors who have made significant impacts on the project will be recognized here.
Current Version: 1.0.0
Status: Active Development
Last Updated: August 2025
π PartyMaker - Where Every Event Becomes a Celebration! π
Built with β€οΈ by the PartyMaker Team
Bringing people together through the power of technology and social connection