mirror of
https://github.com/dgis/emu48android
synced 2024-12-26 09:58:49 +01:00
Prevent some calculator to sleep. Fix crash. Attempt to fix haptic feedback.
This commit is contained in:
parent
bc8bd5b821
commit
547d20aed3
46 changed files with 127 additions and 65 deletions
16
ReadMe.txt
16
ReadMe.txt
|
@ -58,6 +58,14 @@ LINKS
|
||||||
|
|
||||||
CHANGES
|
CHANGES
|
||||||
|
|
||||||
|
Version 2.7 (2022-09-XX)
|
||||||
|
|
||||||
|
- Attempt to fix haptic feedback with Android 13 (API deprecation).
|
||||||
|
- Patch the ROM files to prevent the calculator to sleep for HP38G, HP39G, HP40G, HP48SX and HP48GX.
|
||||||
|
There is an issue with this patch and the Flashcard for the HP49/50 because an already existing Flashcard embed the non patched ROM file,
|
||||||
|
and the CRC check failed and make a CPU reset!
|
||||||
|
- Fix a potential crash about the permission to access the files.
|
||||||
|
|
||||||
Version 2.6 (2022-08-19)
|
Version 2.6 (2022-08-19)
|
||||||
|
|
||||||
- Updated source code from Eric Rechlin's Emu48 version 1.64+ that was merged from Christoph Gießelink's Emu48 version 1.65. This new version improve the serial communication.
|
- Updated source code from Eric Rechlin's Emu48 version 1.64+ that was merged from Christoph Gießelink's Emu48 version 1.65. This new version improve the serial communication.
|
||||||
|
@ -252,8 +260,16 @@ The Eric's Real scripts ("real*.kml" and "real*.bmp/png") are embedded in this a
|
||||||
|
|
||||||
Portions of this source code (about the usb-serial) were originally created by Google Inc. in 2011-2013 and Mike Wakerly in 2013.
|
Portions of this source code (about the usb-serial) were originally created by Google Inc. in 2011-2013 and Mike Wakerly in 2013.
|
||||||
|
|
||||||
|
FAQ
|
||||||
|
|
||||||
|
* Can you do something about Android removing access permissions to the state file? I can't run the app for more than a week before the OS takes it away and then I have to create a new state file.
|
||||||
|
> It should be possible to prevent Android from forgetting the permissions in Google Play Store app, Account/Play Protect/App permissions removed/See apps/All apps/Emu48/"Remove permissions if app isn't used" uncheck.
|
||||||
|
|
||||||
TODO
|
TODO
|
||||||
|
|
||||||
|
- Test XSEND.
|
||||||
|
- Haptic feedback does not seems to work on Android 13, should check (J. Majors).
|
||||||
|
- Add an "haptic" feedback with a sound instead of a vibration (F. Giampietro).
|
||||||
- Add a Cancel button to the HP48 memory card creator dialog.
|
- Add a Cancel button to the HP48 memory card creator dialog.
|
||||||
- Manage the HP 48 port 2 with the same kind of interface for the memory card.
|
- Manage the HP 48 port 2 with the same kind of interface for the memory card.
|
||||||
- The render pixels are very nice. A solution to obtain uniform pixel size could be a preset (a multiplier, auto) so the user could decide and upscale/downscale (Michael P).
|
- The render pixels are very nice. A solution to obtain uniform pixel size could be a preset (a multiplier, auto) so the user could decide and upscale/downscale (Michael P).
|
||||||
|
|
|
@ -28,22 +28,16 @@ if (keystorePropertiesFile.exists()) {
|
||||||
}
|
}
|
||||||
|
|
||||||
android {
|
android {
|
||||||
compileSdkVersion 32
|
namespace 'org.emulator.forty.eight'
|
||||||
|
compileSdk 33
|
||||||
defaultConfig {
|
defaultConfig {
|
||||||
applicationId "org.emulator.forty.eight"
|
applicationId "org.emulator.forty.eight"
|
||||||
minSdkVersion 19
|
minSdk 19
|
||||||
targetSdkVersion 32
|
targetSdk 33
|
||||||
versionCode 25
|
versionCode 26
|
||||||
versionName "2.6"
|
versionName "2.7"
|
||||||
setProperty("archivesBaseName", "Emu48-v$versionName")
|
setProperty("archivesBaseName", "Emu48-v$versionName")
|
||||||
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
|
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
|
||||||
externalNativeBuild {
|
|
||||||
cmake {
|
|
||||||
//abiFilters 'arm64-v8a', 'armeabi-v7a', 'x86', 'x86_64'
|
|
||||||
//abiFilters 'x86_64'
|
|
||||||
//version "3.10.2"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (canSign) {
|
if (canSign) {
|
||||||
|
@ -71,25 +65,26 @@ android {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
compileOptions {
|
||||||
|
sourceCompatibility JavaVersion.VERSION_11
|
||||||
|
targetCompatibility JavaVersion.VERSION_11
|
||||||
|
}
|
||||||
externalNativeBuild {
|
externalNativeBuild {
|
||||||
cmake {
|
cmake {
|
||||||
path "CMakeLists.txt"
|
path file('CMakeLists.txt')
|
||||||
|
//version '3.18.1'
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
compileOptions {
|
|
||||||
sourceCompatibility = '1.8'
|
|
||||||
targetCompatibility = '1.8'
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
dependencies {
|
dependencies {
|
||||||
implementation fileTree(dir: 'libs', include: ['*.jar'])
|
implementation fileTree(dir: 'libs', include: ['*.jar'])
|
||||||
implementation 'androidx.appcompat:appcompat:1.4.2'
|
implementation 'androidx.appcompat:appcompat:1.6.1'
|
||||||
implementation 'androidx.constraintlayout:constraintlayout:2.1.4'
|
implementation 'androidx.constraintlayout:constraintlayout:2.1.4'
|
||||||
|
implementation 'com.google.android.material:material:1.9.0'
|
||||||
implementation 'androidx.preference:preference:1.2.0'
|
implementation 'androidx.preference:preference:1.2.0'
|
||||||
implementation 'com.google.android.material:material:1.6.1'
|
|
||||||
implementation 'androidx.documentfile:documentfile:1.0.1'
|
implementation 'androidx.documentfile:documentfile:1.0.1'
|
||||||
testImplementation 'junit:junit:4.13.2'
|
testImplementation 'junit:junit:4.13.2'
|
||||||
androidTestImplementation 'androidx.test:runner:1.4.0'
|
androidTestImplementation 'androidx.test:runner:1.5.2'
|
||||||
androidTestImplementation 'androidx.test.espresso:espresso-core:3.4.0'
|
androidTestImplementation 'androidx.test.espresso:espresso-core:3.5.1'
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,6 +1,5 @@
|
||||||
<?xml version="1.0" encoding="utf-8"?>
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
|
<manifest xmlns:android="http://schemas.android.com/apk/res/android">
|
||||||
package="org.emulator.forty.eight">
|
|
||||||
|
|
||||||
<uses-feature android:name="android.hardware.usb.host" android:required="false"/>
|
<uses-feature android:name="android.hardware.usb.host" android:required="false"/>
|
||||||
|
|
||||||
|
|
|
@ -21,7 +21,7 @@ Global
|
||||||
Author "Casey Patterson && Sebastien Carlier"
|
Author "Casey Patterson && Sebastien Carlier"
|
||||||
Model "G"
|
Model "G"
|
||||||
Rom "rom.48g"
|
Rom "rom.48g"
|
||||||
Patch "BEEP.48"
|
Patch "PATCHES.48"
|
||||||
Bitmap "cp_48g3.bmp"
|
Bitmap "cp_48g3.bmp"
|
||||||
Debug 0
|
Debug 0
|
||||||
End
|
End
|
||||||
|
|
|
@ -13,7 +13,7 @@ Global
|
||||||
Author "Casey Patterson"
|
Author "Casey Patterson"
|
||||||
Model "S"
|
Model "S"
|
||||||
Rom "rom.48s"
|
Rom "rom.48s"
|
||||||
Patch "BEEP.48"
|
Patch "PATCHES.48"
|
||||||
Bitmap "cp_48s3.bmp"
|
Bitmap "cp_48s3.bmp"
|
||||||
Debug 0
|
Debug 0
|
||||||
End
|
End
|
||||||
|
|
|
@ -9,7 +9,7 @@ Global
|
||||||
Author "Christoph Giesselink"
|
Author "Christoph Giesselink"
|
||||||
Model "A"
|
Model "A"
|
||||||
Rom "rom.38g"
|
Rom "rom.38g"
|
||||||
Patch "BEEP.38G"
|
Patch "PATCHES.38G"
|
||||||
Debug 0
|
Debug 0
|
||||||
Bitmap "DEFAUL38.BMP"
|
Bitmap "DEFAUL38.BMP"
|
||||||
End
|
End
|
||||||
|
|
|
@ -3,7 +3,7 @@ Global
|
||||||
Author "Sebastien Carlier"
|
Author "Sebastien Carlier"
|
||||||
Model "G"
|
Model "G"
|
||||||
Rom "rom.48g"
|
Rom "rom.48g"
|
||||||
Patch "BEEP.48"
|
Patch "PATCHES.48"
|
||||||
Debug 0
|
Debug 0
|
||||||
Bitmap "DEFAULTG.BMP"
|
Bitmap "DEFAULTG.BMP"
|
||||||
End
|
End
|
||||||
|
|
|
@ -3,7 +3,7 @@ Global
|
||||||
Author "Sebastien Carlier"
|
Author "Sebastien Carlier"
|
||||||
Model "S"
|
Model "S"
|
||||||
Rom "rom.48s"
|
Rom "rom.48s"
|
||||||
Patch "BEEP.48"
|
Patch "PATCHES.48"
|
||||||
Debug 0
|
Debug 0
|
||||||
Bitmap "DEFAULTS.BMP"
|
Bitmap "DEFAULTS.BMP"
|
||||||
End
|
End
|
||||||
|
|
|
@ -13,7 +13,7 @@ Global
|
||||||
Author "Casey Patterson"
|
Author "Casey Patterson"
|
||||||
Model "G"
|
Model "G"
|
||||||
Rom "rom.48g"
|
Rom "rom.48g"
|
||||||
Patch "BEEP.48"
|
Patch "PATCHES.48"
|
||||||
Debug 0
|
Debug 0
|
||||||
Bitmap "float_gx.bmp"
|
Bitmap "float_gx.bmp"
|
||||||
End
|
End
|
||||||
|
|
|
@ -3,7 +3,7 @@ Global
|
||||||
Author "Jeffery L. McMahan"
|
Author "Jeffery L. McMahan"
|
||||||
Model "G"
|
Model "G"
|
||||||
Rom "rom.48g"
|
Rom "rom.48g"
|
||||||
Patch "BEEP.48"
|
Patch "PATCHES.48"
|
||||||
Bitmap "jemac.bmp"
|
Bitmap "jemac.bmp"
|
||||||
Debug 0
|
Debug 0
|
||||||
End
|
End
|
||||||
|
|
2
app/src/main/assets/calculators/PATCHES.38G
Normal file
2
app/src/main/assets/calculators/PATCHES.38G
Normal file
|
@ -0,0 +1,2 @@
|
||||||
|
014A1:6300; disable 10 min auto off (internal, undocumented)
|
||||||
|
;017D0:81B1; =makebeep (internal, undocumented)
|
3
app/src/main/assets/calculators/PATCHES.39G
Normal file
3
app/src/main/assets/calculators/PATCHES.39G
Normal file
|
@ -0,0 +1,3 @@
|
||||||
|
0148D:6300; disable 10 min auto off (internal, undocumented)
|
||||||
|
;017BC:81B1; =makebeep (internal, undocumented)
|
||||||
|
0212D:000; set =BounceTiming to 0 (internal, undocumented)
|
2
app/src/main/assets/calculators/PATCHES.48
Normal file
2
app/src/main/assets/calculators/PATCHES.48
Normal file
|
@ -0,0 +1,2 @@
|
||||||
|
01477:6300; disable 10 min auto off (internal, undocumented)
|
||||||
|
;017A6:81B1; =makebeep
|
4
app/src/main/assets/calculators/PATCHES.49G
Normal file
4
app/src/main/assets/calculators/PATCHES.49G
Normal file
|
@ -0,0 +1,4 @@
|
||||||
|
;41262:6300; disable 10 min auto off (internal for 1.19-6, undocumented)
|
||||||
|
412B9:6300; disable 10 min auto off (internal for 1.24/2.09, undocumented)
|
||||||
|
;4157A:81B1; =makebeep (internal for 1.18/1.19-5/1.19-6, undocumented)
|
||||||
|
;41609:81B1; =makebeep (internal for 1.24/2.01/2.09, undocumented)
|
|
@ -10,7 +10,7 @@ Global
|
||||||
Hardware "Yorke"
|
Hardware "Yorke"
|
||||||
Model "G"
|
Model "G"
|
||||||
Rom "rom.48g"
|
Rom "rom.48g"
|
||||||
Patch "BEEP.48"
|
Patch "PATCHES.48"
|
||||||
Bitmap "Wombat3 48GX.bmp"
|
Bitmap "Wombat3 48GX.bmp"
|
||||||
Debug 0
|
Debug 0
|
||||||
End
|
End
|
||||||
|
|
|
@ -10,7 +10,7 @@ Global
|
||||||
Hardware "Yorke"
|
Hardware "Yorke"
|
||||||
Model "S"
|
Model "S"
|
||||||
Rom "rom.48s"
|
Rom "rom.48s"
|
||||||
Patch "BEEP.48"
|
Patch "PATCHES.48"
|
||||||
Bitmap "Wombat3 48SX.bmp"
|
Bitmap "Wombat3 48SX.bmp"
|
||||||
Debug 0
|
Debug 0
|
||||||
End
|
End
|
||||||
|
|
|
@ -11,6 +11,7 @@ Global
|
||||||
Model "Q"
|
Model "Q"
|
||||||
Class 50
|
Class 50
|
||||||
Rom "rom.49g"
|
Rom "rom.49g"
|
||||||
|
Patch "PATCHES.49G"
|
||||||
Bitmap "calypso2k.png"
|
Bitmap "calypso2k.png"
|
||||||
Color 0 0 0 0
|
Color 0 0 0 0
|
||||||
#Scale 3 9
|
#Scale 3 9
|
||||||
|
|
|
@ -11,6 +11,7 @@ Global
|
||||||
Model "Q"
|
Model "Q"
|
||||||
Class 50
|
Class 50
|
||||||
Rom "rom.49g"
|
Rom "rom.49g"
|
||||||
|
Patch "PATCHES.49G"
|
||||||
Bitmap "calypso4k.png"
|
Bitmap "calypso4k.png"
|
||||||
Color 0 0 0 0
|
Color 0 0 0 0
|
||||||
#Scale 3 18
|
#Scale 3 18
|
||||||
|
|
|
@ -15,6 +15,7 @@ Global
|
||||||
Author "Eric Rechlin"
|
Author "Eric Rechlin"
|
||||||
Model "6" # 6 for 64K RAM, A for 32K RAM
|
Model "6" # 6 for 64K RAM, A for 32K RAM
|
||||||
Rom "rom.38g"
|
Rom "rom.38g"
|
||||||
|
Patch "PATCHES.38G"
|
||||||
Bitmap "real38g-l.png"
|
Bitmap "real38g-l.png"
|
||||||
Icon "38g.ico"
|
Icon "38g.ico"
|
||||||
Color 0 190 190 190
|
Color 0 190 190 190
|
||||||
|
|
|
@ -15,6 +15,7 @@ Global
|
||||||
Author "Eric Rechlin"
|
Author "Eric Rechlin"
|
||||||
Model "6" # 6 for 64K RAM, A for 32K RAM
|
Model "6" # 6 for 64K RAM, A for 32K RAM
|
||||||
Rom "rom.38g"
|
Rom "rom.38g"
|
||||||
|
Patch "PATCHES.38G"
|
||||||
Bitmap "real38g-lc.png"
|
Bitmap "real38g-lc.png"
|
||||||
Icon "38g.ico"
|
Icon "38g.ico"
|
||||||
Color 0 190 190 190
|
Color 0 190 190 190
|
||||||
|
|
|
@ -14,6 +14,7 @@ Global
|
||||||
Model "E"
|
Model "E"
|
||||||
Class 39
|
Class 39
|
||||||
Rom "rom.39g"
|
Rom "rom.39g"
|
||||||
|
Patch "PATCHES.39G"
|
||||||
Bitmap "real39g-l.png"
|
Bitmap "real39g-l.png"
|
||||||
Icon "39g.ico"
|
Icon "39g.ico"
|
||||||
Color 0 190 190 190
|
Color 0 190 190 190
|
||||||
|
|
|
@ -14,6 +14,7 @@ Global
|
||||||
Model "E"
|
Model "E"
|
||||||
Class 39
|
Class 39
|
||||||
Rom "rom.39g"
|
Rom "rom.39g"
|
||||||
|
Patch "PATCHES.39G"
|
||||||
Bitmap "real39g-lc.png"
|
Bitmap "real39g-lc.png"
|
||||||
Icon "39g.ico"
|
Icon "39g.ico"
|
||||||
Color 0 190 190 190
|
Color 0 190 190 190
|
||||||
|
|
|
@ -14,6 +14,7 @@ Global
|
||||||
Model "E"
|
Model "E"
|
||||||
Class 39
|
Class 39
|
||||||
Rom "rom.39g"
|
Rom "rom.39g"
|
||||||
|
Patch "PATCHES.39G"
|
||||||
Bitmap "real39gp-l.png"
|
Bitmap "real39gp-l.png"
|
||||||
Icon "39gp.ico"
|
Icon "39gp.ico"
|
||||||
Color 0 190 190 190
|
Color 0 190 190 190
|
||||||
|
|
|
@ -14,6 +14,7 @@ Global
|
||||||
Model "E"
|
Model "E"
|
||||||
Class 39
|
Class 39
|
||||||
Rom "rom.39g"
|
Rom "rom.39g"
|
||||||
|
Patch "PATCHES.39G"
|
||||||
Bitmap "real39gp-lc.png"
|
Bitmap "real39gp-lc.png"
|
||||||
Icon "39gp.ico"
|
Icon "39gp.ico"
|
||||||
Color 0 190 190 190
|
Color 0 190 190 190
|
||||||
|
|
|
@ -14,6 +14,7 @@ Global
|
||||||
Model "E"
|
Model "E"
|
||||||
Class 39
|
Class 39
|
||||||
Rom "rom.39g"
|
Rom "rom.39g"
|
||||||
|
Patch "PATCHES.39G"
|
||||||
Bitmap "real39gs-l.png"
|
Bitmap "real39gs-l.png"
|
||||||
Icon "39gs.ico"
|
Icon "39gs.ico"
|
||||||
Color 0 190 190 190
|
Color 0 190 190 190
|
||||||
|
|
|
@ -14,6 +14,7 @@ Global
|
||||||
Model "E"
|
Model "E"
|
||||||
Class 39
|
Class 39
|
||||||
Rom "rom.39g"
|
Rom "rom.39g"
|
||||||
|
Patch "PATCHES.39G"
|
||||||
Bitmap "real39gs-lc.png"
|
Bitmap "real39gs-lc.png"
|
||||||
Icon "39gs.ico"
|
Icon "39gs.ico"
|
||||||
Color 0 190 190 190
|
Color 0 190 190 190
|
||||||
|
|
|
@ -14,6 +14,7 @@ Global
|
||||||
Model "E"
|
Model "E"
|
||||||
Class 40
|
Class 40
|
||||||
Rom "rom.39g"
|
Rom "rom.39g"
|
||||||
|
Patch "PATCHES.39G"
|
||||||
Bitmap "real40g-l.png"
|
Bitmap "real40g-l.png"
|
||||||
Icon "39g.ico"
|
Icon "39g.ico"
|
||||||
Color 0 190 190 190
|
Color 0 190 190 190
|
||||||
|
|
|
@ -14,6 +14,7 @@ Global
|
||||||
Model "E"
|
Model "E"
|
||||||
Class 40
|
Class 40
|
||||||
Rom "rom.39g"
|
Rom "rom.39g"
|
||||||
|
Patch "PATCHES.39G"
|
||||||
Bitmap "real39g-lc.png"
|
Bitmap "real39g-lc.png"
|
||||||
Icon "40g.ico"
|
Icon "40g.ico"
|
||||||
Color 0 190 190 190
|
Color 0 190 190 190
|
||||||
|
|
|
@ -14,6 +14,7 @@ Global
|
||||||
Model "E"
|
Model "E"
|
||||||
Class 40
|
Class 40
|
||||||
Rom "rom.39g"
|
Rom "rom.39g"
|
||||||
|
Patch "PATCHES.39G"
|
||||||
Bitmap "real40gs-l.png"
|
Bitmap "real40gs-l.png"
|
||||||
Icon "40gs.ico"
|
Icon "40gs.ico"
|
||||||
Color 0 190 190 190
|
Color 0 190 190 190
|
||||||
|
|
|
@ -14,6 +14,7 @@ Global
|
||||||
Model "E"
|
Model "E"
|
||||||
Class 40
|
Class 40
|
||||||
Rom "rom.39g"
|
Rom "rom.39g"
|
||||||
|
Patch "PATCHES.39G"
|
||||||
Bitmap "real40gs-lc.png"
|
Bitmap "real40gs-lc.png"
|
||||||
Icon "40gs.ico"
|
Icon "40gs.ico"
|
||||||
Color 0 190 190 190
|
Color 0 190 190 190
|
||||||
|
|
|
@ -14,6 +14,7 @@ Global
|
||||||
Author "Eric Rechlin"
|
Author "Eric Rechlin"
|
||||||
Model "G"
|
Model "G"
|
||||||
Rom "rom.48g"
|
Rom "rom.48g"
|
||||||
|
Patch "PATCHES.48"
|
||||||
Bitmap "real48gx-l.png"
|
Bitmap "real48gx-l.png"
|
||||||
Icon "48gx.ico"
|
Icon "48gx.ico"
|
||||||
Color 0 190 190 190
|
Color 0 190 190 190
|
||||||
|
|
|
@ -14,6 +14,7 @@ Global
|
||||||
Author "Eric Rechlin"
|
Author "Eric Rechlin"
|
||||||
Model "G"
|
Model "G"
|
||||||
Rom "rom.48g"
|
Rom "rom.48g"
|
||||||
|
Patch "PATCHES.48"
|
||||||
Bitmap "real48gx-lc.png"
|
Bitmap "real48gx-lc.png"
|
||||||
Icon "48gx.ico"
|
Icon "48gx.ico"
|
||||||
Color 0 190 190 190
|
Color 0 190 190 190
|
||||||
|
|
|
@ -14,6 +14,7 @@ Global
|
||||||
Author "Eric Rechlin"
|
Author "Eric Rechlin"
|
||||||
Model "S"
|
Model "S"
|
||||||
Rom "rom.48s"
|
Rom "rom.48s"
|
||||||
|
Patch "PATCHES.48"
|
||||||
Bitmap "real48sx-l.png"
|
Bitmap "real48sx-l.png"
|
||||||
Icon "48sx.ico"
|
Icon "48sx.ico"
|
||||||
Color 0 190 190 190
|
Color 0 190 190 190
|
||||||
|
|
|
@ -14,6 +14,7 @@ Global
|
||||||
Author "Eric Rechlin"
|
Author "Eric Rechlin"
|
||||||
Model "S"
|
Model "S"
|
||||||
Rom "rom.48s"
|
Rom "rom.48s"
|
||||||
|
Patch "PATCHES.48"
|
||||||
Bitmap "real48sx-lc.png"
|
Bitmap "real48sx-lc.png"
|
||||||
Icon "48sx.ico"
|
Icon "48sx.ico"
|
||||||
Color 0 190 190 190
|
Color 0 190 190 190
|
||||||
|
|
|
@ -521,16 +521,19 @@ JNIEXPORT void JNICALL Java_org_emulator_calculator_NativeLib_stop(JNIEnv *env,
|
||||||
hWindowDC = NULL; // hWindowDC isn't valid any more
|
hWindowDC = NULL; // hWindowDC isn't valid any more
|
||||||
hWnd = NULL;
|
hWnd = NULL;
|
||||||
|
|
||||||
DeleteCriticalSection(&csGDILock);
|
// Prevent crash+++
|
||||||
DeleteCriticalSection(&csLcdLock);
|
// FORTIFY: pthread_mutex_destroy called on a destroyed mutex (0x<sanitized>)
|
||||||
DeleteCriticalSection(&csKeyLock);
|
// DeleteCriticalSection(&csGDILock);
|
||||||
DeleteCriticalSection(&csIOLock);
|
// DeleteCriticalSection(&csLcdLock);
|
||||||
DeleteCriticalSection(&csT1Lock);
|
// DeleteCriticalSection(&csKeyLock);
|
||||||
DeleteCriticalSection(&csT2Lock);
|
// DeleteCriticalSection(&csIOLock);
|
||||||
DeleteCriticalSection(&csTxdLock);
|
// DeleteCriticalSection(&csT1Lock);
|
||||||
DeleteCriticalSection(&csRecvLock);
|
// DeleteCriticalSection(&csT2Lock);
|
||||||
DeleteCriticalSection(&csSlowLock);
|
// DeleteCriticalSection(&csTxdLock);
|
||||||
DeleteCriticalSection(&csDbgLock);
|
// DeleteCriticalSection(&csRecvLock);
|
||||||
|
// DeleteCriticalSection(&csSlowLock);
|
||||||
|
// DeleteCriticalSection(&csDbgLock);
|
||||||
|
// Prevent crash---
|
||||||
|
|
||||||
SoundClose(); // close waveform-audio output device
|
SoundClose(); // close waveform-audio output device
|
||||||
soundEnabled = FALSE;
|
soundEnabled = FALSE;
|
||||||
|
|
|
@ -1879,6 +1879,8 @@ HPALETTE CreatePalette(CONST LOGPALETTE * plpal) {
|
||||||
return handle;
|
return handle;
|
||||||
}
|
}
|
||||||
HPALETTE SelectPalette(HDC hdc, HPALETTE hPal, BOOL bForceBkgd) {
|
HPALETTE SelectPalette(HDC hdc, HPALETTE hPal, BOOL bForceBkgd) {
|
||||||
|
if(!hdc)
|
||||||
|
return NULL;
|
||||||
HPALETTE hOldPal = hdc->selectedPalette;
|
HPALETTE hOldPal = hdc->selectedPalette;
|
||||||
hdc->selectedPalette = hPal;
|
hdc->selectedPalette = hPal;
|
||||||
return hOldPal;
|
return hOldPal;
|
||||||
|
|
|
@ -27,8 +27,7 @@ public class EmuApplication extends Application {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onCreate() {
|
public void onCreate() {
|
||||||
super.onCreate();
|
|
||||||
|
|
||||||
customPreferenceDataStore = new Settings(PreferenceManager.getDefaultSharedPreferences(this));
|
customPreferenceDataStore = new Settings(PreferenceManager.getDefaultSharedPreferences(this));
|
||||||
|
super.onCreate();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -15,8 +15,6 @@
|
||||||
package org.emulator.calculator;
|
package org.emulator.calculator;
|
||||||
|
|
||||||
import android.app.Dialog;
|
import android.app.Dialog;
|
||||||
import android.graphics.PorterDuff;
|
|
||||||
import android.graphics.drawable.Drawable;
|
|
||||||
import android.os.Bundle;
|
import android.os.Bundle;
|
||||||
import android.text.method.ScrollingMovementMethod;
|
import android.text.method.ScrollingMovementMethod;
|
||||||
import android.text.util.Linkify;
|
import android.text.util.Linkify;
|
||||||
|
@ -64,9 +62,7 @@ public class InfoFragment extends AppCompatDialogFragment {
|
||||||
Toolbar toolbar = view.findViewById(Utils.resId(this, "id", "my_toolbar"));
|
Toolbar toolbar = view.findViewById(Utils.resId(this, "id", "my_toolbar"));
|
||||||
toolbar.setTitle(title);
|
toolbar.setTitle(title);
|
||||||
Utils.colorizeDrawableWithColor(requireContext(), toolbar.getNavigationIcon(), android.R.attr.colorForeground);
|
Utils.colorizeDrawableWithColor(requireContext(), toolbar.getNavigationIcon(), android.R.attr.colorForeground);
|
||||||
toolbar.setNavigationOnClickListener(v -> {
|
toolbar.setNavigationOnClickListener(v -> dismiss());
|
||||||
dismiss();
|
|
||||||
});
|
|
||||||
|
|
||||||
// Programmatically load text from an asset and place it into the
|
// Programmatically load text from an asset and place it into the
|
||||||
// text view. Note that the text we are loading is ASCII, so we
|
// text view. Note that the text we are loading is ASCII, so we
|
||||||
|
@ -92,7 +88,7 @@ public class InfoFragment extends AppCompatDialogFragment {
|
||||||
TextView textViewInfo = view.findViewById(Utils.resId(this, "id", "textViewInfo"));
|
TextView textViewInfo = view.findViewById(Utils.resId(this, "id", "textViewInfo"));
|
||||||
textViewInfo.setMovementMethod(new ScrollingMovementMethod());
|
textViewInfo.setMovementMethod(new ScrollingMovementMethod());
|
||||||
textViewInfo.setText(text);
|
textViewInfo.setText(text);
|
||||||
Linkify.addLinks(textViewInfo, Linkify.ALL);
|
Linkify.addLinks(textViewInfo, Linkify.WEB_URLS);
|
||||||
} catch (IOException ignored) { }
|
} catch (IOException ignored) { }
|
||||||
return view;
|
return view;
|
||||||
}
|
}
|
||||||
|
|
|
@ -91,7 +91,7 @@ public class PrinterSimulatorFragment extends AppCompatDialogFragment {
|
||||||
// Toolbar
|
// Toolbar
|
||||||
|
|
||||||
Toolbar toolbar = view.findViewById(Utils.resId(this, "id", "my_toolbar"));
|
Toolbar toolbar = view.findViewById(Utils.resId(this, "id", "my_toolbar"));
|
||||||
toolbar.setTitle(title);
|
toolbar.setTitle(title);
|
||||||
Utils.colorizeDrawableWithColor(requireContext(), toolbar.getNavigationIcon(), android.R.attr.colorForeground);
|
Utils.colorizeDrawableWithColor(requireContext(), toolbar.getNavigationIcon(), android.R.attr.colorForeground);
|
||||||
toolbar.setNavigationOnClickListener(
|
toolbar.setNavigationOnClickListener(
|
||||||
v -> dismiss()
|
v -> dismiss()
|
||||||
|
|
|
@ -51,7 +51,7 @@ public class Settings extends PreferenceDataStore {
|
||||||
private final SharedPreferences androidSettings;
|
private final SharedPreferences androidSettings;
|
||||||
|
|
||||||
// Defined the setting keys which are only defined at the application level.
|
// Defined the setting keys which are only defined at the application level.
|
||||||
private List<String> applicationSettingKeys = Arrays.asList("settings_kml_default", "settings_kml_folder", "lastDocument", "MRU");
|
private final List<String> applicationSettingKeys = Arrays.asList("settings_kml_default", "settings_kml_folder", "lastDocument", "MRU");
|
||||||
|
|
||||||
// The settings only defined at the application level.
|
// The settings only defined at the application level.
|
||||||
private final HashMap<String, Object> applicationSettings = new HashMap<>();
|
private final HashMap<String, Object> applicationSettings = new HashMap<>();
|
||||||
|
@ -68,7 +68,7 @@ public class Settings extends PreferenceDataStore {
|
||||||
void onOneKeyChanged(String keyChanged);
|
void onOneKeyChanged(String keyChanged);
|
||||||
}
|
}
|
||||||
private OnOneKeyChangedListener oneKeyChangedListener;
|
private OnOneKeyChangedListener oneKeyChangedListener;
|
||||||
private static String magic = "MYHP";
|
private static final String magic = "MYHP";
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@ -307,7 +307,7 @@ public class Settings extends PreferenceDataStore {
|
||||||
HashMap<String, Object> settings = fromJSON(json);
|
HashMap<String, Object> settings = fromJSON(json);
|
||||||
embeddedStateSettings.putAll(settings);
|
embeddedStateSettings.putAll(settings);
|
||||||
}
|
}
|
||||||
} catch (IOException e) {
|
} catch (IOException | SecurityException e) {
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -316,7 +316,7 @@ public class Settings extends PreferenceDataStore {
|
||||||
commonSettings.clear();
|
commonSettings.clear();
|
||||||
Map<String, ?> keyValuePairs = androidSettings.getAll();
|
Map<String, ?> keyValuePairs = androidSettings.getAll();
|
||||||
for (String key : keyValuePairs.keySet()) {
|
for (String key : keyValuePairs.keySet()) {
|
||||||
if (applicationSettingKeys.indexOf(key) != -1)
|
if (applicationSettingKeys.contains(key))
|
||||||
applicationSettings.put(key, keyValuePairs.get(key));
|
applicationSettings.put(key, keyValuePairs.get(key));
|
||||||
else
|
else
|
||||||
commonSettings.put(key, keyValuePairs.get(key));
|
commonSettings.put(key, keyValuePairs.get(key));
|
||||||
|
|
|
@ -24,6 +24,7 @@ import android.graphics.PorterDuff;
|
||||||
import android.graphics.drawable.Drawable;
|
import android.graphics.drawable.Drawable;
|
||||||
import android.net.Uri;
|
import android.net.Uri;
|
||||||
import android.os.Build;
|
import android.os.Build;
|
||||||
|
import android.os.VibrationAttributes;
|
||||||
import android.os.VibrationEffect;
|
import android.os.VibrationEffect;
|
||||||
import android.os.Vibrator;
|
import android.os.Vibrator;
|
||||||
import android.provider.OpenableColumns;
|
import android.provider.OpenableColumns;
|
||||||
|
@ -101,12 +102,26 @@ public class Utils {
|
||||||
public static void makeUriPersistable(Context context, Intent data, Uri uri) {
|
public static void makeUriPersistable(Context context, Intent data, Uri uri) {
|
||||||
int takeFlags = data.getFlags() & (Intent.FLAG_GRANT_READ_URI_PERMISSION | Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
|
int takeFlags = data.getFlags() & (Intent.FLAG_GRANT_READ_URI_PERMISSION | Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
|
||||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT)
|
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT)
|
||||||
context.getContentResolver().takePersistableUriPermission(uri, takeFlags);
|
try {
|
||||||
|
context.getContentResolver().takePersistableUriPermission(uri, takeFlags);
|
||||||
|
} catch (SecurityException e) {
|
||||||
|
Utils.showAlert(context,
|
||||||
|
context.getString(Utils.resId(context, "string", "message_persisting_security_error"))
|
||||||
|
+ e.getMessage(),
|
||||||
|
true);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
public static void makeUriPersistableReadOnly(Context context, Intent data, Uri uri) {
|
public static void makeUriPersistableReadOnly(Context context, Intent data, Uri uri) {
|
||||||
int takeFlags = data.getFlags() & (Intent.FLAG_GRANT_READ_URI_PERMISSION);
|
int takeFlags = data.getFlags() & (Intent.FLAG_GRANT_READ_URI_PERMISSION);
|
||||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT)
|
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT)
|
||||||
context.getContentResolver().takePersistableUriPermission(uri, takeFlags);
|
try {
|
||||||
|
context.getContentResolver().takePersistableUriPermission(uri, takeFlags);
|
||||||
|
} catch (SecurityException e) {
|
||||||
|
Utils.showAlert(context,
|
||||||
|
context.getString(Utils.resId(context, "string", "message_persisting_security_error"))
|
||||||
|
+ e.getMessage(),
|
||||||
|
true);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public static String getFileName(Context context, String url) {
|
public static String getFileName(Context context, String url) {
|
||||||
|
@ -205,7 +220,10 @@ public class Utils {
|
||||||
|
|
||||||
public static void vibrate(Vibrator vibrator, int durationInMilliSecond) {
|
public static void vibrate(Vibrator vibrator, int durationInMilliSecond) {
|
||||||
if(vibrator != null && durationInMilliSecond > 0) {
|
if(vibrator != null && durationInMilliSecond > 0) {
|
||||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O)
|
if (Build.VERSION.SDK_INT >= 33)
|
||||||
|
// https://developer.android.com/reference/android/os/Vibrator#vibrate(android.os.VibrationEffect,%20android.os.VibrationAttributes)
|
||||||
|
vibrator.vibrate(VibrationEffect.createOneShot(durationInMilliSecond, VibrationAttributes.USAGE_TOUCH));
|
||||||
|
else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O)
|
||||||
// https://developer.android.com/reference/android/os/Vibrator#vibrate(android.os.VibrationEffect,%20android.media.AudioAttributes)
|
// https://developer.android.com/reference/android/os/Vibrator#vibrate(android.os.VibrationEffect,%20android.media.AudioAttributes)
|
||||||
vibrator.vibrate(VibrationEffect.createOneShot(durationInMilliSecond, VibrationEffect.DEFAULT_AMPLITUDE));
|
vibrator.vibrate(VibrationEffect.createOneShot(durationInMilliSecond, VibrationEffect.DEFAULT_AMPLITUDE));
|
||||||
else
|
else
|
||||||
|
|
|
@ -1393,7 +1393,7 @@ public class MainActivity extends AppCompatActivity implements NavigationView.On
|
||||||
|
|
||||||
private String extractROMFilename(InputStream inputStream) {
|
private String extractROMFilename(InputStream inputStream) {
|
||||||
String romFilename = null;
|
String romFilename = null;
|
||||||
if(inputStream != null) {
|
if(inputStream != null) {
|
||||||
try (BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream, StandardCharsets.UTF_8))) {
|
try (BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream, StandardCharsets.UTF_8))) {
|
||||||
// do reading, usually loop until end of file reading
|
// do reading, usually loop until end of file reading
|
||||||
Pattern patternGlobalROM = Pattern.compile("\\s*Rom\\s+\"(.*)\"");
|
Pattern patternGlobalROM = Pattern.compile("\\s*Rom\\s+\"(.*)\"");
|
||||||
|
@ -1620,7 +1620,7 @@ public class MainActivity extends AppCompatActivity implements NavigationView.On
|
||||||
setPort1Settings(NativeLib.getPort1Plugged(), NativeLib.getPort1Writable());
|
setPort1Settings(NativeLib.getPort1Plugged(), NativeLib.getPort1Writable());
|
||||||
// State file successfully opened.
|
// State file successfully opened.
|
||||||
String currentKml = NativeLib.getCurrentKml();
|
String currentKml = NativeLib.getCurrentKml();
|
||||||
if(kmlScriptFolder == null || currentKml.startsWith("document:")) {
|
if(kmlScriptFolder == null || currentKml.startsWith("document:")) {
|
||||||
// Needed for compatibility:
|
// Needed for compatibility:
|
||||||
// The KML folder is not in the JSON settings embedded in the state file,
|
// The KML folder is not in the JSON settings embedded in the state file,
|
||||||
// so, we need to extract it and change the variable szCurrentKml.
|
// so, we need to extract it and change the variable szCurrentKml.
|
||||||
|
@ -2014,7 +2014,7 @@ public class MainActivity extends AppCompatActivity implements NavigationView.On
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
showAlert(getString(R.string.message_open_kml_not_found_alert), true);
|
showAlert(getString(R.string.message_open_kml_not_found_alert), true);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -130,6 +130,7 @@
|
||||||
<string name="message_printer_out_of_paper">Out of paper error for the graphic printer (max line: %d, max pixel line: %d).</string>
|
<string name="message_printer_out_of_paper">Out of paper error for the graphic printer (max line: %d, max pixel line: %d).</string>
|
||||||
<string name="message_change_overlapping_lcd_mode_to_manual">The overlapping LCD mode has been changed to "Manual".</string>
|
<string name="message_change_overlapping_lcd_mode_to_manual">The overlapping LCD mode has been changed to "Manual".</string>
|
||||||
<string name="message_change_overlapping_lcd_mode_to_auto">The overlapping LCD mode has been changed to "Auto".</string>
|
<string name="message_change_overlapping_lcd_mode_to_auto">The overlapping LCD mode has been changed to "Auto".</string>
|
||||||
|
<string name="message_persisting_security_error">Permission issue: </string>
|
||||||
|
|
||||||
<string name="serial_fragment_title">USB Devices</string>
|
<string name="serial_fragment_title">USB Devices</string>
|
||||||
<string name="serial_device_list_header">USB Devices</string>
|
<string name="serial_device_list_header">USB Devices</string>
|
||||||
|
|
|
@ -7,7 +7,7 @@ buildscript {
|
||||||
jcenter()
|
jcenter()
|
||||||
}
|
}
|
||||||
dependencies {
|
dependencies {
|
||||||
classpath 'com.android.tools.build:gradle:7.2.1'
|
classpath 'com.android.tools.build:gradle:8.0.2'
|
||||||
|
|
||||||
|
|
||||||
// NOTE: Do not place your application dependencies here; they belong
|
// NOTE: Do not place your application dependencies here; they belong
|
||||||
|
|
|
@ -6,9 +6,13 @@
|
||||||
# http://www.gradle.org/docs/current/userguide/build_environment.html
|
# http://www.gradle.org/docs/current/userguide/build_environment.html
|
||||||
# Specifies the JVM arguments used for the daemon process.
|
# Specifies the JVM arguments used for the daemon process.
|
||||||
# The setting is particularly useful for tweaking memory settings.
|
# The setting is particularly useful for tweaking memory settings.
|
||||||
|
android.defaults.buildfeatures.buildconfig=true
|
||||||
android.enableJetifier=true
|
android.enableJetifier=true
|
||||||
|
android.nonFinalResIds=false
|
||||||
|
android.nonTransitiveRClass=false
|
||||||
android.useAndroidX=true
|
android.useAndroidX=true
|
||||||
org.gradle.jvmargs=-Xmx1536m
|
org.gradle.jvmargs=-Xmx1536m
|
||||||
|
org.gradle.unsafe.configuration-cache=true
|
||||||
# When configured, Gradle will run in incubating parallel mode.
|
# When configured, Gradle will run in incubating parallel mode.
|
||||||
# This option should only be used with decoupled projects. More details, visit
|
# This option should only be used with decoupled projects. More details, visit
|
||||||
# http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects
|
# http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects
|
||||||
|
|
6
gradle/wrapper/gradle-wrapper.properties
vendored
6
gradle/wrapper/gradle-wrapper.properties
vendored
|
@ -1,6 +1,6 @@
|
||||||
#Fri Oct 30 22:52:03 CET 2020
|
#Sat Jan 28 21:16:38 CET 2023
|
||||||
distributionBase=GRADLE_USER_HOME
|
distributionBase=GRADLE_USER_HOME
|
||||||
|
distributionUrl=https\://services.gradle.org/distributions/gradle-8.0-bin.zip
|
||||||
distributionPath=wrapper/dists
|
distributionPath=wrapper/dists
|
||||||
zipStoreBase=GRADLE_USER_HOME
|
|
||||||
zipStorePath=wrapper/dists
|
zipStorePath=wrapper/dists
|
||||||
distributionUrl=https\://services.gradle.org/distributions/gradle-7.3.3-all.zip
|
zipStoreBase=GRADLE_USER_HOME
|
||||||
|
|
Loading…
Reference in a new issue