Sitemap
Ankit Ahuja

Ankit Ahuja

Techie. Always learning ....

Modernizing an Android App After Years: A Complete Technical Overhaul

5 min readDec 28, 2025

--

Press enter or click to view image in full size

Bringing Stereogram Fun Back to Life

After years of no updates, I recently completed a comprehensive modernization of Stereogram Fun — an Android app that helps users discover hidden 3D images in stereograms through an interactive quiz experience. This article details the technical journey, architectural decisions, and key improvements made during this major update.

Press enter or click to view image in full size
Press enter or click to view image in full size
Press enter or click to view image in full size
Press enter or click to view image in full size
Press enter or click to view image in full size
Press enter or click to view image in full size

The Challenge

The app had been dormant for years, running on outdated Android APIs and using legacy patterns. The goal was to:

  • Modernize the tech stack
  • Improve user experience
  • Ensure maintainability for future updates
  • Add modern Android features

Technical Modernization

1. UI Framework Migration: Jetpack Compose

Before: Traditional View-based UI with XML layouts
After: Jetpack Compose with Material 3

Get Ankit Ahuja’s stories in your inbox

Join Medium for free to get updates from this writer.

The entire UI was rewritten using Jetpack Compose, providing:

  • Declarative UI: More intuitive and maintainable code
  • Material 3 Design: Modern, adaptive design system
  • Better Performance: Compose’s efficient recomposition
  • Type Safety: Compile-time UI validation
@Composable
fun HomeScreen(
onNavigateToGallery: () -> Unit,
onNavigateToQuiz: () -> Unit,
viewModel: HomeViewModel = hiltViewModel()
) {
val uiState by viewModel.uiState.collectAsState()
// Modern Compose UI implementation
}

2. Dependency Injection: Hilt Integration

Replaced manual dependency management with Hilt (Dagger):

  • Automatic DI: Reduces boilerplate code
  • Scoped Components: Proper lifecycle-aware dependencies
  • Testing: Easier to mock dependencies for unit tests

3. Modern Data Persistence: DataStore

Migrated from SharedPreferences to DataStore Preferences:

  • Type Safety: Kotlin coroutines and Flow support
  • Async Operations: Non-blocking data access
  • Error Handling: Better exception handling
  • Migration Support: Seamless migration from old preferences

4. Architecture: Clean Architecture + MVVM

Implemented a clean, maintainable architecture:

app/
├── data/ # Data layer (repositories, data sources)
├── domain/ # Business logic (models, use cases)
└── ui/ # Presentation layer (Compose screens, ViewModels)

Key Benefits:

  • Separation of concerns
  • Testability
  • Scalability
  • Maintainability

New Features Implemented

Play Store In-App Updates

Implemented Google Play’s In-App Updates API with support for both:

  • Immediate Updates: Force updates for critical fixes
  • Flexible Updates: Background downloads for optional updates
const val MINIMUM_REQUIRED_VERSION_CODE = 1  // Force update threshold
// Update checking logic
val isForceUpdate = availableVersionCode >= MINIMUM_REQUIRED_VERSION_CODE

Implementation Details:

  • Automatic update checking on app start
  • Update banners for flexible updates
  • Blocking dialogs for force updates
  • Legacy version support

Comprehensive Analytics

Integrated Firebase Analytics with 20+ tracked events:

  • Screen views
  • Quiz events (start, complete, answers)
  • Coin transactions
  • Ad interactions
  • Purchase events
  • Navigation patterns

This provides valuable insights into user behavior and app performance.

Smart Notification System

Built a notification scheduler that:

  • Tracks last app usage time
  • Schedules re-engagement notifications
  • Respects user privacy preferences
  • Supports GDPR compliance

Privacy & Compliance

Added GDPR-compliant features:

  • Analytics opt-out
  • Personalized ads opt-out
  • Transparent privacy controls
  • User preference management

Tech Stack Summary

+---------------+-----------------+----------------+
| Component | Technology | Version |
+---------------+-----------------+----------------+
| Language | Kotlin | 2.1.0 |
+---------------+-----------------+----------------+
| UI Framework | Jetpack Compose | BOM 2024.12.01 |
+---------------+-----------------+----------------+
| DI | Hilt | 2.53.1 |
+---------------+-----------------+----------------+
| Backend | Firebase BOM | 33.7.0 |
+---------------+-----------------+----------------+
| Image Loading | Coil | 2.7.0 |
+---------------+-----------------+----------------+
| Billing | Play Billing | 7.1.1 |
+---------------+-----------------+----------------+
| Build System | Gradle | 8.13.2 |
+---------------+-----------------+----------------+
| Target SDK | Android | 36 |
+---------------+-----------------+----------------+

Key Improvements

Performance

  • Faster app startup
  • Smooth 60fps animations
  • Efficient image loading with Coil
  • Optimized memory usage

User Experience

  • Modern Material 3 design
  • Smooth navigation transitions
  • Better error handling
  • Improved accessibility

Developer Experience

  • Clean, maintainable codebase
  • Comprehensive documentation
  • Easy to add new features
  • Better testing infrastructure

Challenges & Solutions

Challenge 1: Legacy Data Migration

Solution: Created migration utilities to seamlessly move data from SharedPreferences to DataStore while maintaining backward compatibility.

Challenge 2: Update Mechanism

Solution: Implemented flexible update system that supports both force and optional updates, with proper version code management.

Challenge 3: State Management

Solution: Used Compose State and ViewModel to manage complex UI state, ensuring proper lifecycle handling.

Results

  • Version: 8.2.1 (Version Code 65)
  • Target SDK: 36 (Latest)
  • Code Quality: Significantly improved with modern patterns
  • Maintainability: Much easier to extend and modify
  • User Experience: Modern, smooth, and responsive

Demo Video

See the app in action: https://youtube.com/shorts/oxKeto_RoHA

Download the App

Try Stereogram Fun on Google Play: https://play.google.com/store/apps/details?id=aexyn.stereogramviewer

Lessons Learned

  1. Modernization is Worth It: The investment in modernizing pays off in maintainability and user experience
  2. Incremental Migration: Breaking changes into smaller pieces makes the process manageable
  3. Documentation Matters: Good documentation helps future maintenance
  4. User Privacy First: GDPR compliance should be built-in from the start

What’s Next?

The app is now on a solid foundation for future enhancements:

  • Additional quiz modes
  • Social features
  • Cloud sync
  • Enhanced analytics
  • Performance optimizations

Conclusion

Modernizing an app after years of inactivity is challenging but rewarding. By leveraging modern Android development practices, we’ve created a maintainable, scalable, and user-friendly application. The technical debt has been significantly reduced, and the app is ready for future growth.

--

--

Ankit Ahuja

Written by Ankit Ahuja

Techie. Always learning ....