Skip to content

Repository files navigation

MyMuseum

MyMuseum is a Kotlin Android image-posting prototype built with Firebase Authentication, Cloud Firestore, and Firebase Storage. It demonstrates a compact authenticated flow for publishing images, viewing a shared feed, and filtering the signed-in user's posts.

This is an academic learning project rather than a production social platform. Its current implementation is intentionally small and Activity-based.

Project status

  • The repository was cleaned and its debug build was verified on July 29, 2026.
  • The verified toolchain is JDK 17, Gradle 8.2, Android Gradle Plugin 8.2.0, and Android SDK 34.
  • A Firebase project configured for the application ID com.kaanbalci.mymuseum is required to run authenticated and data-backed flows.
  • Firestore and Storage security rules are not included, so production-grade backend security is not claimed.

Project overview

The project name remains MyMuseum, while the current implementation functions as a generic Firebase-backed image-posting prototype:

  1. Create an account or sign in.
  2. Select an image from the device.
  3. Add an optional caption.
  4. Upload the image to Firebase Storage.
  5. Save its URL, owner email, caption, and timestamp in Cloud Firestore.
  6. Display post records in a RecyclerView feed.

Verified features

  • Email and password account creation and sign-in
  • Session-aware routing for an already authenticated user
  • Sign-out with the authenticated task stack cleared
  • Device image selection
  • Image upload to Firebase Storage
  • Post creation in Cloud Firestore
  • A shared feed updated through a Firestore snapshot listener
  • Feed ordering by newest timestamp first
  • A profile view filtered to the signed-in user's posts
  • View Binding, RecyclerView, and Picasso-based image loading

Application flow

Screen Responsibility
MainActivity Creates accounts, signs users in, and forwards an existing session to the feed.
AkisActivity Displays the shared, newest-first post feed and exposes upload, profile, and sign-out actions.
YuklemeActivity Selects an image, uploads it, resolves its download URL, and saves the post document.
ProfilActivity Displays post documents whose userEmail matches the current authenticated user.

Implementation

The app uses a direct Activity-based structure. Activities own their View Binding instances and call Firebase services directly; there is no separate ViewModel or repository layer.

Technology stack

  • Kotlin 1.9.10
  • Android SDK 34, minimum SDK 24
  • Android Gradle Plugin 8.2.0
  • Gradle 8.2
  • AndroidX, Material Components, ConstraintLayout, RecyclerView
  • Firebase Authentication
  • Cloud Firestore
  • Firebase Storage
  • Picasso 2.8

Firebase data model

Post documents are stored in the Posts collection.

Field Type Use
downloadUrl String Public download URL returned after the image upload
userEmail String Email of the authenticated post owner
comment String Legacy field name used for the post caption
date Timestamp Timestamp created by the app when the post is saved

Images are uploaded under images/{UUID}.jpg. The shared feed orders Posts by date descending, while the profile screen filters the collection by userEmail.

Screenshot

The screenshot below was captured from a locally built debug APK on an Android emulator. No personal account or backend content was used.

MyMuseum sign-in screen

Repository structure

.
├── app/
│   └── src/main/
│       ├── java/com/kaanbalci/mymuseum/
│       │   ├── adapter/
│       │   ├── model/
│       │   └── view/
│       └── res/
├── docs/screenshots/
├── gradle/wrapper/
├── build.gradle.kts
├── settings.gradle.kts
└── gradlew / gradlew.bat

Firebase setup

  1. Create or select a Firebase project that you control.
  2. Register an Android app with the package name com.kaanbalci.mymuseum.
  3. Enable Email/Password under Firebase Authentication.
  4. Create Cloud Firestore and Firebase Storage for the project.
  5. Define restrictive development rules for the authenticated flows. Do not leave open test rules enabled.
  6. Download the project's google-services.json and place it at app/google-services.json.

google-services.json is ignored by Git and is not included in the current repository tree. An earlier project configuration was removed from the current tree; if it remains active, its API access should be reviewed and restricted in the owning Firebase or Google Cloud project.

Build locally

Prerequisites:

  • JDK 17
  • Android Studio or an Android SDK installation with SDK 34
  • A valid project-specific app/google-services.json

On Windows PowerShell:

git clone https://github.com/UAJOP/MyMuseum.git
Set-Location MyMuseum
.\gradlew.bat tasks
.\gradlew.bat assembleDebug

On macOS or Linux:

git clone https://github.com/UAJOP/MyMuseum.git
cd MyMuseum
./gradlew tasks
./gradlew assembleDebug

The debug APK is generated under app/build/outputs/apk/debug/.

Known limitations

  • Firebase rules are not versioned in this repository and were not available for security validation.
  • The profile screen is a current-user post filter, not a complete editable profile system.
  • The project does not implement reactions, threaded discussions, post editing, post deletion, or pagination.
  • Feed updates are real-time, but the app does not implement a dedicated offline-first data layer.
  • Firebase calls and UI state are managed directly by Activities.
  • The repository does not include an automated test suite or a release-store configuration.
  • Authenticated backend flows require the developer's own Firebase configuration and test account.

Portfolio and contact

Releases

Packages

Contributors

Languages