[Scummvm-git-logs] scummvm master -> 30b7c882e835cb37eaf03320124e723fa843650f

antoniou79 a.antoniou79 at gmail.com
Thu Sep 17 20:25:40 UTC 2020


This automated email contains information about 1 new commit which have been
pushed to the 'scummvm' repo located at https://github.com/scummvm/scummvm .

Summary:
30b7c882e8 ANDROID: Copy asset files in internal app folder


Commit: 30b7c882e835cb37eaf03320124e723fa843650f
    https://github.com/scummvm/scummvm/commit/30b7c882e835cb37eaf03320124e723fa843650f
Author: antoniou (a.antoniou79 at gmail.com)
Date: 2020-09-17T23:25:23+03:00

Commit Message:
ANDROID: Copy asset files in internal app folder

Changed paths:
    backends/platform/android/org/scummvm/scummvm/ScummVMActivity.java


diff --git a/backends/platform/android/org/scummvm/scummvm/ScummVMActivity.java b/backends/platform/android/org/scummvm/scummvm/ScummVMActivity.java
index d27fd64130..25259b9326 100644
--- a/backends/platform/android/org/scummvm/scummvm/ScummVMActivity.java
+++ b/backends/platform/android/org/scummvm/scummvm/ScummVMActivity.java
@@ -8,6 +8,7 @@ import android.content.Context;
 import android.content.DialogInterface;
 import android.content.Intent;
 import android.content.pm.PackageManager;
+import android.content.res.AssetManager;
 import android.graphics.Rect;
 import android.media.AudioManager;
 import android.net.Uri;
@@ -58,6 +59,7 @@ public class ScummVMActivity extends Activity implements OnKeyboardVisibilityLis
 	private static boolean _hoverAvailable;
 
 	private ClipboardManager _clipboard;
+	private Version _currentScummVMVersion;
 	private File _configScummvmFile;
 	private File _actualScummVMDataDir;
 	private File _defaultScummVMSavesDir;
@@ -231,6 +233,11 @@ public class ScummVMActivity extends Activity implements OnKeyboardVisibilityLis
 
 		main_surface.requestFocus();
 
+		_clipboard = (ClipboardManager)getSystemService(CLIPBOARD_SERVICE);
+
+		_currentScummVMVersion = new Version(BuildConfig.VERSION_NAME);
+		Log.d(ScummVM.LOG_TAG, "Current ScummVM version being installed is: " + _currentScummVMVersion.getDescription() + " (" + _currentScummVMVersion.get() + ")");
+
 		// REMOVED: Since getFilesDir() is guaranteed to exist, getFilesDir().mkdirs() might be related to crashes in Android version 9+ (Pie or above, API 28+)!
 
 		// REMOVED: Setting savePath to Environment.getExternalStorageDirectory() + "/ScummVM/Saves/"
