🎂 GeburtstagskanalApp — Android Birthday Video Browser

Android-App zum Durchsuchen und Abspielen personalisierter Geburtstagswünsche mit integriertem YouTube-Player.

KotlinAndroidRoom DBYouTube PlayerMVVM

🚀 Ihr Projekt. Maßgeschneidert. In Tagen, nicht Wochen.

📞 02406 803 7603 ✉️ info@computerkumpel.de

✨ Hauptfunktionen

🔍
Live-Namenssuche
TextWatcher-basierte Echtzeit-Suche durch alle Geburtstagsvideos. Sofortige Filterung während der Eingabe.
📺
YouTube-Integration
Direktes Abspielen von Geburtstagsvideos über die Android YouTube Player Library. Vollbild-Player mit nahtloser Integration.
💾
Room Database
Lokale SQLite-Datenbank mit Room ORM für offline-fähige Video-Listen. DAO-Pattern für typsichere Queries.
🏗️
MVVM-Architektur
Saubere Trennung von UI (Activity/Fragment), ViewModel und Daten (Room/Repository). LiveData für reaktive UI-Updates.

💻 Quellcode-Einblicke

Echte Code-Snippets aus dem Projekt-Repository — direkt aus der Entwicklungsumgebung.

Kotlin MainActivity — Echtzeitsuche mit ViewModel

package com.geburtstag.kanalapp

import android.os.Bundle
import android.text.Editable
import android.text.TextWatcher
import android.widget.EditText
import androidx.appcompat.app.AppCompatActivity
import androidx.lifecycle.ViewModelProvider
import androidx.recyclerview.widget.RecyclerView
import com.geburtstag.kanalapp.adapter.BirthdayVideoAdapter
import com.geburtstag.kanalapp.viewmodel.BirthdayVideoViewModel

class MainActivity : AppCompatActivity() {
    
    private lateinit var viewModel: BirthdayVideoViewModel
    private lateinit var adapter: BirthdayVideoAdapter

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        viewModel = ViewModelProvider(this)[BirthdayVideoViewModel::class.java]
        
        adapter = BirthdayVideoAdapter { video -> onVideoClick(video) }
        recyclerView.adapter = adapter

        // LiveData Observation
        viewModel.videos.observe(this) { videos ->
            adapter.submitList(videos)
            emptyTextView.visibility = 
                if (videos.isEmpty()) View.VISIBLE else View.GONE
        }

        // Echtzeit-Suche via TextWatcher
        searchEditText.addTextChangedListener(object : TextWatcher {
            override fun onTextChanged(s: CharSequence?, start: Int, before: Int, count: Int) {
                viewModel.searchVideos(s.toString())
            }
            override fun beforeTextChanged(s: CharSequence?, start: Int, count: Int, after: Int) {}
            override fun afterTextChanged(s: Editable?) {}
        })
    }

    private fun onVideoClick(video: BirthdayVideo) {
        val intent = Intent(this, VideoPlayerActivity::class.java).apply {
            putExtra("VIDEO_ID", video.id)
            putExtra("VIDEO_URL", video.youtubeUrl)
        }
        startActivity(intent)
    }
}

Kotlin Room Database — Data Layer

package com.geburtstag.kanalapp.data

import androidx.room.*

@Entity(tableName = "birthday_videos")
data class BirthdayVideo(
    @PrimaryKey val id: String,
    val name: String,
    val youtubeUrl: String,
    val thumbnailUrl: String,
    val duration: Int
)

@Dao
interface BirthdayVideoDao {
    @Query("SELECT * FROM birthday_videos WHERE name LIKE :query")
    fun searchByName(query: String): List<BirthdayVideo>
    
    @Insert(onConflict = OnConflictStrategy.REPLACE)
    suspend fun insertAll(videos: List<BirthdayVideo>)
}

@Database(entities = [BirthdayVideo::class], version = 1)
abstract class BirthdayVideoDatabase : RoomDatabase() {
    abstract fun birthdayVideoDao(): BirthdayVideoDao
}

Kotlin Gradle Build — Dependencies & Config

plugins {
    id("com.android.application")
    id("org.jetbrains.kotlin.android")
    id("com.google.devtools.ksp")
}

android {
    namespace = "com.geburtstag.kanalapp"
    compileSdk = 34
    
    defaultConfig {
        applicationId = "com.geburtstag.kanalapp"
        minSdk = 24
        targetSdk = 34
    }
    
    compileOptions {
        sourceCompatibility = JavaVersion.VERSION_17
        targetCompatibility = JavaVersion.VERSION_17
    }
}

dependencies {
    implementation("androidx.room:room-runtime:2.6.1")
    implementation("androidx.room:room-ktx:2.6.1")
    ksp("androidx.room:room-compiler:2.6.1")
    implementation("androidx.lifecycle:lifecycle-viewmodel-ktx:2.7.0")
    implementation("org.jetbrains.kotlinx:kotlinx-coroutines-android:1.7.3")
    implementation("com.pierfrancescosoffritti.androidyoutubeplayer:core:12.1.0")
}

📋 Projektstruktur

🚀 Vibecoding — KI-gestützte Entwicklung

Moderne KI-Coding-Tools („Vibecoding") reduzieren die Entwicklungszeit dramatisch. Was früher Wochen dauerte, entsteht heute in Tagen — mit Code auf Produktionsniveau.

System-Prompt für KI-Coding-Agenten

Baue eine Software-Lösung für folgendes Problem:
GeburtstagskanalApp — Android Birthday Video Browser

Anforderungen:
- Modular und erweiterbar
- Fehlerbehandlung mit Logging
- Konfiguration via ENV oder Config-Datei
- Dokumentation im Code
- Tests für Kernfunktionen

Tech-Stack: Kotlin, Android, Room DB, YouTube Player, MVVM
Ziel: Produktionsreifer Code, kein Prototyp.

Bereit für Ihr eigenes Projekt?

Ob Automation, Web-App oder individuelle Software — wir setzen Ihre Idee um. Unverbindlich, pragmatisch, code-gestützt.

📞 02406 803 7603 ✉️ info@computerkumpel.de