From f53a8f35d2f848f4c5ba364b86f4dd46da65e22a Mon Sep 17 00:00:00 2001 From: dgis Date: Mon, 11 May 2020 23:52:01 +0200 Subject: [PATCH] Fix a major issue which prevented to open a state file (with a custom KML script) with Android 10. --- ReadMe.txt | 2 +- app/src/main/assets/ReadMe.txt | 1 + app/src/main/cpp/win32-layer.c | 42 ++++-- .../emulator/calculator/MainScreenView.java | 2 +- .../java/org/emulator/calculator/Utils.java | 6 +- .../emulator/forty/eight/MainActivity.java | 121 +++++++++--------- app/src/main/res/xml/pref_general.xml | 2 +- 7 files changed, 99 insertions(+), 77 deletions(-) diff --git a/ReadMe.txt b/ReadMe.txt index fd07516..c3767ed 100644 --- a/ReadMe.txt +++ b/ReadMe.txt @@ -76,6 +76,7 @@ Version 1.8beta3 (2020-04-XX) - Save the settings at the end of the state file. - Transform all child activities with dialog fragments (to prevent unwanted state save). - Fix an issue with the numpad keys which send the arrow keys and the numbers at the same time. +- Fix a major issue which prevented to open a state file (with a custom KML script) with Android 10. Version 1.7 (2019-12-12) @@ -194,7 +195,6 @@ The Eric's Real scripts ("real*.kml" and "real*.bmp/png") are embedded in this a TODO -- Add a settings to switch between dark and light theme. - Increase the loading speed (for Charlemagne faceplates) if possible. - Add the name of the file in the toast "State saved". - The clock seems unsynchronized sometimes. diff --git a/app/src/main/assets/ReadMe.txt b/app/src/main/assets/ReadMe.txt index 52e52dd..ccc1f9a 100644 --- a/app/src/main/assets/ReadMe.txt +++ b/app/src/main/assets/ReadMe.txt @@ -76,6 +76,7 @@ Version 1.8beta3 (2020-04-XX) - Save the settings at the end of the state file. - Transform all child activities with dialog fragments (to prevent unwanted state save). - Fix an issue with the numpad keys which send the arrow keys and the numbers at the same time. +- Fix a major issue which prevented to open a state file (with a custom KML script) with Android 10. Version 1.7 (2019-12-12) diff --git a/app/src/main/cpp/win32-layer.c b/app/src/main/cpp/win32-layer.c index 90fed79..e92f2f4 100644 --- a/app/src/main/cpp/win32-layer.c +++ b/app/src/main/cpp/win32-layer.c @@ -121,8 +121,23 @@ HANDLE CreateFile(LPCTSTR lpFileName, DWORD dwDesiredAccess, DWORD dwShareMode, if(chooseCurrentKmlMode == ChooseKmlMode_FILE_OPEN || chooseCurrentKmlMode == ChooseKmlMode_CHANGE_KML) { // When we open a new E48 state document + // Deal with the KML file and its containing folder + if(foundDocumentScheme) { + // With a recorded "document:" scheme, extract the folder URL with content:// scheme + // document: is only for a KML file + _tcscpy(szEmuDirectory, lpFileName + _tcslen(documentScheme) * sizeof(TCHAR)); + TCHAR * filename = _tcschr(szEmuDirectory, _T('|')); + if(filename) { + *filename = _T('\0'); + } +#if EMUXX == 48 + _tcscpy(szRomDirectory, szEmuDirectory); +#endif + SetCurrentDirectory(szEmuDirectory); + } else { TCHAR * fileExtension = _tcsrchr(lpFileName, _T('.')); - if(fileExtension && ((fileExtension[1] == 'K' && fileExtension[2] == 'M' && fileExtension[3] == 'L') || + if (fileExtension && + ((fileExtension[1] == 'K' && fileExtension[2] == 'M' && fileExtension[3] == 'L') || (fileExtension[1] == 'k' && fileExtension[2] == 'm' && fileExtension[3] == 'l') )) { // And opening a KML file @@ -137,17 +152,17 @@ HANDLE CreateFile(LPCTSTR lpFileName, DWORD dwDesiredAccess, DWORD dwShareMode, _tcscpy(szRomDirectory, szEmuDirectory); #endif SetCurrentDirectory(szEmuDirectory); - } else if(foundDocumentScheme) { - // With a recorded "document:" scheme, extract the folder URL with content:// scheme - _tcscpy(szEmuDirectory, lpFileName + _tcslen(documentScheme) * sizeof(TCHAR)); - TCHAR * filename = _tcschr(szEmuDirectory, _T('|')); - if(filename) { - *filename = _T('\0'); - } -#if EMUXX == 48 - _tcscpy(szRomDirectory, szEmuDirectory); -#endif - SetCurrentDirectory(szEmuDirectory); +// } else if(foundDocumentScheme) { +// // With a recorded "document:" scheme, extract the folder URL with content:// scheme +// _tcscpy(szEmuDirectory, lpFileName + _tcslen(documentScheme) * sizeof(TCHAR)); +// TCHAR * filename = _tcschr(szEmuDirectory, _T('|')); +// if(filename) { +// *filename = _T('\0'); +// } +//#if EMUXX == 48 +// _tcscpy(szRomDirectory, szEmuDirectory); +//#endif +// SetCurrentDirectory(szEmuDirectory); } else { _tcscpy(szEmuDirectory, "assets/calculators/"); #if EMUXX == 48 @@ -157,6 +172,7 @@ HANDLE CreateFile(LPCTSTR lpFileName, DWORD dwDesiredAccess, DWORD dwShareMode, } } } + } if(!forceNormalFile && (szCurrentAssetDirectory || _tcsncmp(lpFileName, assetsPrefix, assetsPrefixLength) == 0) @@ -2899,6 +2915,8 @@ INT_PTR DialogBoxParam(HINSTANCE hInstance, LPCTSTR lpTemplateName, HWND hWndPar } else if(chooseCurrentKmlMode == ChooseKmlMode_FILE_NEW) { lstrcpy(szCurrentKml, szChosenCurrentKml); } else if(chooseCurrentKmlMode == ChooseKmlMode_FILE_OPEN) { + // We are here because we open a state file and the embedded KML path is not reachable. + // So, we try to find a correct KML file in the current Custom KML scripts folder. if(!getFirstKMLFilenameForType(Chipset.type, szCurrentKml, sizeof(szCurrentKml) / sizeof(szCurrentKml[0]))) { showAlert(_T("Cannot find the KML template file, sorry."), 0); return -1; diff --git a/app/src/main/java/org/emulator/calculator/MainScreenView.java b/app/src/main/java/org/emulator/calculator/MainScreenView.java index be64b77..09c93b1 100644 --- a/app/src/main/java/org/emulator/calculator/MainScreenView.java +++ b/app/src/main/java/org/emulator/calculator/MainScreenView.java @@ -39,7 +39,7 @@ import java.util.Set; public class MainScreenView extends PanAndScaleView { protected static final String TAG = "MainScreenView"; - protected final boolean debug = true; + protected final boolean debug = false; private Paint paintFullCalc = new Paint(); private Paint paintLCD = new Paint(); diff --git a/app/src/main/java/org/emulator/calculator/Utils.java b/app/src/main/java/org/emulator/calculator/Utils.java index df6a4a0..a0ff653 100644 --- a/app/src/main/java/org/emulator/calculator/Utils.java +++ b/app/src/main/java/org/emulator/calculator/Utils.java @@ -158,14 +158,12 @@ public class Utils { int maximumTextureSize = 0; // Iterate through all the configurations to located the maximum texture size - for (int i = 0; i < totalConfigurations[0]; i++) - { + for (int i = 0; i < totalConfigurations[0]; i++) { // Only need to check for width since opengl textures are always squared egl.eglGetConfigAttrib(display, configurationsList[i], EGL10.EGL_MAX_PBUFFER_WIDTH, textureSize); // Keep track of the maximum texture size - if (maximumTextureSize < textureSize[0]) - { + if (maximumTextureSize < textureSize[0]) { maximumTextureSize = textureSize[0]; } diff --git a/app/src/main/java/org/emulator/forty/eight/MainActivity.java b/app/src/main/java/org/emulator/forty/eight/MainActivity.java index f036c46..fba4bc4 100644 --- a/app/src/main/java/org/emulator/forty/eight/MainActivity.java +++ b/app/src/main/java/org/emulator/forty/eight/MainActivity.java @@ -47,6 +47,7 @@ import androidx.annotation.NonNull; import androidx.annotation.Nullable; import androidx.appcompat.app.AlertDialog; import androidx.appcompat.app.AppCompatActivity; +import androidx.appcompat.app.AppCompatDelegate; import androidx.core.content.FileProvider; import androidx.core.view.GravityCompat; import androidx.documentfile.provider.DocumentFile; @@ -107,7 +108,6 @@ public class MainActivity extends AppCompatActivity implements NavigationView.On public static final int INTENT_PORT2LOAD = 6; public static final int INTENT_PICK_KML_FOLDER_FOR_NEW_FILE = 7; public static final int INTENT_PICK_KML_FOLDER_FOR_CHANGING = 8; - public static final int INTENT_PICK_KML_FOLDER_FOR_SETTINGS = 9; public static final int INTENT_PICK_KML_FOLDER_FOR_SECURITY = 10; public static final int INTENT_CREATE_RAM_CARD = 11; public static final int INTENT_MACRO_LOAD = 12; @@ -537,66 +537,63 @@ public class MainActivity extends AppCompatActivity implements NavigationView.On Pattern patternGlobalModel = Pattern.compile("\\s*Model\\s+\"(.*)\""); Matcher m; for (String calculatorFilename : calculatorsAssetFilenames) { - if (calculatorFilename.toLowerCase().lastIndexOf(".kml") != -1) { - BufferedReader reader = null; - try { - Uri calculatorsAssetFilenameUri = Uri.parse(calculatorFilename); - DocumentFile documentFile = DocumentFile.fromSingleUri(this, calculatorsAssetFilenameUri); - if(documentFile != null) { - Uri fileUri = documentFile.getUri(); - InputStream inputStream = getContentResolver().openInputStream(fileUri); - if(inputStream != null) { - reader = new BufferedReader(new InputStreamReader(inputStream, StandardCharsets.UTF_8)); - // do reading, usually loop until end of file reading - String mLine; - boolean inGlobal = false; - String title = null; - String model = null; - while ((mLine = reader.readLine()) != null) { - //process line - if (mLine.indexOf("Global") == 0) { - inGlobal = true; - title = null; - model = null; - continue; + BufferedReader reader = null; + try { + Uri calculatorsAssetFilenameUri = Uri.parse(calculatorFilename); + DocumentFile documentFile = DocumentFile.fromSingleUri(this, calculatorsAssetFilenameUri); + if(documentFile != null) { + Uri fileUri = documentFile.getUri(); + InputStream inputStream = getContentResolver().openInputStream(fileUri); + if(inputStream != null) { + reader = new BufferedReader(new InputStreamReader(inputStream, StandardCharsets.UTF_8)); + // do reading, usually loop until end of file reading + String mLine; + boolean inGlobal = false; + String title = null; + String model = null; + while ((mLine = reader.readLine()) != null) { + //process line + if (mLine.indexOf("Global") == 0) { + inGlobal = true; + title = null; + model = null; + continue; + } + if (inGlobal) { + if (mLine.indexOf("End") == 0) { + KMLScriptItem newKMLScriptItem = new KMLScriptItem(); + newKMLScriptItem.filename = kmlFolderUseDefault ? calculatorFilename : "document:" + kmlFolderURL + "|" + calculatorFilename; + newKMLScriptItem.title = title; + newKMLScriptItem.model = model; + kmlScripts.add(newKMLScriptItem); + break; } - if (inGlobal) { - if (mLine.indexOf("End") == 0) { - KMLScriptItem newKMLScriptItem = new KMLScriptItem(); - newKMLScriptItem.filename = kmlFolderUseDefault ? calculatorFilename : "document:" + kmlFolderURL + "|" + calculatorFilename; - newKMLScriptItem.title = title; - newKMLScriptItem.model = model; - kmlScripts.add(newKMLScriptItem); - break; - } - m = patternGlobalTitle.matcher(mLine); - if (m.find()) { - title = m.group(1); - } - m = patternGlobalModel.matcher(mLine); - if (m.find()) { - model = m.group(1); - } + m = patternGlobalTitle.matcher(mLine); + if (m.find()) { + title = m.group(1); + } + m = patternGlobalModel.matcher(mLine); + if (m.find()) { + model = m.group(1); } } } } - } catch (IOException e) { - //log the exception - e.printStackTrace(); - } finally { - if (reader != null) { - try { - reader.close(); - } catch (IOException e) { - //log the exception - } + } + } catch (IOException e) { + //log the exception + e.printStackTrace(); + } finally { + if (reader != null) { + try { + reader.close(); + } catch (IOException e) { + //log the exception } } } } - } Collections.sort(kmlScripts, (lhs, rhs) -> lhs.title.compareTo(rhs.title)); @@ -652,10 +649,21 @@ public class MainActivity extends AppCompatActivity implements NavigationView.On } private void newFileFromKML(String kmlScriptFilename) { - int result = NativeLib.onFileNew(kmlScriptFilename); + // Eventually, close the previous state file + NativeLib.onFileClose(); + showCalculatorView(false); + displayFilename(""); + + // Reset the embedded settings to the common settings + settings.setIsDefaultSettings(false); + settings.clearEmbeddedStateSettings(); + + // Update the Emu VM with the new settings + updateFromPreferences(null, false); + + // Create a new genuine state file + int result = NativeLib.onFileNew(kmlScriptFilename); if(result > 0) { - settings.setIsDefaultSettings(false); - settings.clearEmbeddedStateSettings(); showCalculatorView(true); displayFilename(""); showKMLLog(); @@ -1077,7 +1085,6 @@ public class MainActivity extends AppCompatActivity implements NavigationView.On } case INTENT_PICK_KML_FOLDER_FOR_NEW_FILE: case INTENT_PICK_KML_FOLDER_FOR_CHANGING: - case INTENT_PICK_KML_FOLDER_FOR_SETTINGS: case INTENT_PICK_KML_FOLDER_FOR_SECURITY: { if(debug) Log.d(TAG, "onActivityResult INTENT_PICK_KML_FOLDER " + url); settings.putBoolean("settings_kml_default", false); @@ -1092,8 +1099,6 @@ public class MainActivity extends AppCompatActivity implements NavigationView.On case INTENT_PICK_KML_FOLDER_FOR_CHANGING: OnViewScript(); break; - case INTENT_PICK_KML_FOLDER_FOR_SETTINGS: - break; case INTENT_PICK_KML_FOLDER_FOR_SECURITY: new AlertDialog.Builder(this) .setTitle(getString(R.string.message_open_security_retry)) @@ -1175,7 +1180,7 @@ public class MainActivity extends AppCompatActivity implements NavigationView.On // Eventually, close the previous state file NativeLib.onFileClose(); - settings.setIsDefaultSettings(true); + //settings.setIsDefaultSettings(true); showCalculatorView(false); displayFilename(""); diff --git a/app/src/main/res/xml/pref_general.xml b/app/src/main/res/xml/pref_general.xml index b024f74..ba2df0d 100644 --- a/app/src/main/res/xml/pref_general.xml +++ b/app/src/main/res/xml/pref_general.xml @@ -26,7 +26,7 @@ -