@@ -248,48 +255,45 @@ public class ScummVMActivity extends Activity implements OnKeyboardVisibilityLis
 		// seekAndInitScummvmConfiguration() returns false if something went wrong
 		// when initializing configuration (or when seeking and trying to use an existing ini file) for ScummVM
 		if (!seekAndInitScummvmConfiguration()) {
-			Log.e(ScummVM.LOG_TAG, "Error while trying to find and/or initialize scummvm configuration file!");
-			// TODO error prompt (popup to user)
-		}
+			Log.e(ScummVM.LOG_TAG, "Error while trying to find and/or initialize ScummVM configuration file!");
+			// in fact in all the cases where we return false, we also called finish()
+		} else {
+			// We should have a valid path to a configuration file here
+
+			// Start ScummVM
+			_scummvm = new MyScummVM(main_surface.getHolder());
+
+			_scummvm.setArgs(new String[]{
+				"ScummVM",
+				"--config=" + _configScummvmFile.getPath(),
+				"--path=" + _actualScummVMDataDir.getPath(),
+				"--savepath=" + _defaultScummVMSavesDir.getPath()
+			});
+
+			Log.d(ScummVM.LOG_TAG, "Hover available: " + _hoverAvailable);
+			if (_hoverAvailable) {
+				_mouseHelper = new MouseHelper(_scummvm);
+				_mouseHelper.attach(main_surface);
+			}
 
-		_clipboard = (ClipboardManager)getSystemService(CLIPBOARD_SERVICE);
+			if (Build.VERSION.SDK_INT < Build.VERSION_CODES.HONEYCOMB_MR1) {
+				_events = new ScummVMEvents(this, _scummvm, _mouseHelper);
+			} else {
+				_events = new ScummVMEventsHoneycomb(this, _scummvm, _mouseHelper);
+			}
 
-		// Start ScummVM
-		_scummvm = new MyScummVM(main_surface.getHolder());
+			// On screen button listener
+			findViewById(R.id.show_keyboard).setOnClickListener(keyboardBtnOnClickListener);
 
-		_scummvm.setArgs(new String[] {
-		    "ScummVM",
-		    "--config=" + _configScummvmFile.getPath(),
-		    "--path=" + _actualScummVMDataDir.getPath(),
-		    "--savepath=" + _defaultScummVMSavesDir.getPath()
-		});
+			// Keyboard visibility listener
+			setKeyboardVisibilityListener(this);
 
-		Log.d(ScummVM.LOG_TAG, "Hover available: " + _hoverAvailable);
-		if (_hoverAvailable) {
-			_mouseHelper = new MouseHelper(_scummvm);
-			_mouseHelper.attach(main_surface);
-		}
+			main_surface.setOnKeyListener(_events);
+			main_surface.setOnTouchListener(_events);
 
-		if (Build.VERSION.SDK_INT < Build.VERSION_CODES.HONEYCOMB_MR1)
-		{
-			_events = new ScummVMEvents(this, _scummvm, _mouseHelper);
-		}
-		else
-		{
-			_events = new ScummVMEventsHoneycomb(this, _scummvm, _mouseHelper);
+			_scummvm_thread = new Thread(_scummvm, "ScummVM");
+			_scummvm_thread.start();
 		}
-
-		// On screen button listener
-		findViewById(R.id.show_keyboard).setOnClickListener(keyboardBtnOnClickListener);
-
-		// Keyboard visibility listener
-		setKeyboardVisibilityListener(this);
-
-		main_surface.setOnKeyListener(_events);
-		main_surface.setOnTouchListener(_events);
-
-		_scummvm_thread = new Thread(_scummvm, "ScummVM");
-		_scummvm_thread.start();
 	}
 
 	@Override
@@ -524,11 +528,15 @@ public class ScummVMActivity extends Activity implements OnKeyboardVisibilityLis
 	@RequiresApi(api = Build.VERSION_CODES.KITKAT)
 	private static void copyFileUsingStream(File source, File dest) throws IOException {
 		try (InputStream is = new FileInputStream(source); OutputStream os = new FileOutputStream(dest)) {
-			byte[] buffer = new byte[1024];
-			int length;
-			while ((length = is.read(buffer)) > 0) {
-				os.write(buffer, 0, length);
-			}
+			copyStreamToStream(is, os);
+		}
+	}
+
+	private static void copyStreamToStream(InputStream is, OutputStream os) throws IOException {
+		byte[] buffer = new byte[1024];
+		int length;
+		while ((length = is.read(buffer)) > 0) {
+			os.write(buffer, 0, length);
 		}
 	}
 
@@ -649,6 +657,7 @@ public class ScummVMActivity extends Activity implements OnKeyboardVisibilityLis
 						}
 					})
 				.show();
+			return false;
 		}
 
 		LinkedHashMap<String, File> candidateOldLocationsOfScummVMConfigMap = new LinkedHashMap<>();
@@ -746,6 +755,7 @@ public class ScummVMActivity extends Activity implements OnKeyboardVisibilityLis
 						}
 					})
 				.show();
+			return false;
 		}
 
 		if (maxOldVersionFound.compareTo(new Version("0")) != 0) {
@@ -754,6 +764,15 @@ public class ScummVMActivity extends Activity implements OnKeyboardVisibilityLis
 			Log.d(ScummVM.LOG_TAG, "No viable existing ScummVM config version found");
 		}
 
+		//
+		// TODO The assets cleanup upgrading system is not perfect but it will have to do
+		//      A more efficient way would be to compare hash (when we deem that an upgrade is happening, so we will also still have to compare versions)
+		// Note that isSideUpgrading is also true each time we re-launch the app
+		// Also even during a side-upgrade we cleanup any redundant files (no longer part of our assets)
+		boolean isSideUpgrading = (maxOldVersionFound.compareTo(_currentScummVMVersion) == 0);
+		copyAssetsToInternalMemory(isSideUpgrading);
+
+		//
 		// Set global savepath
 		// TODO what if the old save-game path is no longer accessible (due to missing SD card, or newer Android API/OS version more strict restrictions)
 		// TODO changing the save path to this, app specific location we should consider:
