diff --git a/app/src/main/java/com/mintris/MainActivity.kt b/app/src/main/java/com/mintris/MainActivity.kt index 23a0c5d..50915da 100644 --- a/app/src/main/java/com/mintris/MainActivity.kt +++ b/app/src/main/java/com/mintris/MainActivity.kt @@ -17,6 +17,7 @@ import com.mintris.game.GameView import com.mintris.game.NextPieceView import android.view.HapticFeedbackConstants import com.mintris.model.GameBoard +import com.mintris.audio.GameMusic class MainActivity : AppCompatActivity() { @@ -25,9 +26,11 @@ class MainActivity : AppCompatActivity() { private lateinit var gameView: GameView private lateinit var gameHaptics: GameHaptics private lateinit var gameBoard: GameBoard + private lateinit var gameMusic: GameMusic // Game state private var isSoundEnabled = true + private var isMusicEnabled = true private var selectedLevel = 1 private val maxLevel = 20 @@ -40,6 +43,7 @@ class MainActivity : AppCompatActivity() { gameBoard = GameBoard() gameHaptics = GameHaptics(this) gameView = binding.gameView + gameMusic = GameMusic(this) // Set up game view gameView.setGameBoard(gameBoard) @@ -51,6 +55,13 @@ class MainActivity : AppCompatActivity() { binding.nextPieceView.invalidate() } + // Set up music toggle + binding.musicToggle.setOnClickListener { + isMusicEnabled = !isMusicEnabled + gameMusic.setEnabled(isMusicEnabled) + updateMusicToggleUI() + } + // Start game immediately startGame() @@ -94,7 +105,7 @@ class MainActivity : AppCompatActivity() { binding.resumeButton.setOnClickListener { gameHaptics.performHapticFeedback(it, HapticFeedbackConstants.VIRTUAL_KEY) hidePauseMenu() - gameView.start() + resumeGame() } binding.settingsButton.setOnClickListener { @@ -217,11 +228,19 @@ class MainActivity : AppCompatActivity() { vibrator.vibrate(VibrationEffect.createPredefined(effectId)) } + private fun updateMusicToggleUI() { + binding.musicToggle.setImageResource( + if (isMusicEnabled) R.drawable.ic_volume_up + else R.drawable.ic_volume_off + ) + } + private fun startGame() { - gameView.visibility = View.VISIBLE - gameBoard.startGame() gameView.start() - hidePauseMenu() + gameMusic.setEnabled(isMusicEnabled) // Explicitly set enabled state + if (isMusicEnabled) { + gameMusic.start() + } } private fun restartGame() { @@ -231,10 +250,22 @@ class MainActivity : AppCompatActivity() { showPauseMenu() } + private fun pauseGame() { + gameView.pause() + gameMusic.pause() + } + + private fun resumeGame() { + gameView.resume() + if (isMusicEnabled) { + gameMusic.start() + } + } + override fun onPause() { super.onPause() if (!gameView.isGameOver()) { - gameView.pause() + pauseGame() showPauseMenu() binding.pauseStartButton.visibility = View.GONE binding.resumeButton.visibility = View.VISIBLE @@ -256,12 +287,19 @@ class MainActivity : AppCompatActivity() { binding.resumeButton.visibility = View.VISIBLE } else { hidePauseMenu() - gameView.start() + resumeGame() } } override fun onResume() { super.onResume() - gameView.resume() + if (!gameView.isGameOver()) { + resumeGame() + } + } + + override fun onDestroy() { + super.onDestroy() + gameMusic.release() } } \ No newline at end of file diff --git a/app/src/main/java/com/mintris/audio/GameMusic.kt b/app/src/main/java/com/mintris/audio/GameMusic.kt new file mode 100644 index 0000000..6b96257 --- /dev/null +++ b/app/src/main/java/com/mintris/audio/GameMusic.kt @@ -0,0 +1,93 @@ +package com.mintris.audio + +import android.content.Context +import android.media.MediaPlayer +import android.media.AudioAttributes +import android.os.Build +import android.util.Log +import com.mintris.R + +class GameMusic(private val context: Context) { + private var mediaPlayer: MediaPlayer? = null + private var isEnabled = false + + init { + setupMediaPlayer() + } + + private fun setupMediaPlayer() { + try { + Log.d("GameMusic", "Setting up MediaPlayer") + mediaPlayer = MediaPlayer.create(context, R.raw.game_music).apply { + isLooping = true + setVolume(0.5f, 0.5f) + + // Set audio attributes for better performance + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { + setAudioAttributes( + AudioAttributes.Builder() + .setUsage(AudioAttributes.USAGE_GAME) + .setContentType(AudioAttributes.CONTENT_TYPE_MUSIC) + .build() + ) + } + } + Log.d("GameMusic", "MediaPlayer setup complete") + } catch (e: Exception) { + Log.e("GameMusic", "Error setting up MediaPlayer", e) + } + } + + fun start() { + try { + Log.d("GameMusic", "Starting music playback, isEnabled: $isEnabled") + if (isEnabled && mediaPlayer?.isPlaying != true) { + mediaPlayer?.start() + Log.d("GameMusic", "Music playback started") + } + } catch (e: Exception) { + Log.e("GameMusic", "Error starting music", e) + } + } + + fun pause() { + try { + Log.d("GameMusic", "Pausing music playback") + mediaPlayer?.pause() + } catch (e: Exception) { + Log.e("GameMusic", "Error pausing music", e) + } + } + + fun stop() { + try { + Log.d("GameMusic", "Stopping music playback") + mediaPlayer?.stop() + mediaPlayer?.prepare() + } catch (e: Exception) { + Log.e("GameMusic", "Error stopping music", e) + } + } + + fun setEnabled(enabled: Boolean) { + Log.d("GameMusic", "Setting music enabled: $enabled") + isEnabled = enabled + if (enabled) { + start() + } else { + pause() + } + } + + fun isEnabled(): Boolean = isEnabled + + fun release() { + try { + Log.d("GameMusic", "Releasing MediaPlayer") + mediaPlayer?.release() + mediaPlayer = null + } catch (e: Exception) { + Log.e("GameMusic", "Error releasing MediaPlayer", e) + } + } +} \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_volume_off.xml b/app/src/main/res/drawable/ic_volume_off.xml new file mode 100644 index 0000000..ba39eb2 --- /dev/null +++ b/app/src/main/res/drawable/ic_volume_off.xml @@ -0,0 +1,10 @@ + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_volume_up.xml b/app/src/main/res/drawable/ic_volume_up.xml new file mode 100644 index 0000000..342c4b1 --- /dev/null +++ b/app/src/main/res/drawable/ic_volume_up.xml @@ -0,0 +1,10 @@ + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml index 364cb03..03a19ea 100644 --- a/app/src/main/res/layout/activity_main.xml +++ b/app/src/main/res/layout/activity_main.xml @@ -225,6 +225,19 @@ android:text="@string/sound_on" android:textColor="@color/white" android:textSize="18sp" /> + + \ No newline at end of file diff --git a/app/src/main/res/raw/game_music.mp3 b/app/src/main/res/raw/game_music.mp3 new file mode 100644 index 0000000..06c3814 Binary files /dev/null and b/app/src/main/res/raw/game_music.mp3 differ diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 7e15325..4ac2073 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -15,4 +15,5 @@ Select Level Sound: On Sound: Off + Toggle music \ No newline at end of file