diff --git a/.gitattributes b/.gitattributes index 86411b6f9be..1e2d4b7a2cf 100644 --- a/.gitattributes +++ b/.gitattributes @@ -690,6 +690,7 @@ forge-gui-android/res/drawable-xhdpi/ic_launcher.png -text forge-gui-android/res/drawable-xxhdpi/ic_launcher.png -text forge-gui-android/res/layout/main.xml -text forge-gui-android/res/values/strings.xml -text +forge-gui-android/src/forge/app/Exiter.java -text forge-gui-android/src/forge/app/Main.java -text forge-gui-desktop/.classpath -text forge-gui-desktop/.project -text diff --git a/forge-gui-android/AndroidManifest.xml b/forge-gui-android/AndroidManifest.xml index d100064afdf..833ea4a287b 100644 --- a/forge-gui-android/AndroidManifest.xml +++ b/forge-gui-android/AndroidManifest.xml @@ -10,7 +10,8 @@ - + + + android:label="@string/app_name"> - + + diff --git a/forge-gui-android/pom.xml b/forge-gui-android/pom.xml index 3db012c619d..b8341b87881 100644 --- a/forge-gui-android/pom.xml +++ b/forge-gui-android/pom.xml @@ -356,13 +356,6 @@ - - - - - diff --git a/forge-gui-android/src/forge/app/Exiter.java b/forge-gui-android/src/forge/app/Exiter.java new file mode 100644 index 00000000000..dd48314c8b5 --- /dev/null +++ b/forge-gui-android/src/forge/app/Exiter.java @@ -0,0 +1,14 @@ +package forge.app; + +import android.app.Activity; +import android.os.Bundle; + +public class Exiter extends Activity { + @Override + protected void onCreate(Bundle savedInstanceState) { + finish(); + + //ensure process fully killed + System.exit(0); + } +} diff --git a/forge-gui-android/src/forge/app/Main.java b/forge-gui-android/src/forge/app/Main.java index 7d7a0c02667..4b72fbd253f 100644 --- a/forge-gui-android/src/forge/app/Main.java +++ b/forge-gui-android/src/forge/app/Main.java @@ -1,7 +1,6 @@ package forge.app; import java.io.File; - import android.content.ClipData; import android.content.ClipboardManager; import android.content.Context; @@ -20,7 +19,6 @@ import com.badlogic.gdx.backends.android.AndroidApplication; import forge.Forge; import forge.interfaces.IDeviceAdapter; -import forge.util.Callback; import forge.util.FileUtil; public class Main extends AndroidApplication { @@ -34,47 +32,34 @@ public class Main extends AndroidApplication { this.setRequestedOrientation(7); } + AndroidAdapter adapter = new AndroidAdapter(); + //establish assets directory if (!Environment.MEDIA_MOUNTED.equals(Environment.getExternalStorageState())) { Gdx.app.error("Forge", "Can't access external storage"); - Gdx.app.exit(); + adapter.exit(); return; } String assetsDir = Environment.getExternalStorageDirectory() + "/Forge/"; if (!FileUtil.ensureDirectoryExists(assetsDir)) { Gdx.app.error("Forge", "Can't access external storage"); - Gdx.app.exit(); + adapter.exit(); return; } - initialize(Forge.getApp(new AndroidClipboard(), new AndroidAdapter(), - assetsDir, new Callback() { - @Override - public void run(String runOnExit) { - if (runOnExit != null) { - runFile(runOnExit); - } - - //ensure process doesn't stick around after exiting - finish(); - System.exit(0); - } - })); + initialize(Forge.getApp(new AndroidClipboard(), adapter, assetsDir)); } - private void runFile(String filename) { - try { - Intent intent = new Intent(Intent.ACTION_VIEW); - Uri uri = Uri.fromFile(new File(filename)); - String type = MimeTypeMap.getSingleton().getMimeTypeFromExtension( - MimeTypeMap.getFileExtensionFromUrl(uri.toString())); - intent.setDataAndType(uri, type); - startActivity(intent); - } - catch (Exception e) { - e.printStackTrace(); - } - } + /*@Override + protected void onDestroy() { + super.onDestroy(); + + //ensure app doesn't stick around + //ActivityManager am = (ActivityManager)getSystemService(Activity.ACTIVITY_SERVICE); + //am.killBackgroundProcesses(getApplicationContext().getPackageName()); + + + }*/ //special clipboard that words on Android private class AndroidClipboard implements com.badlogic.gdx.utils.Clipboard { @@ -118,5 +103,34 @@ public class Main extends AndroidApplication { public String getDownloadsDir() { return Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS) + "/"; } + + @Override + public boolean openFile(String filename) { + try { + Intent intent = new Intent(Intent.ACTION_VIEW); + Uri uri = Uri.fromFile(new File(filename)); + String type = MimeTypeMap.getSingleton().getMimeTypeFromExtension( + MimeTypeMap.getFileExtensionFromUrl(uri.toString())); + intent.setDataAndType(uri, type); + startActivity(intent); + return true; + } + catch (Exception e) { + e.printStackTrace(); + } + return false; + } + + @Override + public void exit() { + // Replace the current task with one that is excluded from the recent + // apps and that will finish itself immediately. It's critical that this + // activity get launched in the task that you want to hide. + final Intent relaunch = new Intent(Main.this, Exiter.class) + .addFlags(Intent.FLAG_ACTIVITY_NEW_TASK // CLEAR_TASK requires this + | Intent.FLAG_ACTIVITY_CLEAR_TASK // finish everything else in the task + | Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS); // hide (remove, in this case) task from recents + startActivity(relaunch); + } } } diff --git a/forge-gui-mobile-dev/src/forge/app/Main.java b/forge-gui-mobile-dev/src/forge/app/Main.java index ee9b7bba7ed..c50702e3664 100644 --- a/forge-gui-mobile-dev/src/forge/app/Main.java +++ b/forge-gui-mobile-dev/src/forge/app/Main.java @@ -1,5 +1,10 @@ package forge.app; +import java.awt.Desktop; +import java.io.File; +import java.io.IOException; + +import com.badlogic.gdx.Gdx; import com.badlogic.gdx.backends.lwjgl.LwjglApplication; import com.badlogic.gdx.backends.lwjgl.LwjglClipboard; @@ -17,7 +22,7 @@ public class Main { } new LwjglApplication(Forge.getApp(new LwjglClipboard(), new DesktopAdapter(), - assetsDir, null), "Forge", Utils.DEV_SCREEN_WIDTH, Utils.DEV_SCREEN_HEIGHT); + assetsDir), "Forge", Utils.DEV_SCREEN_WIDTH, Utils.DEV_SCREEN_HEIGHT); } private static class DesktopAdapter implements IDeviceAdapter { @@ -36,5 +41,22 @@ public class Main { public String getDownloadsDir() { return System.getProperty("user.home") + "/Downloads/"; } + + @Override + public boolean openFile(String filename) { + try { + Desktop.getDesktop().open(new File(filename)); + return true; + } + catch (IOException e) { + e.printStackTrace(); + } + return false; + } + + @Override + public void exit() { + Gdx.app.exit(); //can just use Gdx.app.exit for desktop + } } } diff --git a/forge-gui-mobile/src/forge/Forge.java b/forge-gui-mobile/src/forge/Forge.java index 3406cc4308a..4cd48eaec47 100644 --- a/forge-gui-mobile/src/forge/Forge.java +++ b/forge-gui-mobile/src/forge/Forge.java @@ -42,23 +42,20 @@ public class Forge implements ApplicationListener { private static final ApplicationListener app = new Forge(); private static Clipboard clipboard; private static IDeviceAdapter deviceAdapter; - private static Callback onExit; private static int screenWidth; private static int screenHeight; private static Graphics graphics; private static FScreen currentScreen; private static SplashScreen splashScreen; private static KeyInputAdapter keyInputAdapter; - private static String runAfterExit; private static boolean exited; private static final SoundSystem soundSystem = new SoundSystem(); private static final Stack screens = new Stack(); - public static ApplicationListener getApp(Clipboard clipboard0, IDeviceAdapter deviceAdapter0, String assetDir0, Callback onExit0) { + public static ApplicationListener getApp(Clipboard clipboard0, IDeviceAdapter deviceAdapter0, String assetDir0) { if (GuiBase.getInterface() == null) { clipboard = clipboard0; deviceAdapter = deviceAdapter0; - onExit = onExit0; GuiBase.setInterface(new GuiMobile(assetDir0)); } return app; @@ -145,7 +142,7 @@ public class Forge implements ApplicationListener { public static void back() { if (screens.size() < 2) { - exit(false, null); //prompt to exit if attempting to go back from home screen + exit(false); //prompt to exit if attempting to go back from home screen return; } currentScreen.onClose(new Callback() { @@ -159,7 +156,7 @@ public class Forge implements ApplicationListener { }); } - public static void exit(boolean silent, final String runAfterExit0) { + public static void exit(boolean silent) { if (exited) { return; } //don't allow exiting multiple times Callback callback = new Callback() { @@ -167,8 +164,7 @@ public class Forge implements ApplicationListener { public void run(Boolean result) { if (result) { exited = true; - runAfterExit = runAfterExit0; - Gdx.app.exit(); + deviceAdapter.exit(); } } }; @@ -291,10 +287,6 @@ public class Forge implements ApplicationListener { screens.clear(); graphics.dispose(); soundSystem.dispose(); - - if (onExit != null) { - onExit.run(runAfterExit); - } } //log message to Forge.log file diff --git a/forge-gui-mobile/src/forge/assets/AssetsDownloader.java b/forge-gui-mobile/src/forge/assets/AssetsDownloader.java index 9b24cbaace6..fd75b1584f3 100644 --- a/forge-gui-mobile/src/forge/assets/AssetsDownloader.java +++ b/forge-gui-mobile/src/forge/assets/AssetsDownloader.java @@ -56,7 +56,8 @@ public class AssetsDownloader { "http://cardforge.org/android/releases/forge/forge-gui-android/" + version + "/", Forge.getDeviceAdapter().getDownloadsDir(), splashScreen.getProgressBar()); if (apkFile != null) { - Forge.exit(true, apkFile); + Forge.getDeviceAdapter().openFile(apkFile); + Forge.exit(true); return; } SOptionPane.showMessageDialog("Could not download update. " + @@ -77,7 +78,7 @@ public class AssetsDownloader { } catch (IOException e) { e.printStackTrace(); - Forge.exit(true, null); //can't continue if this fails + Forge.exit(true); //can't continue if this fails return; } } @@ -99,7 +100,7 @@ public class AssetsDownloader { } SOptionPane.showMessageDialog(message, "No Internet Connection"); if (!canIgnoreDownload) { - Forge.exit(true, null); //exit if can't ignore download + Forge.exit(true); //exit if can't ignore download } return; } @@ -127,11 +128,11 @@ public class AssetsDownloader { null, options)) { case 1: if (!canIgnoreDownload) { - Forge.exit(true, null); //exit if can't ignore download + Forge.exit(true); //exit if can't ignore download } return; case 2: - Forge.exit(true, null); + Forge.exit(true); return; } diff --git a/forge-gui-mobile/src/forge/error/BugReportDialog.java b/forge-gui-mobile/src/forge/error/BugReportDialog.java index cb82450174a..d790ba13917 100644 --- a/forge-gui-mobile/src/forge/error/BugReportDialog.java +++ b/forge-gui-mobile/src/forge/error/BugReportDialog.java @@ -62,7 +62,7 @@ public class BugReportDialog extends FScreen { //use screen rather than dialog s btnExit.setCommand(new FEventHandler() { @Override public void handleEvent(FEvent e) { - Forge.exit(true, null); + Forge.exit(true); } }); } diff --git a/forge-gui/src/main/java/forge/interfaces/IDeviceAdapter.java b/forge-gui/src/main/java/forge/interfaces/IDeviceAdapter.java index d5f58708aef..9976713feaa 100644 --- a/forge-gui/src/main/java/forge/interfaces/IDeviceAdapter.java +++ b/forge-gui/src/main/java/forge/interfaces/IDeviceAdapter.java @@ -4,4 +4,6 @@ public interface IDeviceAdapter { boolean isConnectedToInternet(); boolean isConnectedToWifi(); String getDownloadsDir(); + boolean openFile(String filename); + void exit(); }