@@ -783,9 +802,103 @@ public class ScummVMActivity extends Activity implements OnKeyboardVisibilityLis
 						}
 					})
 				.show();
+			return false;
 		}
 
 		return true;
 	}
 
+
+	private boolean containsStringEntry(@NonNull String[] stringItenary, String targetEntry) {
+		for (String sourceEntry : stringItenary) {
+			// Log.d(ScummVM.LOG_TAG, "Comparing filename: " + sourceEntry + " to filename: " + targetEntry);
+			if (sourceEntry.compareToIgnoreCase(targetEntry) == 0) {
+				return true;
+			}
+		}
+		return false;
+	}
+
+	// clear up any possibly deprecated assets (when upgrading to a new version)
+	// Don't remove the scummvm.ini file!
+	// Remove any files not in the filesItenary, even in a sideUpgrade
+	// Remove any files in the filesItenary only if not a sideUpgrade
+	private void internalAppFolderCleanup(String[] filesItenary, boolean sideUpgrade) {
+		if (_actualScummVMDataDir != null) {
+			File[] extfiles = _actualScummVMDataDir.listFiles();
+			if (extfiles != null) {
+				Log.d(ScummVM.LOG_TAG, "Cleaning up files in internal app space");
+				for (File extfile : extfiles) {
+					if (extfile.isFile()) {
+						if (extfile.getName().compareToIgnoreCase("scummvm.ini") != 0
+							&& (!containsStringEntry(filesItenary, extfile.getName())
+								|| !sideUpgrade)
+						) {
+								Log.d(ScummVM.LOG_TAG, "Deleting file:" + extfile.getName());
+								if (!extfile.delete()) {
+									Log.e(ScummVM.LOG_TAG, "Failed to delete file:" + extfile.getName());
+								}
+						}
+					}
+				}
+			}
+		}
+	}
+
+	// code based on https://stackoverflow.com/a/4530294
+	// Note, the following assumptions are made (since they are true as of yet)
+	// - We don't need to copy (sub)folders
+	// - We copy all the files from our assets (not a subset of them)
+	// Otherwise we would probably need to create a specifically named zip file with the selection of files we'd need to extract to the internal memory
+	@RequiresApi(api = Build.VERSION_CODES.KITKAT)
+	private void copyAssetsToInternalMemory(boolean sideUpgrade) {
+		// sideUpgrade is set to true, if we upgrade to the same version -- just check for the files existence before copying
+		if (_actualScummVMDataDir != null) {
+			AssetManager assetManager = getAssets();
+			String[] files = null;
+			try {
+				files = assetManager.list("");
+			} catch (IOException e) {
+				Log.e(ScummVM.LOG_TAG, "Failed to get asset file list.", e);
+			}
+
+			internalAppFolderCleanup(files, sideUpgrade);
+
+			if (files != null) {
+				for (String filename : files) {
+					InputStream in = null;
+					OutputStream out = null;
+					try {
+						in = assetManager.open(filename);
+						File outFile = new File(_actualScummVMDataDir, filename);
+						if (sideUpgrade && outFile.exists() && outFile.isFile()) {
+							Log.d(ScummVM.LOG_TAG, "Side-upgrade. No need to update asset file: " + filename);
+						} else {
+							Log.d(ScummVM.LOG_TAG, "Copying asset file: " + filename);
+							out = new FileOutputStream(outFile);
+							copyStreamToStream(in, out);
+						}
+					} catch (IOException e) {
+						Log.e(ScummVM.LOG_TAG, "Failed to copy asset file: " + filename);
+					} finally {
+						if (in != null) {
+							try {
+								in.close();
+							} catch (IOException e) {
+								// NOOP
+							}
+						}
+						if (out != null) {
+							try {
+								out.close();
+							} catch (IOException e) {
+								// NOOP
+							}
+						}
+					}
+				}
+			}
+		}
+	}
+
 }




More information about the Scummvm-git-logs mailing list