[Jrisk-cvs] SF.net SVN: domination-code:[2576] Domination
Brought to you by:
yuranet
|
From: <yu...@us...> - 2024-10-15 17:56:34
|
Revision: 2576
http://sourceforge.net/p/domination/code/2576
Author: yuranet
Date: 2024-10-15 17:56:32 +0000 (Tue, 15 Oct 2024)
Log Message:
-----------
fix for android external storage bug
Modified Paths:
--------------
Domination/ChangeLog.txt
Domination/android/AndroidManifest.xml
Domination/android/build.gradle
Domination/android/src/net/yura/domination/android/AboutActivity.java
Domination/android/src/net/yura/domination/android/GameActivity.java
Domination/sharedUI/src_mapstore_lobby/net/yura/domination/mapstore/MapPreview.java
Domination/sharedUI/src_mini_game_ui/net/yura/domination/mobile/MiniUtil.java
Domination/sharedUI/src_mini_game_ui/net/yura/domination/mobile/flashgui/DominationMain.java
Domination/src/net/yura/domination/engine/RiskSettings.java
Domination/src/net/yura/domination/engine/core/RiskGame.java
Modified: Domination/ChangeLog.txt
===================================================================
--- Domination/ChangeLog.txt 2024-09-15 11:47:19 UTC (rev 2575)
+++ Domination/ChangeLog.txt 2024-10-15 17:56:32 UTC (rev 2576)
@@ -35,6 +35,7 @@
Can add custom maps through Files app
Android 94 Sound
+ Fix bug with maps not loading from external storage
1.2.9 (04.08.2023) (svn rev 2470)
Modified: Domination/android/AndroidManifest.xml
===================================================================
--- Domination/android/AndroidManifest.xml 2024-09-15 11:47:19 UTC (rev 2575)
+++ Domination/android/AndroidManifest.xml 2024-10-15 17:56:32 UTC (rev 2576)
@@ -48,6 +48,7 @@
android:isGame="true"
android:backupAgent="net.yura.domination.android.TheBackupAgent"
android:usesCleartextTraffic="true"
+ android:requestLegacyExternalStorage="true"
>
<meta-data android:name="com.google.android.gms.games.APP_ID" android:value="@string/app_id" />
Modified: Domination/android/build.gradle
===================================================================
--- Domination/android/build.gradle 2024-09-15 11:47:19 UTC (rev 2575)
+++ Domination/android/build.gradle 2024-10-15 17:56:32 UTC (rev 2576)
@@ -32,8 +32,8 @@
android {
compileOptions.encoding = 'cp1252'
- compileSdkVersion 28
- buildToolsVersion '28.0.3'
+ compileSdkVersion 34
+ buildToolsVersion '34.0.0'
// this to to avoid error from httpcore-4.1.2.jar and httpcore-4.1.2.jar having the same file
packagingOptions {
exclude 'META-INF/NOTICE.txt'
Modified: Domination/android/src/net/yura/domination/android/AboutActivity.java
===================================================================
--- Domination/android/src/net/yura/domination/android/AboutActivity.java 2024-09-15 11:47:19 UTC (rev 2575)
+++ Domination/android/src/net/yura/domination/android/AboutActivity.java 2024-10-15 17:56:32 UTC (rev 2576)
@@ -6,17 +6,26 @@
import net.yura.domination.R;
import net.yura.domination.engine.translation.TranslationBundle;
import net.yura.domination.mobile.MiniUtil;
+import net.yura.domination.mobile.flashgui.DominationMain;
import android.content.Intent;
import android.net.Uri;
+import android.os.Build;
import android.os.Bundle;
+import android.provider.DocumentsContract;
import android.view.View;
import android.webkit.WebView;
import android.webkit.WebViewClient;
import android.widget.TabHost;
import android.app.Activity;
+import androidx.documentfile.provider.DocumentFile;
public class AboutActivity extends Activity implements TabHost.TabContentFactory {
+ public static final int RC_OPEN_DOCUMENT_TREE = 5;
+
+ private static final String prefix = "file:///android_asset/";
+ private WebView aboutWebView;
+
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
@@ -35,40 +44,41 @@
tabHost.addTab( tabHost.newTabSpec("license").setIndicator( resb.getString("about.tab.license") ).setContent(factory) );
tabHost.addTab( tabHost.newTabSpec("changelog").setIndicator( resb.getString("about.tab.changelog") ).setContent(factory) );
- tabHost.setCurrentTab(0);
+ tabHost.setCurrentTab(0);
}
@Override
public View createTabContent(String tag) {
WebView webView = new WebView(this);
- final String prefix = "file:///android_asset/";
if ("about".equals(tag)) {
webView.setWebViewClient(new WebViewClient() {
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
- if (url.startsWith("file://") && !url.startsWith(prefix)) {
- try {
- Intent intent = new Intent(Intent.ACTION_VIEW);
- intent.setData(Uri.parse(url));
- startActivity(intent);
+ if ((url.startsWith("file://") || url.startsWith("content://")) && !url.startsWith(prefix)) {
+
+ // technically we can start using this API if >= lolli
+ // but its so broken and buggy in those versions so we only use it when we have to
+ // https://developer.android.com/training/data-storage/use-cases#opt-out-in-production-app
+ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) { // API-30
+ openDirectory(url);
+ return true;
}
- catch (Exception ex) {
- Logger.getLogger(AboutActivity.class.getName()).log(Level.INFO,"cant open " + url, ex);
+ else {
+ try {
+ Intent intent = new Intent(Intent.ACTION_VIEW);
+ intent.setData(Uri.parse(url));
+ startActivity(intent);
+ } catch (Exception ex) {
+ Logger.getLogger(AboutActivity.class.getName()).log(Level.INFO, "cant open " + url, ex);
+ }
+ return true;
}
- return true;
}
return super.shouldOverrideUrlLoading(view, url);
}
});
- String aboutHtml = MiniUtil.getAboutHtml();
- webView.loadDataWithBaseURL(prefix, aboutHtml, "text/html", "UTF-8", null);
-
- // OLD way of displaying html, does not support catching file:// links
- //WebSettings settings = webView.getSettings();
- //settings.setDefaultTextEncodingName("utf-8"); // UTF-8 here works on only v2 android
- // hack to fix bug on android
- //aboutHtml = aboutHtml.replace("%", "%25").replace("#", "%23").replace("'", "%27").replace("?", "%3f");
- //webView.loadData(aboutHtml, "text/html; charset=utf-8", null); // UTF-8 here works on only v4 android
+ aboutWebView = webView;
+ loadAbout();
}
else if ("credits".equals(tag)){
webView.loadUrl(prefix+"help/game_credits.htm");
@@ -84,4 +94,56 @@
}
return webView;
}
+
+ private void loadAbout() {
+ String aboutHtml = MiniUtil.getAboutHtml();
+ aboutWebView.loadDataWithBaseURL(prefix, aboutHtml, "text/html", "UTF-8", null);
+
+ // OLD way of displaying html, does not support catching file:// links
+ //WebSettings settings = webView.getSettings();
+ //settings.setDefaultTextEncodingName("utf-8"); // UTF-8 here works on only v2 android
+ // hack to fix bug on android
+ //aboutHtml = aboutHtml.replace("%", "%25").replace("#", "%23").replace("'", "%27").replace("?", "%3f");
+ //webView.loadData(aboutHtml, "text/html; charset=utf-8", null); // UTF-8 here works on only v4 android
+ }
+
+ public void openDirectory(String url) {
+ // Choose a directory using the system's file picker.
+ Intent intent = new Intent(Intent.ACTION_OPEN_DOCUMENT_TREE);
+
+ //intent.putExtra("android.provider.extra.SHOW_ADVANCED", true);
+ //intent.putExtra("android.content.extra.SHOW_ADVANCED", true);
+ intent.putExtra(DocumentsContract.EXTRA_INITIAL_URI, Uri.parse(url));
+
+ startActivityForResult(intent, RC_OPEN_DOCUMENT_TREE);
+ }
+
+ @Override
+ public void onActivityResult(int requestCode, int resultCode, Intent resultData) {
+ if (requestCode == RC_OPEN_DOCUMENT_TREE && resultCode == Activity.RESULT_OK) {
+ if (resultData != null) {
+ Uri treeUri = resultData.getData();
+
+ // DocumentsContract.buildDocumentUriUsingTree(treeUri, DocumentsContract.getTreeDocumentId(treeUri));
+ DocumentFile doc = DocumentFile.fromTreeUri(this, treeUri);
+
+ // for unknown crazy android reasons we now need to convert this tree url into a document url.
+ // treeUri = content://com.android.externalstorage.documents/tree/primary%3ADomination%20Maps
+ // documentUri = content://com.android.externalstorage.documents/tree/primary%3ADomination%20Maps/document/primary%3ADomination%20Maps
+ // childrenUri = content://com.android.externalstorage.documents/tree/primary%3ADomination%20Maps/document/primary%3ADomination%20Maps/children
+ // mapUri = content://com.android.externalstorage.documents/tree/primary%3ADomination%20Maps/document/primary%3ADomination%20Maps%2FNuclearAssaults.map
+ Uri documentUri = doc.getUri();
+ String url = documentUri.toString();
+ // as this is a folder, other parts of the app will get confused if the url does not end in /
+ if (!url.endsWith("/")) { url = url + "/"; }
+
+ // tell android to remember for future that i have access to this folder
+ getContentResolver().takePersistableUriPermission(treeUri, Intent.FLAG_GRANT_READ_URI_PERMISSION);
+ // tell the game to remember this location so it can load maps from here next time.
+ DominationMain.setExternalMapsDir(url);
+ // reload the webview to show the new location
+ loadAbout();
+ }
+ }
+ }
}
Modified: Domination/android/src/net/yura/domination/android/GameActivity.java
===================================================================
--- Domination/android/src/net/yura/domination/android/GameActivity.java 2024-09-15 11:47:19 UTC (rev 2575)
+++ Domination/android/src/net/yura/domination/android/GameActivity.java 2024-10-15 17:56:32 UTC (rev 2576)
@@ -53,6 +53,7 @@
* this code needs to not clash with other codes such as the ones in
* {@link GoogleAccount} 9000
* {@link RealTimeMultiplayer} 2,3,4
+ * {@link AboutActivity#RC_OPEN_DOCUMENT_TREE} 5
* {@link DominationMain#nativeCallsCount} 100000+
*/
private static final int RC_REQUEST_ACHIEVEMENTS = 1;
Modified: Domination/sharedUI/src_mapstore_lobby/net/yura/domination/mapstore/MapPreview.java
===================================================================
--- Domination/sharedUI/src_mapstore_lobby/net/yura/domination/mapstore/MapPreview.java 2024-09-15 11:47:19 UTC (rev 2575)
+++ Domination/sharedUI/src_mapstore_lobby/net/yura/domination/mapstore/MapPreview.java 2024-10-15 17:56:32 UTC (rev 2576)
@@ -72,6 +72,7 @@
if (prv!=null) {
prv = PREVIEW_FILE_PREFIX + prv;
if (!fileExists(prv)) {
+ Logger.info("MAP ERROR: preview file specifies but not found: " + prv);
prv=null;
}
}
Modified: Domination/sharedUI/src_mini_game_ui/net/yura/domination/mobile/MiniUtil.java
===================================================================
--- Domination/sharedUI/src_mini_game_ui/net/yura/domination/mobile/MiniUtil.java 2024-09-15 11:47:19 UTC (rev 2575)
+++ Domination/sharedUI/src_mini_game_ui/net/yura/domination/mobile/MiniUtil.java 2024-10-15 17:56:32 UTC (rev 2576)
@@ -22,6 +22,7 @@
import net.yura.mobile.gui.components.Button;
import net.yura.mobile.gui.components.OptionPane;
import net.yura.mobile.io.FileUtil;
+import javax.microedition.io.file.FileConnection;
public class MiniUtil {
@@ -82,7 +83,7 @@
String author = resb.getString("about.author") + " Yura Mamyrin (yu...@yu...)";
String c1="#DA4437",c2="#F6971D",c3="#F5EA3B",c4="#65AF45",c5="#4284F3",c6="#7E3793";
- File externalMapDir = getExternalMapDir();
+ String externalMapDirUrl = getExternalMapDir();
String version = DominationMain.version;
String versionName = System.getProperty("versionName");
@@ -124,11 +125,24 @@
displayInfo +
"<p>Locale: "+Locale.getDefault()+" use: "+resb.getLocale()+"</p>"+
"<p>Device: " + System.getProperty("microedition.platform") + "</p>"+
- (externalMapDir == null ? "" : "<p>ExternalMapDir=<a href=\"" + externalMapDir.toURI() + "\">" + externalMapDir + "</a></p>") +
+ (externalMapDirUrl == null ? "" : "<p>ExternalMapDir=<a href=\"" + externalMapDirUrl + "\">" + getLabelForUrl(externalMapDirUrl) + "</a></p>") +
// e.g. file:///storage/emulated/0/Domination%20Maps/
"</html>";
}
+ private static String getLabelForUrl(String url) {
+ if (url.startsWith("file:/")) {
+ return url;
+ }
+ try {
+ FileConnection fileConnection = FileUtil.getReadFileConnection(url);
+ return fileConnection.getName();
+ }
+ catch (Exception ex) {
+ return url;
+ }
+ }
+
public static String getStatsLabel(StatType statType, Player player) {
String note;
if (statType == StatType.COUNTRIES) {
@@ -151,15 +165,16 @@
*/
public static List getFileList(String extension) {
List result = new java.util.Vector();
+ String dotExtension = "." + extension;
- File externalMapDir = getExternalMapDir();
- if (externalMapDir != null) {
- String[] list = externalMapDir.list();
- if (list != null) {
- for (int c = 0; c < list.length; c++) {
- String file = list[c];
- if (file.endsWith("." + extension)) {
- result.add(file);
+ String externalMapDirUrl = getExternalMapDir();
+ if (externalMapDirUrl != null) {
+ Enumeration<String> files = FileUtil.getDirectoryFiles(externalMapDirUrl);
+ if (files != null) {
+ while (files.hasMoreElements()) {
+ String name = files.nextElement();
+ if (name.endsWith(dotExtension)) {
+ result.add(name);
}
}
}
@@ -168,7 +183,7 @@
Enumeration en = FileUtil.getDirectoryFiles(mapsdir);
while (en.hasMoreElements()) {
String file = (String)en.nextElement();
- if (file.endsWith("." + extension) && !result.contains(file)) {
+ if (file.endsWith(dotExtension) && !result.contains(file)) {
result.add( file );
}
}
@@ -177,7 +192,7 @@
String[] list = getSaveMapDir().list();
for (int c=0;c<list.length;c++) {
String file = list[c];
- if (file.endsWith("." + extension) && !result.contains(file)) {
+ if (file.endsWith(dotExtension) && !result.contains(file)) {
result.add( file );
}
}
@@ -187,11 +202,11 @@
public static InputStream openMapStream(String name) throws IOException {
try {
- File externalMapDir = getExternalMapDir();
- if (externalMapDir != null) {
- File newFile = new File(externalMapDir, name);
- if (newFile.exists()) {
- return new FileInputStream(newFile);
+ String externalMapDirUrl = getExternalMapDir();
+ if (externalMapDirUrl != null) {
+ FileConnection fileConnection = FileUtil.getReadFileConnection(externalMapDirUrl + name);
+ if (fileConnection.exists()) {
+ return fileConnection.openInputStream();
}
}
}
@@ -217,10 +232,13 @@
}
}
- private static File externalMapsDir;
- static File getExternalMapDir() {
- if (externalMapsDir!=null) {
- return externalMapsDir;
+ /**
+ * This is really only used for android, as on desktop and iOS you can access the main maps folder
+ */
+ private static String externalMapsDirUrl;
+ static String getExternalMapDir() {
+ if (externalMapsDirUrl != null) {
+ return externalMapsDirUrl;
}
String ExternalStorageDirectory = System.getProperty("ExternalStorageDirectory");
@@ -230,11 +248,14 @@
// return null; // if we can not make it,
//}
- externalMapsDir = userMaps;
- return userMaps;
+ externalMapsDirUrl = userMaps.toURI().toString();
+ return externalMapsDirUrl;
}
return null;
}
+ public static void setExternalMapDir(String url) {
+ externalMapsDirUrl = url;
+ }
private static File mapsDir;
public static File getSaveMapDir() {
Modified: Domination/sharedUI/src_mini_game_ui/net/yura/domination/mobile/flashgui/DominationMain.java
===================================================================
--- Domination/sharedUI/src_mini_game_ui/net/yura/domination/mobile/flashgui/DominationMain.java 2024-09-15 11:47:19 UTC (rev 2575)
+++ Domination/sharedUI/src_mini_game_ui/net/yura/domination/mobile/flashgui/DominationMain.java 2024-10-15 17:56:32 UTC (rev 2576)
@@ -341,6 +341,11 @@
if (lang != null) {
TranslationBundle.setLanguage(lang);
}
+
+ String externalMapsUrl = appPreferences.get(RiskSettings.EXTERNAL_MAPS_KEY, null);
+ if (externalMapsUrl != null) {
+ MiniUtil.setExternalMapDir(externalMapsUrl);
+ }
}
else {
System.out.println("can not load appPreferences as it is NULL!");
@@ -468,6 +473,14 @@
}
}
+ public static void setExternalMapsDir(String url) {
+ MiniUtil.setExternalMapDir(url);
+ if (appPreferences != null) {
+ DominationMain.appPreferences.put(RiskSettings.EXTERNAL_MAPS_KEY, url);
+ flushPreferences();
+ }
+ }
+
public static String getAccountsString() {
String accounts = getString("accounts", null);
// if we accidentally saved an empty string in an old version, remove it
Modified: Domination/src/net/yura/domination/engine/RiskSettings.java
===================================================================
--- Domination/src/net/yura/domination/engine/RiskSettings.java 2024-09-15 11:47:19 UTC (rev 2575)
+++ Domination/src/net/yura/domination/engine/RiskSettings.java 2024-10-15 17:56:32 UTC (rev 2576)
@@ -23,6 +23,7 @@
public static final String COLOR_BLIND_KEY = "color_blind";
public static final String FULL_SCREEN_KEY = "fullscreen";
public static final String LANGUAGE_KEY = "lang";
+ public static final String EXTERNAL_MAPS_KEY = "externalMapsDirUrl";
// default new game settings
public static final String DEFAULT_GAME_TYPE_KEY = "default.gametype";
Modified: Domination/src/net/yura/domination/engine/core/RiskGame.java
===================================================================
--- Domination/src/net/yura/domination/engine/core/RiskGame.java 2024-09-15 11:47:19 UTC (rev 2575)
+++ Domination/src/net/yura/domination/engine/core/RiskGame.java 2024-10-15 17:56:32 UTC (rev 2576)
@@ -171,7 +171,7 @@
//try {
setMapfile("default");
- setCardsfile("default");
+ setCardsfile("default"); // TODO is the really needed, setting map already sets the correct cards for that map
//}
//catch (Exception e) {
// RiskUtil.printStackTrace(e);
|