diff --git a/app/build.gradle b/app/build.gradle index 6fc9ac2..f3e4489 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -2,17 +2,35 @@ plugins { id 'com.android.application' } +// Load keystore properties +def keystorePropertiesFile = rootProject.file("keystore.properties") +def keystoreProperties = new Properties() +if (keystorePropertiesFile.exists()) { + keystoreProperties.load(new FileInputStream(keystorePropertiesFile)) +} + android { namespace = 'com.izzy2lost.psx2' compileSdk = 36 ndkVersion = '28.2.13676358' + signingConfigs { + release { + if (keystorePropertiesFile.exists()) { + storeFile file(keystoreProperties['storeFile']) + storePassword keystoreProperties['storePassword'] + keyAlias keystoreProperties['keyAlias'] + keyPassword keystoreProperties['keyPassword'] + } + } + } + defaultConfig { applicationId = "com.izzy2lost.psx2" minSdk = 26 targetSdk = 36 - versionCode 12 - versionName "1.1.0" + versionCode 13 + versionName "1.1.1" // APK base.archivesName = "PSX2_${versionCode}_${new Date().format('yyyyMMddHHmm')}" @@ -39,6 +57,7 @@ android { minifyEnabled = true shrinkResources = true proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' + signingConfig signingConfigs.release ndk { debugSymbolLevel 'SYMBOL_TABLE' } diff --git a/app/src/main/java/com/izzy2lost/psx2/GamesCoverDialogFragment.java b/app/src/main/java/com/izzy2lost/psx2/GamesCoverDialogFragment.java index ec7a481..b5aaa3e 100644 --- a/app/src/main/java/com/izzy2lost/psx2/GamesCoverDialogFragment.java +++ b/app/src/main/java/com/izzy2lost/psx2/GamesCoverDialogFragment.java @@ -419,8 +419,19 @@ public class GamesCoverDialogFragment extends DialogFragment { // Refresh drawer settings before opening refreshDialogDrawerSettings(); androidx.drawerlayout.widget.DrawerLayout drawer = root.findViewById(R.id.dlg_drawer_layout); - if (drawer != null) drawer.openDrawer(GravityCompat.START); - } catch (Throwable ignored) {} + if (drawer != null) { + // Defer the open to avoid layout/reentrancy races similar to activity path + drawer.post(() -> { + try { + drawer.openDrawer(GravityCompat.START); + } catch (Throwable t) { + android.util.Log.e("GamesCoverDialog", "Error opening dialog drawer (posted): " + t.getMessage()); + } + }); + } + } catch (Throwable t) { + android.util.Log.e("GamesCoverDialog", "Error scheduling dialog drawer open: " + t.getMessage()); + } }); // Setup drawer listener for pause/resume tracking @@ -605,8 +616,18 @@ public class GamesCoverDialogFragment extends DialogFragment { // Refresh drawer settings before opening refreshDialogDrawerSettings(); androidx.drawerlayout.widget.DrawerLayout drawer = root.findViewById(R.id.dlg_drawer_layout); - if (drawer != null) drawer.openDrawer(androidx.core.view.GravityCompat.START); - } catch (Throwable ignored) {} + if (drawer != null) { + drawer.post(() -> { + try { + drawer.openDrawer(androidx.core.view.GravityCompat.START); + } catch (Throwable t) { + android.util.Log.e("GamesCoverDialog", "Error opening dialog drawer (posted): " + t.getMessage()); + } + }); + } + } catch (Throwable t) { + android.util.Log.e("GamesCoverDialog", "Error scheduling dialog drawer open: " + t.getMessage()); + } } private void setupDialogDrawerSettings(View header) { diff --git a/app/src/main/java/com/izzy2lost/psx2/MainActivity.java b/app/src/main/java/com/izzy2lost/psx2/MainActivity.java index c7449c4..88ca426 100644 --- a/app/src/main/java/com/izzy2lost/psx2/MainActivity.java +++ b/app/src/main/java/com/izzy2lost/psx2/MainActivity.java @@ -571,13 +571,20 @@ public class MainActivity extends AppCompatActivity implements GamesCoverDialogF if (btn_settings != null) { btn_settings.setOnClickListener(v -> { try { - // Just open the drawer - let the drawer listener handle pausing + // Open the drawer via post() to avoid reentrancy/layout timing issues + // (programmatic open can sometimes race with layout/insets handling) DrawerLayout drawer = findViewById(R.id.drawer_layout); if (drawer != null) { - drawer.openDrawer(androidx.core.view.GravityCompat.START); + drawer.post(() -> { + try { + drawer.openDrawer(androidx.core.view.GravityCompat.START); + } catch (Throwable t) { + android.util.Log.e("MainActivity", "Error opening settings drawer (posted): " + t.getMessage()); + } + }); } } catch (Throwable t) { - android.util.Log.e("MainActivity", "Error opening settings drawer: " + t.getMessage()); + android.util.Log.e("MainActivity", "Error scheduling settings drawer open: " + t.getMessage()); } }); } diff --git a/build-release.bat b/build-release.bat new file mode 100644 index 0000000..c9cc9ef --- /dev/null +++ b/build-release.bat @@ -0,0 +1,28 @@ +@echo off +REM Build signed AAB for Google Play release + +echo Building release AAB... +call gradlew.bat bundleRelease + +if %ERRORLEVEL% EQU 0 ( + echo. + echo ======================================== + echo Build successful! + echo ======================================== + echo. + echo AAB location: + dir /b app\build\outputs\bundle\release\*.aab + echo. + echo Full path: + cd + echo \app\build\outputs\bundle\release\ + echo. +) else ( + echo. + echo ======================================== + echo Build failed! + echo ======================================== + echo. +) + +pause