From f5f135ff2707c857c89dde0c4166f719a9c5795e Mon Sep 17 00:00:00 2001 From: cmclark00 Date: Mon, 31 Mar 2025 21:08:37 -0400 Subject: [PATCH 1/6] Improve code quality, performance, and Google Play compliance --- README.md | 113 +++++++++++ app/build.gradle | 12 +- app/proguard-rules.pro | 33 +++ app/src/main/AndroidManifest.xml | 13 +- .../accessibility/GameAccessibilityHelper.kt | 137 +++++++++++++ .../main/java/com/mintris/audio/GameMusic.kt | 15 +- .../com/mintris/game/GameLifecycleManager.kt | 154 ++++++++++++++ .../main/java/com/mintris/game/GameView.kt | 34 ++++ .../main/java/com/mintris/ui/GameUIManager.kt | 191 ++++++++++++++++++ app/src/main/res/drawable/ic_leaderboard.xml | 11 + app/src/main/res/drawable/ic_play.xml | 11 + app/src/main/res/values/strings.xml | 17 ++ app/src/main/res/xml/backup_rules.xml | 13 ++ app/src/main/res/xml/shortcuts.xml | 30 +++ 14 files changed, 778 insertions(+), 6 deletions(-) create mode 100644 app/src/main/java/com/mintris/accessibility/GameAccessibilityHelper.kt create mode 100644 app/src/main/java/com/mintris/game/GameLifecycleManager.kt create mode 100644 app/src/main/java/com/mintris/ui/GameUIManager.kt create mode 100644 app/src/main/res/drawable/ic_leaderboard.xml create mode 100644 app/src/main/res/drawable/ic_play.xml create mode 100644 app/src/main/res/xml/backup_rules.xml create mode 100644 app/src/main/res/xml/shortcuts.xml diff --git a/README.md b/README.md index 15b03d7..2a67a0f 100644 --- a/README.md +++ b/README.md @@ -102,6 +102,119 @@ The game features a comprehensive scoring system: - Follows Material Design guidelines - Implements high score persistence using SharedPreferences +## Project Improvements and Best Practices + +### Performance Optimizations + +The codebase includes several performance optimizations: + +1. **Release Build Configuration** + - Minification enabled to reduce APK size + - Resource shrinking to remove unused resources + - ProGuard rules to optimize while preserving critical classes + +2. **Memory Management** + - Proper lifecycle handling to prevent memory leaks + - Resource cleanup through `releaseResources()` methods + - Efficient bitmap handling with reuse when possible + +3. **Rendering Efficiency** + - Custom view invalidation limited to areas that need updating + - Hardware acceleration for canvas operations + - Bitmap caching for frequently used graphics + +### Code Organization + +The codebase follows good architecture practices: + +1. **Package Structure** + - `model`: Data classes and game logic + - `game`: Core gameplay implementation + - `ui`: User interface components + - `audio`: Sound and music management + - `accessibility`: Accessibility helpers + +2. **Responsibility Separation** + - `GameLifecycleManager`: Handles lifecycle events + - `GameUIManager`: Manages UI state and updates + - `GameAccessibilityHelper`: Improves accessibility features + - `GamepadController`: Manages gamepad input + +### Google Play Compliance + +The app meets Google Play standards: + +1. **Manifest Configuration** + - Proper permissions declaration + - Screen orientation handling + - Full backup rules for user data + +2. **Accessibility Support** + - Content descriptions for UI elements + - Color contrast considerations + - Screen reader compatibility + +3. **Shortcuts and Deep Links** + - App shortcuts for quick actions + - Proper intent handling + +### Usage Examples + +#### Lifecycle Management + +```kotlin +// In your activity +private lateinit var lifecycleManager: GameLifecycleManager + +override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + lifecycleManager = GameLifecycleManager(this) +} + +override fun onPause() { + super.onPause() + lifecycleManager.onPause(gameView, gameMusic, statsManager, highScoreManager) +} + +override fun onResume() { + super.onResume() + lifecycleManager.onResume(gameView, gameMusic, isMusicEnabled) +} + +override fun onDestroy() { + lifecycleManager.onDestroy(gameView, gameMusic, statsManager, highScoreManager) + super.onDestroy() +} +``` + +#### Accessibility Implementation + +```kotlin +// In your activity +private lateinit var accessibilityHelper: GameAccessibilityHelper + +override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + accessibilityHelper = GameAccessibilityHelper(this) + + // Setup accessibility descriptions for controls + accessibilityHelper.setupAccessibilityDescriptions( + leftButton, rightButton, rotateButton, dropButton, + holdButton, pauseButton, gameView, holdPieceView, nextPieceView + ) +} + +// When level changes +private fun onLevelUp(newLevel: Int) { + accessibilityHelper.announceLevelUp(gameView, newLevel) +} + +// When game ends +private fun onGameOver(score: Long) { + accessibilityHelper.announceGameOver(gameView, score) +} +``` + ## Building from Source 1. Clone the repository: diff --git a/app/build.gradle b/app/build.gradle index da55975..21d6285 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -19,7 +19,8 @@ android { buildTypes { release { - minifyEnabled false + minifyEnabled true + shrinkResources true proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' } } @@ -38,6 +39,15 @@ android { } } +// Enable strict mode for debug builds +android.applicationVariants.all { variant -> + if (variant.buildType.name == "debug") { + variant.mergedFlavor.manifestPlaceholders = [enableStrictMode: "true"] + } else { + variant.mergedFlavor.manifestPlaceholders = [enableStrictMode: "false"] + } +} + dependencies { implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version" implementation 'androidx.core:core-ktx:1.12.0' diff --git a/app/proguard-rules.pro b/app/proguard-rules.pro index e64cabd..403e50d 100644 --- a/app/proguard-rules.pro +++ b/app/proguard-rules.pro @@ -8,6 +8,39 @@ # Keep models intact -keep class com.mintris.model.** { *; } +# Keep game classes intact to prevent issues +-keep class com.mintris.game.** { *; } + +# Preserve critical classes that might be used through reflection +-keep class com.mintris.audio.GameMusic { *; } +-keep class com.mintris.ui.** { *; } + +# Keep all public methods in the MainActivity +-keepclassmembers class com.mintris.MainActivity { + public *; +} + +# Keep serializable and parcelable classes for proper game state saving +-keepnames class * implements java.io.Serializable +-keepclassmembers class * implements java.io.Serializable { + static final long serialVersionUID; + private static final java.io.ObjectStreamField[] serialPersistentFields; + !static !transient ; + private void writeObject(java.io.ObjectOutputStream); + private void readObject(java.io.ObjectInputStream); + java.lang.Object writeReplace(); + java.lang.Object readResolve(); +} + +# Preserve line number information for debugging stack traces +-keepattributes SourceFile,LineNumberTable + +# Keep Gson usage intact +-keep class com.google.gson.** { *; } +-keep class * implements com.google.gson.TypeAdapterFactory +-keep class * implements com.google.gson.JsonSerializer +-keep class * implements com.google.gson.JsonDeserializer + # Uncomment this to preserve the line number information for # debugging stack traces. #-keepattributes SourceFile,LineNumberTable diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 8815afb..3322422 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -7,6 +7,7 @@ + android:excludeFromRecents="false" + android:screenOrientation="portrait" + android:configChanges="keyboard|keyboardHidden|orientation|screenSize|screenLayout|smallestScreenSize|uiMode"> + + android:exported="false" + android:screenOrientation="portrait" /> \ No newline at end of file diff --git a/app/src/main/java/com/mintris/accessibility/GameAccessibilityHelper.kt b/app/src/main/java/com/mintris/accessibility/GameAccessibilityHelper.kt new file mode 100644 index 0000000..450e47f --- /dev/null +++ b/app/src/main/java/com/mintris/accessibility/GameAccessibilityHelper.kt @@ -0,0 +1,137 @@ +package com.mintris.accessibility + +import android.content.Context +import android.os.Build +import android.view.View +import android.view.accessibility.AccessibilityEvent +import android.view.accessibility.AccessibilityManager +import android.widget.ImageButton +import android.widget.TextView +import androidx.core.view.ViewCompat +import com.mintris.R +import com.mintris.game.GameView +import com.mintris.model.TetrominoType + +/** + * Helper class to improve the game's accessibility for users with visual impairments + * or other accessibility needs. + */ +class GameAccessibilityHelper(private val context: Context) { + + private val accessibilityManager = context.getSystemService(Context.ACCESSIBILITY_SERVICE) as AccessibilityManager + + /** + * Sets up accessibility content descriptions for game controls + */ + fun setupAccessibilityDescriptions( + leftButton: ImageButton?, + rightButton: ImageButton?, + rotateButton: ImageButton?, + dropButton: ImageButton?, + holdButton: ImageButton?, + pauseButton: ImageButton?, + gameView: GameView?, + holdPieceView: View?, + nextPieceView: View? + ) { + // Set content descriptions for all control buttons + leftButton?.contentDescription = context.getString(R.string.accessibility_move_left) + rightButton?.contentDescription = context.getString(R.string.accessibility_move_right) + rotateButton?.contentDescription = context.getString(R.string.accessibility_rotate_piece) + dropButton?.contentDescription = context.getString(R.string.accessibility_drop_piece) + holdButton?.contentDescription = context.getString(R.string.accessibility_hold_piece) + pauseButton?.contentDescription = context.getString(R.string.accessibility_pause_game) + + // Set content descriptions for game views + gameView?.contentDescription = context.getString(R.string.accessibility_game_board) + holdPieceView?.contentDescription = context.getString(R.string.accessibility_held_piece) + nextPieceView?.contentDescription = context.getString(R.string.accessibility_next_piece) + + // Add accessibility delegate to the game view for custom events + gameView?.let { + ViewCompat.setAccessibilityDelegate(it, object : androidx.core.view.AccessibilityDelegateCompat() { + override fun onPopulateAccessibilityEvent(host: View, event: AccessibilityEvent) { + super.onPopulateAccessibilityEvent(host, event) + + // Add custom content to accessibility events if needed + if (event.eventType == AccessibilityEvent.TYPE_VIEW_SELECTED) { + // Example: announce the current piece type + event.text.add("Current piece: ${getCurrentPieceDescription(it)}") + } + } + }) + } + } + + /** + * Announces important game events via accessibility services + */ + fun announceGameEvent(view: View, message: String) { + if (accessibilityManager.isEnabled) { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) { + view.announceForAccessibility(message) + } else { + // For older Android versions + val event = AccessibilityEvent.obtain(AccessibilityEvent.TYPE_ANNOUNCEMENT) + event.text.add(message) + view.sendAccessibilityEvent(AccessibilityEvent.TYPE_ANNOUNCEMENT) + } + } + } + + /** + * Updates score and level information to be more accessible + */ + fun updateGameStatusAccessibility( + scoreTextView: TextView?, + levelTextView: TextView?, + linesTextView: TextView?, + score: Long, + level: Int, + lines: Int + ) { + // Make sure score is accessible to screen readers with proper formatting + scoreTextView?.let { + it.contentDescription = "Score: $score points" + } + + levelTextView?.let { + it.contentDescription = "Level: $level" + } + + linesTextView?.let { + it.contentDescription = "Lines cleared: $lines" + } + } + + /** + * Get a description of the current Tetromino piece for accessibility announcements + */ + private fun getCurrentPieceDescription(gameView: GameView): String { + val pieceType = gameView.getCurrentPieceType() ?: return "No piece" + + return when (pieceType) { + TetrominoType.I -> "I piece, long bar" + TetrominoType.J -> "J piece, hook shape pointing left" + TetrominoType.L -> "L piece, hook shape pointing right" + TetrominoType.O -> "O piece, square shape" + TetrominoType.S -> "S piece, zigzag shape" + TetrominoType.T -> "T piece, T shape" + TetrominoType.Z -> "Z piece, reverse zigzag shape" + } + } + + /** + * Announce the game over event with final score + */ + fun announceGameOver(view: View, score: Long) { + announceGameEvent(view, "Game over. Final score: $score points") + } + + /** + * Announce level up + */ + fun announceLevelUp(view: View, newLevel: Int) { + announceGameEvent(view, "Level up! Now at level $newLevel") + } +} \ 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 index 32c2f6e..cca3244 100644 --- a/app/src/main/java/com/mintris/audio/GameMusic.kt +++ b/app/src/main/java/com/mintris/audio/GameMusic.kt @@ -148,16 +148,25 @@ class GameMusic(private val context: Context) { fun isEnabled(): Boolean = isEnabled - fun release() { + /** + * Releases all media player resources to prevent memory leaks + */ + fun releaseResources() { try { - Log.d("GameMusic", "Releasing MediaPlayer") + Log.d("GameMusic", "Releasing MediaPlayer resources") mediaPlayer?.release() gameOverPlayer?.release() mediaPlayer = null gameOverPlayer = null isPrepared = false } catch (e: Exception) { - Log.e("GameMusic", "Error releasing music: ${e.message}") + Log.e("GameMusic", "Error releasing music resources: ${e.message}") } } + + // Keeping old method for backward compatibility + @Deprecated("Use releaseResources() instead", ReplaceWith("releaseResources()")) + fun release() { + releaseResources() + } } \ No newline at end of file diff --git a/app/src/main/java/com/mintris/game/GameLifecycleManager.kt b/app/src/main/java/com/mintris/game/GameLifecycleManager.kt new file mode 100644 index 0000000..76bc96b --- /dev/null +++ b/app/src/main/java/com/mintris/game/GameLifecycleManager.kt @@ -0,0 +1,154 @@ +package com.mintris.game + +import android.content.Context +import android.content.SharedPreferences +import android.os.Bundle +import com.google.gson.Gson +import com.mintris.audio.GameMusic +import com.mintris.model.GameBoard +import com.mintris.model.HighScoreManager +import com.mintris.model.StatsManager + +/** + * Handles the game's lifecycle events to ensure proper resource management + * and state saving/restoration. + */ +class GameLifecycleManager(private val context: Context) { + private val sharedPreferences: SharedPreferences = + context.getSharedPreferences("com.mintris.game_state", Context.MODE_PRIVATE) + private val gson = Gson() + + /** + * Save the current game state when the app is paused + */ + fun saveGameState( + gameBoard: GameBoard, + currentScore: Long, + currentLevel: Int, + piecesPlaced: Int, + gameStartTime: Long + ) { + val editor = sharedPreferences.edit() + + // Save primitive data + editor.putLong("current_score", currentScore) + editor.putInt("current_level", currentLevel) + editor.putInt("pieces_placed", piecesPlaced) + editor.putLong("game_start_time", gameStartTime) + + // Save complex GameBoard state - we don't serialize the GameBoard directly + // Instead we save key properties that can be used to recreate the board state + try { + editor.putInt("board_level", gameBoard.level) + editor.putInt("board_lines", gameBoard.lines) + editor.putInt("board_score", gameBoard.score) + } catch (e: Exception) { + // If serialization fails, just clear the saved state + editor.remove("board_level") + editor.remove("board_lines") + editor.remove("board_score") + } + + editor.apply() + } + + /** + * Restore the saved game state when the app is resumed + * Returns a bundle with the restored state or null if no state exists + */ + fun restoreGameState(): Bundle? { + // Check if we have a saved state + if (!sharedPreferences.contains("current_score")) { + return null + } + + val bundle = Bundle() + + // Restore primitive data + bundle.putLong("current_score", sharedPreferences.getLong("current_score", 0)) + bundle.putInt("current_level", sharedPreferences.getInt("current_level", 1)) + bundle.putInt("pieces_placed", sharedPreferences.getInt("pieces_placed", 0)) + bundle.putLong("game_start_time", sharedPreferences.getLong("game_start_time", 0)) + + // We don't try to deserialize the GameBoard, as it's too complex + // Instead, we'll create a new game board and apply saved properties later + bundle.putInt("board_level", sharedPreferences.getInt("board_level", 1)) + bundle.putInt("board_lines", sharedPreferences.getInt("board_lines", 0)) + bundle.putInt("board_score", sharedPreferences.getInt("board_score", 0)) + + return bundle + } + + /** + * Clears the saved game state + */ + fun clearGameState() { + sharedPreferences.edit().clear().apply() + } + + /** + * Handle activity pause + */ + fun onPause( + gameView: GameView?, + gameMusic: GameMusic?, + statsManager: StatsManager?, + highScoreManager: HighScoreManager? + ) { + // Pause the game view + gameView?.let { + if (!it.isPaused && !it.isGameOver()) { + it.pause() + } + } + + // Pause music + gameMusic?.pause() + + // Save any pending stats and scores - these methods must be made public in their respective classes + // or this functionality should be removed if those methods can't be accessed + try { + statsManager?.let { /* Call public save method if available */ } + highScoreManager?.let { /* Call public save method if available */ } + } catch (e: Exception) { + // Log error but continue + } + } + + /** + * Handle activity resume + */ + fun onResume( + gameView: GameView?, + gameMusic: GameMusic?, + isMusicEnabled: Boolean + ) { + // Resume music if enabled + if (isMusicEnabled) { + gameMusic?.resume() + } + } + + /** + * Handle activity destroy + */ + fun onDestroy( + gameView: GameView?, + gameMusic: GameMusic?, + statsManager: StatsManager?, + highScoreManager: HighScoreManager? + ) { + // Release resources + gameView?.releaseResources() + gameMusic?.releaseResources() + + // Save any pending data - these methods must be made public in their respective classes + // or this functionality should be removed if those methods can't be accessed + try { + statsManager?.let { /* Call public save method if available */ } + highScoreManager?.let { /* Call public save method if available */ } + } catch (e: Exception) { + // Log error but continue + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/mintris/game/GameView.kt b/app/src/main/java/com/mintris/game/GameView.kt index a89ad77..e85f665 100644 --- a/app/src/main/java/com/mintris/game/GameView.kt +++ b/app/src/main/java/com/mintris/game/GameView.kt @@ -1191,12 +1191,46 @@ class GameView @JvmOverloads constructor( */ fun getGameBoard(): GameBoard = gameBoard + /** + * Get the current piece type (for accessibility) + */ + fun getCurrentPieceType(): TetrominoType? { + return gameBoard.getCurrentPiece()?.type + } + /** * Clean up resources when view is detached */ override fun onDetachedFromWindow() { super.onDetachedFromWindow() handler.removeCallbacks(gameLoopRunnable) + releaseResources() + } + + /** + * Release resources to prevent memory leaks + */ + fun releaseResources() { + // Stop all animations + pulseAnimator?.cancel() + pulseAnimator?.removeAllUpdateListeners() + pulseAnimator = null + + // Stop game over animation + gameOverAnimator?.cancel() + gameOverAnimator?.removeAllUpdateListeners() + gameOverAnimator = null + + // Remove callbacks + handler.removeCallbacksAndMessages(null) + + // Clean up references + gameHaptics = null + onGameOver = null + onGameStateChanged = null + onPieceMove = null + onPieceLock = null + onLineClear = null } /** diff --git a/app/src/main/java/com/mintris/ui/GameUIManager.kt b/app/src/main/java/com/mintris/ui/GameUIManager.kt new file mode 100644 index 0000000..586a13e --- /dev/null +++ b/app/src/main/java/com/mintris/ui/GameUIManager.kt @@ -0,0 +1,191 @@ +package com.mintris.ui + +import android.content.Context +import android.graphics.Color +import android.view.View +import android.widget.ImageButton +import android.widget.TextView +import com.mintris.R +import com.mintris.databinding.ActivityMainBinding +import com.mintris.model.PlayerProgressionManager +import kotlin.math.roundToInt + +/** + * Handles UI updates and state management for the game interface + * to reduce the responsibility of the MainActivity. + */ +class GameUIManager( + private val context: Context, + private val binding: ActivityMainBinding +) { + // UI state + private var currentScore = 0L + private var currentLevel = 1 + private var currentLines = 0 + + // Theme management + private var currentTheme = PlayerProgressionManager.THEME_CLASSIC + + /** + * Update the game state UI elements + */ + fun updateGameStateUI(score: Long, level: Int, lines: Int) { + // Update cached values + currentScore = score + currentLevel = level + currentLines = lines + + // Update UI + binding.scoreText.text = score.toString() + binding.currentLevelText.text = level.toString() + binding.linesText.text = lines.toString() + } + + /** + * Show the game over UI + */ + fun showGameOver(finalScore: Long) { + // Hide game UI elements + binding.gameControlsContainer.visibility = View.GONE + binding.holdPieceView.visibility = View.GONE + binding.nextPieceView.visibility = View.GONE + binding.pauseButton.visibility = View.GONE + binding.leftControlsPanel?.visibility = View.GONE + binding.rightControlsPanel?.visibility = View.GONE + + // Show game over container + binding.gameOverContainer.visibility = View.VISIBLE + binding.sessionScoreText.text = "Score: $finalScore" + } + + /** + * Hide the game over UI + */ + fun hideGameOver() { + binding.gameOverContainer.visibility = View.GONE + } + + /** + * Show the pause menu + */ + fun showPauseMenu() { + binding.pauseContainer.visibility = View.VISIBLE + } + + /** + * Hide the pause menu + */ + fun hidePauseMenu() { + binding.pauseContainer.visibility = View.GONE + } + + /** + * Update the music toggle UI based on current state + */ + fun updateMusicToggleUI(isMusicEnabled: Boolean) { + // This assumes there's a musicToggle view in the layout + // Modify as needed based on the actual UI + } + + /** + * Update the level selector display + */ + fun updateLevelSelector(selectedLevel: Int) { + // Assuming pauseLevelText is part of the LevelBadge component + // This may need to be adapted based on how the level badge works + } + + /** + * Show the game elements (views, controls) + */ + fun showGameElements() { + binding.gameView.visibility = View.VISIBLE + binding.gameControlsContainer.visibility = View.VISIBLE + binding.holdPieceView.visibility = View.VISIBLE + binding.nextPieceView.visibility = View.VISIBLE + binding.pauseButton.visibility = View.VISIBLE + + // These might not exist in the actual layout + // binding.leftControlsPanel?.visibility = View.VISIBLE + // binding.rightControlsPanel?.visibility = View.VISIBLE + } + + /** + * Hide the game elements + */ + fun hideGameElements() { + binding.gameControlsContainer.visibility = View.GONE + binding.holdPieceView.visibility = View.GONE + binding.nextPieceView.visibility = View.GONE + binding.pauseButton.visibility = View.GONE + + // These might not exist in the actual layout + // binding.leftControlsPanel?.visibility = View.GONE + // binding.rightControlsPanel?.visibility = View.GONE + } + + /** + * Apply a theme to the game UI + */ + fun applyTheme(themeId: String) { + currentTheme = themeId + + // Set background color based on theme + val backgroundColor = getThemeBackgroundColor(themeId) + binding.root.setBackgroundColor(backgroundColor) + + // Update title screen theme if it has a setTheme method + // binding.titleScreen.setTheme(themeId) + + // Set text colors based on theme + val isDarkTheme = backgroundColor == Color.BLACK || + Color.red(backgroundColor) < 50 && + Color.green(backgroundColor) < 50 && + Color.blue(backgroundColor) < 50 + + val textColor = if (isDarkTheme) Color.WHITE else Color.BLACK + updateTextColors(textColor) + } + + /** + * Update all text colors in the UI + */ + private fun updateTextColors(color: Int) { + binding.scoreText.setTextColor(color) + binding.currentLevelText.setTextColor(color) + binding.linesText.setTextColor(color) + + // Other text views might not exist or have different IDs + // Adapt based on the actual layout + } + + /** + * Get background color based on theme ID + */ + private fun getThemeBackgroundColor(themeId: String): Int { + return when (themeId) { + PlayerProgressionManager.THEME_CLASSIC -> Color.BLACK + PlayerProgressionManager.THEME_NEON -> Color.parseColor("#0D0221") + PlayerProgressionManager.THEME_MONOCHROME -> Color.parseColor("#1A1A1A") + PlayerProgressionManager.THEME_RETRO -> Color.parseColor("#3F2832") + PlayerProgressionManager.THEME_MINIMALIST -> Color.WHITE + PlayerProgressionManager.THEME_GALAXY -> Color.parseColor("#0B0C10") + else -> Color.BLACK + } + } + + /** + * Get the current score + */ + fun getCurrentScore(): Long = currentScore + + /** + * Get the current level + */ + fun getCurrentLevel(): Int = currentLevel + + /** + * Get the current lines cleared + */ + fun getCurrentLines(): Int = currentLines +} \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_leaderboard.xml b/app/src/main/res/drawable/ic_leaderboard.xml new file mode 100644 index 0000000..d7cfb64 --- /dev/null +++ b/app/src/main/res/drawable/ic_leaderboard.xml @@ -0,0 +1,11 @@ + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_play.xml b/app/src/main/res/drawable/ic_play.xml new file mode 100644 index 0000000..068da4e --- /dev/null +++ b/app/src/main/res/drawable/ic_play.xml @@ -0,0 +1,11 @@ + + + + \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index c8eeb4d..e8daeef 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -49,4 +49,21 @@ music Customization Random Mode + + + Play + Start New Game + Scores + View High Scores + + + Rotate piece + Move piece left + Move piece right + Drop piece + Hold current piece + Game board + Next piece preview + Held piece + Pause game \ No newline at end of file diff --git a/app/src/main/res/xml/backup_rules.xml b/app/src/main/res/xml/backup_rules.xml new file mode 100644 index 0000000..77753a5 --- /dev/null +++ b/app/src/main/res/xml/backup_rules.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/xml/shortcuts.xml b/app/src/main/res/xml/shortcuts.xml new file mode 100644 index 0000000..a8af0c8 --- /dev/null +++ b/app/src/main/res/xml/shortcuts.xml @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + \ No newline at end of file From 38163c33a32979f7b7ac5dca283f3bc457e5b071 Mon Sep 17 00:00:00 2001 From: cmclark00 Date: Tue, 1 Apr 2025 05:06:38 -0400 Subject: [PATCH 2/6] Fix namespace and applicationId in build.gradle to match package structure --- README.md | 4 +- app/build.gradle | 9 +++-- app/proguard-rules.pro | 10 ++--- app/src/main/AndroidManifest.xml | 4 +- .../HighScoreEntryActivity.kt | 14 +++---- .../HighScoresActivity.kt | 13 +++---- .../MainActivity.kt | 37 +++++++++---------- .../StatsActivity.kt | 10 ++--- .../ThemeManager.kt | 2 +- .../accessibility/GameAccessibilityHelper.kt | 8 ++-- .../audio/GameMusic.kt | 4 +- .../game/GameHaptics.kt | 2 +- .../game/GameLifecycleManager.kt | 12 +++--- .../game/GameView.kt | 13 +++---- .../game/GamepadController.kt | 6 +-- .../game/HoldPieceView.kt | 5 +-- .../game/NextPieceView.kt | 2 +- .../game/TitleScreen.kt | 10 ++--- .../model/GameBoard.kt | 2 +- .../model/HighScore.kt | 2 +- .../model/HighScoreAdapter.kt | 4 +- .../model/HighScoreManager.kt | 4 +- .../model/PlayerProgressionManager.kt | 5 +-- .../model/StatsManager.kt | 4 +- .../model/Tetromino.kt | 2 +- .../ui/BlockSkinSelector.kt | 6 +-- .../ui/GameUIManager.kt | 10 ++--- .../ui/LevelBadge.kt | 2 +- .../ui/ProgressionScreen.kt | 6 +-- .../ui/ThemeSelector.kt | 7 ++-- .../ui/XPProgressBar.kt | 4 +- .../main/res/layout-land/activity_main.xml | 20 +++++----- app/src/main/res/layout/activity_main.xml | 18 ++++----- .../main/res/layout/progression_screen.xml | 2 +- app/src/main/res/values/strings.xml | 2 +- app/src/main/res/values/styles.xml | 4 +- app/src/main/res/xml/shortcuts.xml | 8 ++-- settings.gradle | 2 +- tatus | 12 +++--- 39 files changed, 134 insertions(+), 157 deletions(-) rename app/src/main/java/com/{mintris => pixelmintdrop}/HighScoreEntryActivity.kt (93%) rename app/src/main/java/com/{mintris => pixelmintdrop}/HighScoresActivity.kt (94%) rename app/src/main/java/com/{mintris => pixelmintdrop}/MainActivity.kt (98%) rename app/src/main/java/com/{mintris => pixelmintdrop}/StatsActivity.kt (96%) rename app/src/main/java/com/{mintris => pixelmintdrop}/ThemeManager.kt (92%) rename app/src/main/java/com/{mintris => pixelmintdrop}/accessibility/GameAccessibilityHelper.kt (97%) rename app/src/main/java/com/{mintris => pixelmintdrop}/audio/GameMusic.kt (98%) rename app/src/main/java/com/{mintris => pixelmintdrop}/game/GameHaptics.kt (99%) rename app/src/main/java/com/{mintris => pixelmintdrop}/game/GameLifecycleManager.kt (93%) rename app/src/main/java/com/{mintris => pixelmintdrop}/game/GameView.kt (99%) rename app/src/main/java/com/{mintris => pixelmintdrop}/game/GamepadController.kt (99%) rename app/src/main/java/com/{mintris => pixelmintdrop}/game/HoldPieceView.kt (97%) rename app/src/main/java/com/{mintris => pixelmintdrop}/game/NextPieceView.kt (99%) rename app/src/main/java/com/{mintris => pixelmintdrop}/game/TitleScreen.kt (98%) rename app/src/main/java/com/{mintris => pixelmintdrop}/model/GameBoard.kt (99%) rename app/src/main/java/com/{mintris => pixelmintdrop}/model/HighScore.kt (79%) rename app/src/main/java/com/{mintris => pixelmintdrop}/model/HighScoreAdapter.kt (97%) rename app/src/main/java/com/{mintris => pixelmintdrop}/model/HighScoreManager.kt (93%) rename app/src/main/java/com/{mintris => pixelmintdrop}/model/PlayerProgressionManager.kt (99%) rename app/src/main/java/com/{mintris => pixelmintdrop}/model/StatsManager.kt (98%) rename app/src/main/java/com/{mintris => pixelmintdrop}/model/Tetromino.kt (99%) rename app/src/main/java/com/{mintris => pixelmintdrop}/ui/BlockSkinSelector.kt (99%) rename app/src/main/java/com/{mintris => pixelmintdrop}/ui/GameUIManager.kt (95%) rename app/src/main/java/com/{mintris => pixelmintdrop}/ui/LevelBadge.kt (98%) rename app/src/main/java/com/{mintris => pixelmintdrop}/ui/ProgressionScreen.kt (99%) rename app/src/main/java/com/{mintris => pixelmintdrop}/ui/ThemeSelector.kt (99%) rename app/src/main/java/com/{mintris => pixelmintdrop}/ui/XPProgressBar.kt (98%) diff --git a/README.md b/README.md index 2a67a0f..29b8edd 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -# Mintris +# pixelmintdrop A modern Tetris implementation for Android, featuring smooth animations, responsive controls, and a beautiful minimalist design. @@ -219,7 +219,7 @@ private fun onGameOver(score: Long) { 1. Clone the repository: ```bash -git clone https://github.com/cmclark00/mintris.git +git clone https://github.com/cmclark00/pixelmintdrop.git ``` 2. Open the project in Android Studio diff --git a/app/build.gradle b/app/build.gradle index 21d6285..45c83db 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -4,13 +4,13 @@ plugins { } android { - namespace 'com.mintris' - compileSdk 34 + namespace "com.pixelmintdrop" + compileSdk 35 defaultConfig { - applicationId "com.mintris" + applicationId "com.pixelmintdrop" minSdk 30 - targetSdk 34 + targetSdk 35 versionCode 1 versionName "1.0" @@ -27,6 +27,7 @@ android { buildFeatures { viewBinding true + dataBinding true } compileOptions { diff --git a/app/proguard-rules.pro b/app/proguard-rules.pro index 403e50d..461f647 100644 --- a/app/proguard-rules.pro +++ b/app/proguard-rules.pro @@ -6,17 +6,17 @@ # http://developer.android.com/guide/developing/tools/proguard.html # Keep models intact --keep class com.mintris.model.** { *; } +-keep class com.pixelmintdrop.model.** { *; } # Keep game classes intact to prevent issues --keep class com.mintris.game.** { *; } +-keep class com.pixelmintdrop.game.** { *; } # Preserve critical classes that might be used through reflection --keep class com.mintris.audio.GameMusic { *; } --keep class com.mintris.ui.** { *; } +-keep class com.pixelmintdrop.audio.GameMusic { *; } +-keep class com.pixelmintdrop.ui.** { *; } # Keep all public methods in the MainActivity --keepclassmembers class com.mintris.MainActivity { +-keepclassmembers class com.pixelmintdrop.MainActivity { public *; } diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 3322422..0d57748 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -12,11 +12,11 @@ android:label="@string/app_name" android:roundIcon="@mipmap/ic_launcher_round" android:supportsRtl="true" - android:theme="@style/Theme.Mintris"> + android:theme="@style/Theme.pixelmintdrop"> = 5 setOnCheckedChangeListener { _, isChecked -> isRandomModeEnabled = isChecked - getSharedPreferences("com.mintris.preferences", Context.MODE_PRIVATE) + getSharedPreferences("com.com.pixelmintgames.pixelmintdrop.preferences", Context.MODE_PRIVATE) .edit() .putBoolean("random_mode_enabled", isChecked) .apply() @@ -1211,7 +1210,7 @@ class MainActivity : AppCompatActivity(), * Check if user has seen the gamepad help */ private fun hasSeenGamepadHelp(): Boolean { - val prefs = getSharedPreferences("com.mintris.preferences", Context.MODE_PRIVATE) + val prefs = getSharedPreferences("com.com.pixelmintgames.pixelmintdrop.preferences", Context.MODE_PRIVATE) return prefs.getBoolean("has_seen_gamepad_help", false) } @@ -1219,7 +1218,7 @@ class MainActivity : AppCompatActivity(), * Mark that user has seen the gamepad help */ private fun markGamepadHelpSeen() { - val prefs = getSharedPreferences("com.mintris.preferences", Context.MODE_PRIVATE) + val prefs = getSharedPreferences("com.com.pixelmintgames.pixelmintdrop.preferences", Context.MODE_PRIVATE) prefs.edit().putBoolean("has_seen_gamepad_help", true).apply() } diff --git a/app/src/main/java/com/mintris/StatsActivity.kt b/app/src/main/java/com/pixelmintdrop/StatsActivity.kt similarity index 96% rename from app/src/main/java/com/mintris/StatsActivity.kt rename to app/src/main/java/com/pixelmintdrop/StatsActivity.kt index c7d2e0e..09b9b9c 100644 --- a/app/src/main/java/com/mintris/StatsActivity.kt +++ b/app/src/main/java/com/pixelmintdrop/StatsActivity.kt @@ -1,13 +1,11 @@ -package com.mintris +package com.pixelmintdrop import android.os.Bundle -import android.widget.Button -import android.widget.TextView import androidx.appcompat.app.AlertDialog import androidx.appcompat.app.AppCompatActivity -import com.mintris.databinding.ActivityStatsBinding -import com.mintris.model.StatsManager -import com.mintris.model.PlayerProgressionManager +import com.pixelmintdrop.databinding.ActivityStatsBinding +import com.pixelmintdrop.model.StatsManager +import com.pixelmintdrop.model.PlayerProgressionManager import android.graphics.Color import java.text.SimpleDateFormat import java.util.* diff --git a/app/src/main/java/com/mintris/ThemeManager.kt b/app/src/main/java/com/pixelmintdrop/ThemeManager.kt similarity index 92% rename from app/src/main/java/com/mintris/ThemeManager.kt rename to app/src/main/java/com/pixelmintdrop/ThemeManager.kt index 56ce224..b2d1e1f 100644 --- a/app/src/main/java/com/mintris/ThemeManager.kt +++ b/app/src/main/java/com/pixelmintdrop/ThemeManager.kt @@ -1,4 +1,4 @@ -package com.mintris +package com.pixelmintdrop import android.graphics.Color diff --git a/app/src/main/java/com/mintris/accessibility/GameAccessibilityHelper.kt b/app/src/main/java/com/pixelmintdrop/accessibility/GameAccessibilityHelper.kt similarity index 97% rename from app/src/main/java/com/mintris/accessibility/GameAccessibilityHelper.kt rename to app/src/main/java/com/pixelmintdrop/accessibility/GameAccessibilityHelper.kt index 450e47f..ae962b3 100644 --- a/app/src/main/java/com/mintris/accessibility/GameAccessibilityHelper.kt +++ b/app/src/main/java/com/pixelmintdrop/accessibility/GameAccessibilityHelper.kt @@ -1,4 +1,4 @@ -package com.mintris.accessibility +package com.pixelmintdrop.accessibility import android.content.Context import android.os.Build @@ -8,9 +8,9 @@ import android.view.accessibility.AccessibilityManager import android.widget.ImageButton import android.widget.TextView import androidx.core.view.ViewCompat -import com.mintris.R -import com.mintris.game.GameView -import com.mintris.model.TetrominoType +import com.pixelmintdrop.R +import com.pixelmintdrop.game.GameView +import com.pixelmintdrop.model.TetrominoType /** * Helper class to improve the game's accessibility for users with visual impairments diff --git a/app/src/main/java/com/mintris/audio/GameMusic.kt b/app/src/main/java/com/pixelmintdrop/audio/GameMusic.kt similarity index 98% rename from app/src/main/java/com/mintris/audio/GameMusic.kt rename to app/src/main/java/com/pixelmintdrop/audio/GameMusic.kt index cca3244..38a8615 100644 --- a/app/src/main/java/com/mintris/audio/GameMusic.kt +++ b/app/src/main/java/com/pixelmintdrop/audio/GameMusic.kt @@ -1,11 +1,11 @@ -package com.mintris.audio +package com.pixelmintdrop.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 +import com.pixelmintdrop.R class GameMusic(private val context: Context) { private var mediaPlayer: MediaPlayer? = null diff --git a/app/src/main/java/com/mintris/game/GameHaptics.kt b/app/src/main/java/com/pixelmintdrop/game/GameHaptics.kt similarity index 99% rename from app/src/main/java/com/mintris/game/GameHaptics.kt rename to app/src/main/java/com/pixelmintdrop/game/GameHaptics.kt index 731ac8b..9f55369 100644 --- a/app/src/main/java/com/mintris/game/GameHaptics.kt +++ b/app/src/main/java/com/pixelmintdrop/game/GameHaptics.kt @@ -1,4 +1,4 @@ -package com.mintris.game +package com.pixelmintdrop.game import android.content.Context import android.os.Build diff --git a/app/src/main/java/com/mintris/game/GameLifecycleManager.kt b/app/src/main/java/com/pixelmintdrop/game/GameLifecycleManager.kt similarity index 93% rename from app/src/main/java/com/mintris/game/GameLifecycleManager.kt rename to app/src/main/java/com/pixelmintdrop/game/GameLifecycleManager.kt index 76bc96b..f998875 100644 --- a/app/src/main/java/com/mintris/game/GameLifecycleManager.kt +++ b/app/src/main/java/com/pixelmintdrop/game/GameLifecycleManager.kt @@ -1,13 +1,13 @@ -package com.mintris.game +package com.pixelmintdrop.game import android.content.Context import android.content.SharedPreferences import android.os.Bundle import com.google.gson.Gson -import com.mintris.audio.GameMusic -import com.mintris.model.GameBoard -import com.mintris.model.HighScoreManager -import com.mintris.model.StatsManager +import com.pixelmintdrop.audio.GameMusic +import com.pixelmintdrop.model.GameBoard +import com.pixelmintdrop.model.HighScoreManager +import com.pixelmintdrop.model.StatsManager /** * Handles the game's lifecycle events to ensure proper resource management @@ -15,7 +15,7 @@ import com.mintris.model.StatsManager */ class GameLifecycleManager(private val context: Context) { private val sharedPreferences: SharedPreferences = - context.getSharedPreferences("com.mintris.game_state", Context.MODE_PRIVATE) + context.getSharedPreferences("com.com.pixelmintgames.pixelmintdrop.game_state", Context.MODE_PRIVATE) private val gson = Gson() /** diff --git a/app/src/main/java/com/mintris/game/GameView.kt b/app/src/main/java/com/pixelmintdrop/game/GameView.kt similarity index 99% rename from app/src/main/java/com/mintris/game/GameView.kt rename to app/src/main/java/com/pixelmintdrop/game/GameView.kt index e85f665..b9cc1c9 100644 --- a/app/src/main/java/com/mintris/game/GameView.kt +++ b/app/src/main/java/com/pixelmintdrop/game/GameView.kt @@ -1,4 +1,4 @@ -package com.mintris.game +package com.pixelmintdrop.game import android.animation.ValueAnimator import android.content.Context @@ -20,11 +20,10 @@ import android.view.View import android.view.animation.LinearInterpolator import android.hardware.display.DisplayManager import android.view.Display -import com.mintris.model.GameBoard -import com.mintris.model.Tetromino -import com.mintris.model.TetrominoType +import com.pixelmintdrop.model.GameBoard +import com.pixelmintdrop.model.Tetromino +import com.pixelmintdrop.model.TetrominoType import kotlin.math.abs -import kotlin.math.min /** * GameView that renders the Tetris game and handles touch input @@ -216,7 +215,7 @@ class GameView @JvmOverloads constructor( pause() // Load saved block skin - val prefs = context.getSharedPreferences("mintris_progression", Context.MODE_PRIVATE) + val prefs = context.getSharedPreferences("pixelmintdrop_progression", Context.MODE_PRIVATE) currentBlockSkin = prefs.getString("selected_block_skin", "block_skin_1") ?: "block_skin_1" // Connect our callbacks to the GameBoard @@ -329,7 +328,7 @@ class GameView @JvmOverloads constructor( } // Save the selection to SharedPreferences - val prefs = context.getSharedPreferences("mintris_progression", Context.MODE_PRIVATE) + val prefs = context.getSharedPreferences("pixelmintdrop_progression", Context.MODE_PRIVATE) prefs.edit().putString("selected_block_skin", skinId).commit() // Force a refresh of the view diff --git a/app/src/main/java/com/mintris/game/GamepadController.kt b/app/src/main/java/com/pixelmintdrop/game/GamepadController.kt similarity index 99% rename from app/src/main/java/com/mintris/game/GamepadController.kt rename to app/src/main/java/com/pixelmintdrop/game/GamepadController.kt index 906758d..3c15a92 100644 --- a/app/src/main/java/com/mintris/game/GamepadController.kt +++ b/app/src/main/java/com/pixelmintdrop/game/GamepadController.kt @@ -1,4 +1,4 @@ -package com.mintris.game +package com.pixelmintdrop.game import android.os.SystemClock import android.view.InputDevice @@ -8,13 +8,11 @@ import android.util.Log import android.content.Context import android.os.Build import android.os.VibrationEffect -import android.view.InputDevice.MotionRange -import android.os.Vibrator import android.os.Handler import android.os.Looper /** - * GamepadController handles gamepad input for the Mintris game. + * GamepadController handles gamepad input for the pixelmintdrop game. * Supports multiple gamepad types including: * - Microsoft Xbox controllers * - Sony PlayStation controllers diff --git a/app/src/main/java/com/mintris/game/HoldPieceView.kt b/app/src/main/java/com/pixelmintdrop/game/HoldPieceView.kt similarity index 97% rename from app/src/main/java/com/mintris/game/HoldPieceView.kt rename to app/src/main/java/com/pixelmintdrop/game/HoldPieceView.kt index 6f51022..ae7272c 100644 --- a/app/src/main/java/com/mintris/game/HoldPieceView.kt +++ b/app/src/main/java/com/pixelmintdrop/game/HoldPieceView.kt @@ -1,4 +1,4 @@ -package com.mintris.game +package com.pixelmintdrop.game import android.content.Context import android.graphics.BlurMaskFilter @@ -7,8 +7,7 @@ import android.graphics.Color import android.graphics.Paint import android.util.AttributeSet import android.view.View -import com.mintris.model.GameBoard -import com.mintris.model.Tetromino +import com.pixelmintdrop.model.GameBoard import kotlin.math.min /** diff --git a/app/src/main/java/com/mintris/game/NextPieceView.kt b/app/src/main/java/com/pixelmintdrop/game/NextPieceView.kt similarity index 99% rename from app/src/main/java/com/mintris/game/NextPieceView.kt rename to app/src/main/java/com/pixelmintdrop/game/NextPieceView.kt index c82fe2c..d7502b5 100644 --- a/app/src/main/java/com/mintris/game/NextPieceView.kt +++ b/app/src/main/java/com/pixelmintdrop/game/NextPieceView.kt @@ -1,4 +1,4 @@ -package com.mintris.game +package com.pixelmintdrop.game import android.content.Context import android.graphics.Canvas diff --git a/app/src/main/java/com/mintris/game/TitleScreen.kt b/app/src/main/java/com/pixelmintdrop/game/TitleScreen.kt similarity index 98% rename from app/src/main/java/com/mintris/game/TitleScreen.kt rename to app/src/main/java/com/pixelmintdrop/game/TitleScreen.kt index 324f81b..dee6d08 100644 --- a/app/src/main/java/com/mintris/game/TitleScreen.kt +++ b/app/src/main/java/com/pixelmintdrop/game/TitleScreen.kt @@ -1,4 +1,4 @@ -package com.mintris.game +package com.pixelmintdrop.game import android.content.Context import android.graphics.Canvas @@ -10,9 +10,9 @@ import android.view.MotionEvent import android.view.View import java.util.Random import android.util.Log -import com.mintris.model.HighScoreManager -import com.mintris.model.HighScore -import com.mintris.model.PlayerProgressionManager +import com.pixelmintdrop.model.HighScoreManager +import com.pixelmintdrop.model.HighScore +import com.pixelmintdrop.model.PlayerProgressionManager import kotlin.math.abs import androidx.core.graphics.withTranslation import androidx.core.graphics.withScale @@ -240,7 +240,7 @@ class TitleScreen @JvmOverloads constructor( // Draw title val titleY = height * 0.4f - canvas.drawText("mintris", width / 2f, titleY, titlePaint) + canvas.drawText("Pixel Mint Drop", width / 2f, titleY, titlePaint) // Draw high scores using pre-allocated manager val highScores: List = highScoreManager.getHighScores() diff --git a/app/src/main/java/com/mintris/model/GameBoard.kt b/app/src/main/java/com/pixelmintdrop/model/GameBoard.kt similarity index 99% rename from app/src/main/java/com/mintris/model/GameBoard.kt rename to app/src/main/java/com/pixelmintdrop/model/GameBoard.kt index 61bcf11..bf20b4d 100644 --- a/app/src/main/java/com/mintris/model/GameBoard.kt +++ b/app/src/main/java/com/pixelmintdrop/model/GameBoard.kt @@ -1,4 +1,4 @@ -package com.mintris.model +package com.pixelmintdrop.model import android.util.Log diff --git a/app/src/main/java/com/mintris/model/HighScore.kt b/app/src/main/java/com/pixelmintdrop/model/HighScore.kt similarity index 79% rename from app/src/main/java/com/mintris/model/HighScore.kt rename to app/src/main/java/com/pixelmintdrop/model/HighScore.kt index b4b6295..ef70516 100644 --- a/app/src/main/java/com/mintris/model/HighScore.kt +++ b/app/src/main/java/com/pixelmintdrop/model/HighScore.kt @@ -1,4 +1,4 @@ -package com.mintris.model +package com.pixelmintdrop.model data class HighScore( val name: String, diff --git a/app/src/main/java/com/mintris/model/HighScoreAdapter.kt b/app/src/main/java/com/pixelmintdrop/model/HighScoreAdapter.kt similarity index 97% rename from app/src/main/java/com/mintris/model/HighScoreAdapter.kt rename to app/src/main/java/com/pixelmintdrop/model/HighScoreAdapter.kt index de4ec52..bcbae60 100644 --- a/app/src/main/java/com/mintris/model/HighScoreAdapter.kt +++ b/app/src/main/java/com/pixelmintdrop/model/HighScoreAdapter.kt @@ -1,4 +1,4 @@ -package com.mintris.model +package com.pixelmintdrop.model import android.graphics.Color import android.view.LayoutInflater @@ -6,7 +6,7 @@ import android.view.View import android.view.ViewGroup import android.widget.TextView import androidx.recyclerview.widget.RecyclerView -import com.mintris.R +import com.pixelmintdrop.R class HighScoreAdapter : RecyclerView.Adapter() { private var highScores: List = emptyList() diff --git a/app/src/main/java/com/mintris/model/HighScoreManager.kt b/app/src/main/java/com/pixelmintdrop/model/HighScoreManager.kt similarity index 93% rename from app/src/main/java/com/mintris/model/HighScoreManager.kt rename to app/src/main/java/com/pixelmintdrop/model/HighScoreManager.kt index 6fd7df9..bf35f52 100644 --- a/app/src/main/java/com/mintris/model/HighScoreManager.kt +++ b/app/src/main/java/com/pixelmintdrop/model/HighScoreManager.kt @@ -1,4 +1,4 @@ -package com.mintris.model +package com.pixelmintdrop.model import android.content.Context import android.content.SharedPreferences @@ -12,7 +12,7 @@ class HighScoreManager(private val context: Context) { private val type: Type = object : TypeToken>() {}.type companion object { - private const val PREFS_NAME = "mintris_highscores" + private const val PREFS_NAME = "pixelmintdrop_highscores" private const val KEY_HIGHSCORES = "highscores" private const val MAX_HIGHSCORES = 5 } diff --git a/app/src/main/java/com/mintris/model/PlayerProgressionManager.kt b/app/src/main/java/com/pixelmintdrop/model/PlayerProgressionManager.kt similarity index 99% rename from app/src/main/java/com/mintris/model/PlayerProgressionManager.kt rename to app/src/main/java/com/pixelmintdrop/model/PlayerProgressionManager.kt index a395bb7..3e0a568 100644 --- a/app/src/main/java/com/mintris/model/PlayerProgressionManager.kt +++ b/app/src/main/java/com/pixelmintdrop/model/PlayerProgressionManager.kt @@ -1,8 +1,7 @@ -package com.mintris.model +package com.pixelmintdrop.model import android.content.Context import android.content.SharedPreferences -import com.mintris.R import kotlin.math.pow import kotlin.math.roundToInt import kotlin.math.min @@ -292,7 +291,7 @@ class PlayerProgressionManager(context: Context) { } companion object { - private const val PREFS_NAME = "mintris_progression" + private const val PREFS_NAME = "pixelmintdrop_progression" private const val KEY_PLAYER_LEVEL = "player_level" private const val KEY_PLAYER_XP = "player_xp" private const val KEY_TOTAL_XP_EARNED = "total_xp_earned" diff --git a/app/src/main/java/com/mintris/model/StatsManager.kt b/app/src/main/java/com/pixelmintdrop/model/StatsManager.kt similarity index 98% rename from app/src/main/java/com/mintris/model/StatsManager.kt rename to app/src/main/java/com/pixelmintdrop/model/StatsManager.kt index cc5272f..89de6a0 100644 --- a/app/src/main/java/com/mintris/model/StatsManager.kt +++ b/app/src/main/java/com/pixelmintdrop/model/StatsManager.kt @@ -1,4 +1,4 @@ -package com.mintris.model +package com.pixelmintdrop.model import android.content.Context import android.content.SharedPreferences @@ -179,7 +179,7 @@ class StatsManager(context: Context) { } companion object { - private const val PREFS_NAME = "mintris_stats" + private const val PREFS_NAME = "pixelmintdrop_stats" private const val KEY_TOTAL_GAMES = "total_games" private const val KEY_TOTAL_SCORE = "total_score" private const val KEY_TOTAL_LINES = "total_lines" diff --git a/app/src/main/java/com/mintris/model/Tetromino.kt b/app/src/main/java/com/pixelmintdrop/model/Tetromino.kt similarity index 99% rename from app/src/main/java/com/mintris/model/Tetromino.kt rename to app/src/main/java/com/pixelmintdrop/model/Tetromino.kt index 54bafb2..6f2d708 100644 --- a/app/src/main/java/com/mintris/model/Tetromino.kt +++ b/app/src/main/java/com/pixelmintdrop/model/Tetromino.kt @@ -1,4 +1,4 @@ -package com.mintris.model +package com.pixelmintdrop.model /** * Represents a Tetris piece (Tetromino) diff --git a/app/src/main/java/com/mintris/ui/BlockSkinSelector.kt b/app/src/main/java/com/pixelmintdrop/ui/BlockSkinSelector.kt similarity index 99% rename from app/src/main/java/com/mintris/ui/BlockSkinSelector.kt rename to app/src/main/java/com/pixelmintdrop/ui/BlockSkinSelector.kt index d2c7d35..3e1e1c9 100644 --- a/app/src/main/java/com/mintris/ui/BlockSkinSelector.kt +++ b/app/src/main/java/com/pixelmintdrop/ui/BlockSkinSelector.kt @@ -1,4 +1,4 @@ -package com.mintris.ui +package com.pixelmintdrop.ui import android.content.Context import android.graphics.Color @@ -9,9 +9,7 @@ import android.widget.FrameLayout import android.widget.GridLayout import android.widget.TextView import androidx.cardview.widget.CardView -import com.mintris.R -import com.mintris.model.PlayerProgressionManager -import android.animation.ValueAnimator +import com.pixelmintdrop.R import android.graphics.drawable.GradientDrawable /** diff --git a/app/src/main/java/com/mintris/ui/GameUIManager.kt b/app/src/main/java/com/pixelmintdrop/ui/GameUIManager.kt similarity index 95% rename from app/src/main/java/com/mintris/ui/GameUIManager.kt rename to app/src/main/java/com/pixelmintdrop/ui/GameUIManager.kt index 586a13e..41fa22f 100644 --- a/app/src/main/java/com/mintris/ui/GameUIManager.kt +++ b/app/src/main/java/com/pixelmintdrop/ui/GameUIManager.kt @@ -1,14 +1,10 @@ -package com.mintris.ui +package com.pixelmintdrop.ui import android.content.Context import android.graphics.Color import android.view.View -import android.widget.ImageButton -import android.widget.TextView -import com.mintris.R -import com.mintris.databinding.ActivityMainBinding -import com.mintris.model.PlayerProgressionManager -import kotlin.math.roundToInt +import com.pixelmintdrop.databinding.ActivityMainBinding +import com.pixelmintdrop.model.PlayerProgressionManager /** * Handles UI updates and state management for the game interface diff --git a/app/src/main/java/com/mintris/ui/LevelBadge.kt b/app/src/main/java/com/pixelmintdrop/ui/LevelBadge.kt similarity index 98% rename from app/src/main/java/com/mintris/ui/LevelBadge.kt rename to app/src/main/java/com/pixelmintdrop/ui/LevelBadge.kt index 67665e4..3213417 100644 --- a/app/src/main/java/com/mintris/ui/LevelBadge.kt +++ b/app/src/main/java/com/pixelmintdrop/ui/LevelBadge.kt @@ -1,4 +1,4 @@ -package com.mintris.ui +package com.pixelmintdrop.ui import android.content.Context import android.graphics.Canvas diff --git a/app/src/main/java/com/mintris/ui/ProgressionScreen.kt b/app/src/main/java/com/pixelmintdrop/ui/ProgressionScreen.kt similarity index 99% rename from app/src/main/java/com/mintris/ui/ProgressionScreen.kt rename to app/src/main/java/com/pixelmintdrop/ui/ProgressionScreen.kt index 117a440..07d55cc 100644 --- a/app/src/main/java/com/mintris/ui/ProgressionScreen.kt +++ b/app/src/main/java/com/pixelmintdrop/ui/ProgressionScreen.kt @@ -1,4 +1,4 @@ -package com.mintris.ui +package com.pixelmintdrop.ui import android.animation.AnimatorSet import android.animation.ObjectAnimator @@ -12,8 +12,8 @@ import android.view.animation.OvershootInterpolator import android.widget.LinearLayout import android.widget.TextView import androidx.cardview.widget.CardView -import com.mintris.R -import com.mintris.model.PlayerProgressionManager +import com.pixelmintdrop.R +import com.pixelmintdrop.model.PlayerProgressionManager /** * Screen that displays player progression, XP gain, and unlocked rewards diff --git a/app/src/main/java/com/mintris/ui/ThemeSelector.kt b/app/src/main/java/com/pixelmintdrop/ui/ThemeSelector.kt similarity index 99% rename from app/src/main/java/com/mintris/ui/ThemeSelector.kt rename to app/src/main/java/com/pixelmintdrop/ui/ThemeSelector.kt index ece7cd4..059fd6c 100644 --- a/app/src/main/java/com/mintris/ui/ThemeSelector.kt +++ b/app/src/main/java/com/pixelmintdrop/ui/ThemeSelector.kt @@ -1,4 +1,4 @@ -package com.mintris.ui +package com.pixelmintdrop.ui import android.content.Context import android.graphics.Color @@ -9,9 +9,8 @@ import android.widget.FrameLayout import android.widget.GridLayout import android.widget.TextView import androidx.cardview.widget.CardView -import com.mintris.R -import com.mintris.model.PlayerProgressionManager -import android.animation.ValueAnimator +import com.pixelmintdrop.R +import com.pixelmintdrop.model.PlayerProgressionManager import android.graphics.drawable.GradientDrawable import android.util.Log diff --git a/app/src/main/java/com/mintris/ui/XPProgressBar.kt b/app/src/main/java/com/pixelmintdrop/ui/XPProgressBar.kt similarity index 98% rename from app/src/main/java/com/mintris/ui/XPProgressBar.kt rename to app/src/main/java/com/pixelmintdrop/ui/XPProgressBar.kt index 930da2f..f752e75 100644 --- a/app/src/main/java/com/mintris/ui/XPProgressBar.kt +++ b/app/src/main/java/com/pixelmintdrop/ui/XPProgressBar.kt @@ -1,4 +1,4 @@ -package com.mintris.ui +package com.pixelmintdrop.ui import android.animation.ValueAnimator import android.content.Context @@ -9,8 +9,6 @@ import android.graphics.RectF import android.util.AttributeSet import android.view.View import android.view.animation.AccelerateDecelerateInterpolator -import androidx.core.content.ContextCompat -import com.mintris.R /** * Custom progress bar for displaying player XP with animation capabilities diff --git a/app/src/main/res/layout-land/activity_main.xml b/app/src/main/res/layout-land/activity_main.xml index f4a4d50..582437e 100644 --- a/app/src/main/res/layout-land/activity_main.xml +++ b/app/src/main/res/layout-land/activity_main.xml @@ -28,7 +28,7 @@ app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent"> - @@ -72,7 +72,7 @@ app:layout_constraintEnd_toEndOf="parent" android:layout_marginTop="24dp"/> - - - - - - - @@ -683,7 +683,7 @@ android:paddingBottom="32dp"> - - - @@ -33,7 +33,7 @@ - - @@ -136,7 +136,7 @@ - - - @@ -567,7 +567,7 @@ android:textAllCaps="false" android:singleLine="true" /> - @@ -592,14 +592,14 @@ android:paddingBottom="32dp"> - - - - mintris + Pixel Mint Drop game over score level diff --git a/app/src/main/res/values/styles.xml b/app/src/main/res/values/styles.xml index ea37314..a280be0 100644 --- a/app/src/main/res/values/styles.xml +++ b/app/src/main/res/values/styles.xml @@ -1,7 +1,7 @@ - -