From 6b1c8d30f48f3e7da80e3a361be9e81eef858c9f Mon Sep 17 00:00:00 2001 From: Anthony Calosa Date: Mon, 1 Aug 2022 08:46:47 +0800 Subject: [PATCH 1/8] get realScreen size for android - to check if the app renders different resolution and update the tooltips size --- .../src/main/java/forge/adventure/Main.java | 6 ++ forge-gui-android/src/forge/app/Main.java | 83 +++++++++---------- forge-gui-ios/src/forge/ios/Main.java | 6 ++ forge-gui-mobile-dev/src/forge/app/Main.java | 5 ++ .../forge/adventure/scene/RewardScene.java | 14 +++- .../src/forge/adventure/util/RewardActor.java | 25 ++++-- .../java/forge/interfaces/IDeviceAdapter.java | 3 + 7 files changed, 89 insertions(+), 53 deletions(-) diff --git a/forge-adventure/src/main/java/forge/adventure/Main.java b/forge-adventure/src/main/java/forge/adventure/Main.java index dcac01e5c85..e6f6d316166 100644 --- a/forge-adventure/src/main/java/forge/adventure/Main.java +++ b/forge-adventure/src/main/java/forge/adventure/Main.java @@ -16,6 +16,7 @@ import forge.util.FileUtil; import forge.util.OperatingSystem; import forge.util.RestartUtil; import io.sentry.Sentry; +import org.apache.commons.lang3.tuple.Pair; import javax.imageio.ImageIO; import java.awt.*; @@ -186,5 +187,10 @@ public class Main { BufferedImage image = ImageIO.read(input); ImageIO.write(image, "jpg", output); } + + @Override + public Pair getRealScreenSize(boolean real) { + return Pair.of(Gdx.graphics.getWidth(), Gdx.graphics.getHeight()); + } } } diff --git a/forge-gui-android/src/forge/app/Main.java b/forge-gui-android/src/forge/app/Main.java index d21b6f3d725..6f25436bf4b 100644 --- a/forge-gui-android/src/forge/app/Main.java +++ b/forge-gui-android/src/forge/app/Main.java @@ -3,7 +3,6 @@ package forge.app; import java.io.File; import java.io.InputStream; import java.io.OutputStream; -import java.util.concurrent.Callable; import com.badlogic.gdx.Version; import com.badlogic.gdx.backends.android.AndroidApplication; @@ -16,7 +15,6 @@ import android.app.PendingIntent; import android.content.ClipData; import android.content.ClipboardManager; import android.content.Context; -import android.content.DialogInterface; import android.content.Intent; import android.content.pm.ActivityInfo; import android.content.pm.PackageManager; @@ -40,7 +38,6 @@ import android.text.style.StyleSpan; import android.util.DisplayMetrics; import android.view.Display; import android.view.Gravity; -import android.view.View; import android.view.WindowManager; import android.webkit.MimeTypeMap; import android.widget.Button; @@ -55,6 +52,7 @@ import forge.util.FileUtil; import forge.util.ThreadUtil; import io.sentry.Breadcrumb; import io.sentry.Sentry; +import org.apache.commons.lang3.tuple.Pair; //import io.sentry.android.core.SentryAndroid; public class Main extends AndroidApplication { @@ -138,15 +136,12 @@ public class Main extends AndroidApplication { button.setBackground(states); - button.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - Intent intent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS); - intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); - Uri uri = Uri.fromParts("package", getPackageName(), null); - intent.setData(uri); - startActivity(intent); - } + button.setOnClickListener(v -> { + Intent intent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS); + intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); + Uri uri = Uri.fromParts("package", getPackageName(), null); + intent.setData(uri); + startActivity(intent); }); row2.addView(button); @@ -155,12 +150,7 @@ public class Main extends AndroidApplication { TL.addView(row, new TableLayout.LayoutParams(TableLayout.LayoutParams.WRAP_CONTENT, TableLayout.LayoutParams.WRAP_CONTENT)); TL.addView(row2, new TableLayout.LayoutParams(TableLayout.LayoutParams.WRAP_CONTENT, TableLayout.LayoutParams.WRAP_CONTENT)); TL.setGravity(Gravity.CENTER); - TL.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - adapter.exit(); - } - }); + TL.setOnClickListener(v -> adapter.exit()); setContentView(TL); } @Override @@ -189,13 +179,10 @@ public class Main extends AndroidApplication { AlertDialog.Builder builder = new AlertDialog.Builder(this); builder.setTitle("Storage Permission Denied..."); builder.setMessage("This app needs storage permission to run properly.\n\n\n\n"); - builder.setPositiveButton("Open App Details", new DialogInterface.OnClickListener() { - @Override - public void onClick(DialogInterface dialog, int which) { - dialog.cancel(); - //ActivityCompat crashes... maybe it needs the appcompat v7??? - //ActivityCompat.requestPermissions(Main.this, new String[]{android.Manifest.permission.WRITE_EXTERNAL_STORAGE}, 1); - } + builder.setPositiveButton("Open App Details", (dialog, which) -> { + dialog.cancel(); + //ActivityCompat crashes... maybe it needs the appcompat v7??? + //ActivityCompat.requestPermissions(Main.this, new String[]{android.Manifest.permission.WRITE_EXTERNAL_STORAGE}, 1); }); /*builder.setNegativeButton("Cancel", new DialogInterface.OnClickListener() { @Override @@ -347,23 +334,17 @@ public class Main extends AndroidApplication { @Override public boolean isConnectedToInternet() { - return Boolean.TRUE.equals(ThreadUtil.executeWithTimeout(new Callable() { - @Override - public Boolean call() throws Exception { - NetworkInfo activeNetworkInfo = connManager.getActiveNetworkInfo(); - return activeNetworkInfo != null && activeNetworkInfo.isConnected(); - } + return Boolean.TRUE.equals(ThreadUtil.executeWithTimeout(() -> { + NetworkInfo activeNetworkInfo = connManager.getActiveNetworkInfo(); + return activeNetworkInfo != null && activeNetworkInfo.isConnected(); }, 2000)); //if can't determine Internet connection within two seconds, assume not connected } @Override public boolean isConnectedToWifi() { - return Boolean.TRUE.equals(ThreadUtil.executeWithTimeout(new Callable() { - @Override - public Boolean call() throws Exception { - NetworkInfo wifi = connManager.getNetworkInfo(ConnectivityManager.TYPE_WIFI); - return wifi.isConnected(); - } + return Boolean.TRUE.equals(ThreadUtil.executeWithTimeout(() -> { + NetworkInfo wifi = connManager.getNetworkInfo(ConnectivityManager.TYPE_WIFI); + return wifi.isConnected(); }, 2000)); //if can't determine Internet connection within two seconds, assume not connected } @@ -445,15 +426,12 @@ public class Main extends AndroidApplication { // Setting getWindow() Flags needs to run on UI thread. // Should fix android.view.ViewRoot$CalledFromWrongThreadException: // Only the original thread that created a view hierarchy can touch its views. - runOnUiThread(new Runnable() { - @Override - public void run() { - if (preventSleep) { - getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON); - } - else { - getWindow().clearFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON); - } + runOnUiThread(() -> { + if (preventSleep) { + getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON); + } + else { + getWindow().clearFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON); } }); } @@ -463,6 +441,19 @@ public class Main extends AndroidApplication { Bitmap bmp = BitmapFactory.decodeStream(input); bmp.compress(Bitmap.CompressFormat.JPEG, 100, output); } + @Override + public Pair getRealScreenSize(boolean real) { + //app size + WindowManager windowManager = (WindowManager) getApplicationContext().getSystemService(Context.WINDOW_SERVICE); + Display display = windowManager.getDefaultDisplay(); + Point size = new Point(); + if (real) + display.getRealSize(size); + else + display.getSize(size); + //real size + return Pair.of(size.x, size.y); + } } public String getDeviceName() { diff --git a/forge-gui-ios/src/forge/ios/Main.java b/forge-gui-ios/src/forge/ios/Main.java index 2936bcc3703..3ecdf0dece1 100644 --- a/forge-gui-ios/src/forge/ios/Main.java +++ b/forge-gui-ios/src/forge/ios/Main.java @@ -4,6 +4,7 @@ import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; +import org.apache.commons.lang3.tuple.Pair; import org.robovm.apple.foundation.NSAutoreleasePool; import org.robovm.apple.uikit.UIApplication; import org.robovm.apple.uikit.UIPasteboard; @@ -114,5 +115,10 @@ public class Main extends IOSApplication.Delegate { public void convertToJPEG(InputStream input, OutputStream output) throws IOException { } + + @Override + public Pair getRealScreenSize(boolean real) { + return Pair.of(Gdx.graphics.getWidth(), Gdx.graphics.getHeight()); + } } } \ No newline at end of file diff --git a/forge-gui-mobile-dev/src/forge/app/Main.java b/forge-gui-mobile-dev/src/forge/app/Main.java index 885f34d6542..074cfcd4eea 100644 --- a/forge-gui-mobile-dev/src/forge/app/Main.java +++ b/forge-gui-mobile-dev/src/forge/app/Main.java @@ -224,5 +224,10 @@ public class Main { BufferedImage image = ImageIO.read(input); ImageIO.write(image, "jpg", output); } + + @Override + public Pair getRealScreenSize(boolean real) { + return Pair.of(Gdx.graphics.getWidth(), Gdx.graphics.getHeight()); + } } } diff --git a/forge-gui-mobile/src/forge/adventure/scene/RewardScene.java b/forge-gui-mobile/src/forge/adventure/scene/RewardScene.java index 73e548af27b..bc6fc00ba48 100644 --- a/forge-gui-mobile/src/forge/adventure/scene/RewardScene.java +++ b/forge-gui-mobile/src/forge/adventure/scene/RewardScene.java @@ -213,8 +213,18 @@ public class RewardScene extends UIScene { } } float AR = 480f/270f; - float fW = Forge.isLandscapeMode() ? Forge.getScreenWidth() : Forge.getScreenHeight(); - float fH = Forge.isLandscapeMode() ? Forge.getScreenHeight() : Forge.getScreenWidth(); + int x = Forge.getDeviceAdapter().getRealScreenSize(false).getLeft(); + int y = Forge.getDeviceAdapter().getRealScreenSize(false).getRight(); + int realX = Forge.getDeviceAdapter().getRealScreenSize(true).getLeft(); + int realY = Forge.getDeviceAdapter().getRealScreenSize(true).getRight(); + if (realX > x || realY > y) { + if (x > y) + x *= 1.1f; + else + y *= 1.1f; + } + float fW = x > y ? x : y; + float fH = x > y ? y : x; float mul = fW/fH < AR ? AR/(fW/fH) : (fW/fH)/AR; if (fW/fH >= 2f) {//tall display mul = (fW/fH) - ((fW/fH)/AR); diff --git a/forge-gui-mobile/src/forge/adventure/util/RewardActor.java b/forge-gui-mobile/src/forge/adventure/util/RewardActor.java index 4cda3d85fa3..e19d9aa93ee 100644 --- a/forge-gui-mobile/src/forge/adventure/util/RewardActor.java +++ b/forge-gui-mobile/src/forge/adventure/util/RewardActor.java @@ -349,8 +349,17 @@ public class RewardActor extends Actor implements Disposable, ImageFetcher.Callb newW = (newH * origW) / origH; } float AR = 480f/270f; - float fW = Forge.isLandscapeMode() ? Forge.getScreenWidth() : Forge.getScreenHeight(); - float fH = Forge.isLandscapeMode() ? Forge.getScreenHeight() : Forge.getScreenWidth(); + int x = Forge.getDeviceAdapter().getRealScreenSize(false).getLeft(); + int y = Forge.getDeviceAdapter().getRealScreenSize(false).getRight(); + int realX = Forge.getDeviceAdapter().getRealScreenSize(true).getLeft(); + int realY = Forge.getDeviceAdapter().getRealScreenSize(true).getRight(); + if (realX > x) { + x *= 1.1f; + } else if (realY > y) { + y *= 1.1f; + } + float fW = x > y ? x : y; + float fH = x > y ? y : x; float mul = fW/fH < AR ? AR/(fW/fH) : (fW/fH)/AR; if (fW/fH >= 2f) {//tall display mul = (fW/fH) - ((fW/fH)/AR); @@ -678,9 +687,15 @@ public class RewardActor extends Actor implements Disposable, ImageFetcher.Callb actor.getStage().addActor(switchButton); } //Vector2 point = actor.localToStageCoordinates(tmp.set(x, y)); - tooltip_actor.setX(Scene.getIntendedWidth() / 2 - tooltip_actor.getWidth() / 2); - //if (tooltip_actor.getX() + tooltip_actor.getWidth() > Scene.getIntendedWidth()) - //tooltip_actor.setX(Math.max(0,actor.getX() - tooltip_actor.getWidth())); + if (Forge.isLandscapeMode()) { + //right if poosible, if exceeds width, draw left + tooltip_actor.setX(actor.getRight()); + if (tooltip_actor.getX() + tooltip_actor.getWidth() > Scene.getIntendedWidth()) + tooltip_actor.setX(Math.max(0,actor.getX() - tooltip_actor.getWidth())); + } else { + //middle + tooltip_actor.setX(Scene.getIntendedWidth() / 2 - tooltip_actor.getWidth() / 2); + } tooltip_actor.setY(Scene.getIntendedHeight() / 2 - tooltip_actor.getHeight() / 2); //tooltip_actor.setX(480/2 - tooltip_actor.getWidth()/2); //480 hud width //tooltip_actor.setY(270/2-tooltip_actor.getHeight()/2); //270 hud height diff --git a/forge-gui/src/main/java/forge/interfaces/IDeviceAdapter.java b/forge-gui/src/main/java/forge/interfaces/IDeviceAdapter.java index 06361f28bc7..3fcf2cacb32 100644 --- a/forge-gui/src/main/java/forge/interfaces/IDeviceAdapter.java +++ b/forge-gui/src/main/java/forge/interfaces/IDeviceAdapter.java @@ -1,5 +1,7 @@ package forge.interfaces; +import org.apache.commons.lang3.tuple.Pair; + import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; @@ -15,4 +17,5 @@ public interface IDeviceAdapter { void restart(); void exit(); void convertToJPEG(InputStream input, OutputStream output) throws IOException; + Pair getRealScreenSize(boolean real); } From 2c0075fae3dbf8e2e323e7ee57bd16300e1ef31f Mon Sep 17 00:00:00 2001 From: Anthony Calosa Date: Mon, 1 Aug 2022 08:53:10 +0800 Subject: [PATCH 2/8] Update Main.java --- forge-gui-mobile-dev/src/forge/app/Main.java | 1 + 1 file changed, 1 insertion(+) diff --git a/forge-gui-mobile-dev/src/forge/app/Main.java b/forge-gui-mobile-dev/src/forge/app/Main.java index 074cfcd4eea..d44e10a6b25 100644 --- a/forge-gui-mobile-dev/src/forge/app/Main.java +++ b/forge-gui-mobile-dev/src/forge/app/Main.java @@ -13,6 +13,7 @@ import forge.util.OperatingSystem; import forge.util.RestartUtil; import forge.util.Utils; import org.apache.commons.cli.*; +import org.apache.commons.lang3.tuple.Pair; import javax.imageio.ImageIO; import java.awt.*; From a72164d5f4250f5ac9440ed7bfb77d0dce1c9758 Mon Sep 17 00:00:00 2001 From: Anthony Calosa Date: Mon, 1 Aug 2022 09:02:56 +0800 Subject: [PATCH 3/8] Update Main.java --- forge-gui-android/src/forge/app/Main.java | 1 + 1 file changed, 1 insertion(+) diff --git a/forge-gui-android/src/forge/app/Main.java b/forge-gui-android/src/forge/app/Main.java index 6f25436bf4b..fb4a8e456f9 100644 --- a/forge-gui-android/src/forge/app/Main.java +++ b/forge-gui-android/src/forge/app/Main.java @@ -4,6 +4,7 @@ import java.io.File; import java.io.InputStream; import java.io.OutputStream; +import android.graphics.Point; import com.badlogic.gdx.Version; import com.badlogic.gdx.backends.android.AndroidApplication; From 2a0f25a5f743bd9718de464e113cdf4e7fdcd3e6 Mon Sep 17 00:00:00 2001 From: Anthony Calosa Date: Mon, 1 Aug 2022 09:31:12 +0800 Subject: [PATCH 4/8] Update Main.java --- forge-gui-android/src/forge/app/Main.java | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/forge-gui-android/src/forge/app/Main.java b/forge-gui-android/src/forge/app/Main.java index fb4a8e456f9..0a956eea17b 100644 --- a/forge-gui-android/src/forge/app/Main.java +++ b/forge-gui-android/src/forge/app/Main.java @@ -5,6 +5,7 @@ import java.io.InputStream; import java.io.OutputStream; import android.graphics.Point; +import com.badlogic.gdx.Gdx; import com.badlogic.gdx.Version; import com.badlogic.gdx.backends.android.AndroidApplication; @@ -448,12 +449,13 @@ public class Main extends AndroidApplication { WindowManager windowManager = (WindowManager) getApplicationContext().getSystemService(Context.WINDOW_SERVICE); Display display = windowManager.getDefaultDisplay(); Point size = new Point(); - if (real) + /*if (real) display.getRealSize(size); else display.getSize(size); //real size - return Pair.of(size.x, size.y); + return Pair.of(size.x, size.y);*/ //method works only on Build.VERSION.SDK_INT >= 17 (4.2), need to update android dependency from 4.1.1.4 to at least 8.0 + return Pair.of(Gdx.graphics.getWidth(), Gdx.graphics.getHeight()); } } From f840bd118f56f1b93dbfdd684b581fd1963ccde3 Mon Sep 17 00:00:00 2001 From: Anthony Calosa Date: Mon, 1 Aug 2022 09:49:20 +0800 Subject: [PATCH 5/8] Update RewardScene.java --- .../src/forge/adventure/scene/RewardScene.java | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/forge-gui-mobile/src/forge/adventure/scene/RewardScene.java b/forge-gui-mobile/src/forge/adventure/scene/RewardScene.java index bc6fc00ba48..0d374b3cfcb 100644 --- a/forge-gui-mobile/src/forge/adventure/scene/RewardScene.java +++ b/forge-gui-mobile/src/forge/adventure/scene/RewardScene.java @@ -217,12 +217,6 @@ public class RewardScene extends UIScene { int y = Forge.getDeviceAdapter().getRealScreenSize(false).getRight(); int realX = Forge.getDeviceAdapter().getRealScreenSize(true).getLeft(); int realY = Forge.getDeviceAdapter().getRealScreenSize(true).getRight(); - if (realX > x || realY > y) { - if (x > y) - x *= 1.1f; - else - y *= 1.1f; - } float fW = x > y ? x : y; float fH = x > y ? y : x; float mul = fW/fH < AR ? AR/(fW/fH) : (fW/fH)/AR; @@ -234,6 +228,9 @@ public class RewardScene extends UIScene { mul *= 0.8f; } cardHeight = bestCardHeight * 0.90f ; + if (realX > x || realY > y) { + mul *= Forge.isLandscapeMode() ? 0.9f : 1.1f; + } cardWidth = (cardHeight / CARD_WIDTH_TO_HEIGHT)*mul; yOff += (targetHeight - (cardHeight * numberOfRows)) / 2f; From 9505657e303cd5439b6fab4a3fa51d71d25a4d1d Mon Sep 17 00:00:00 2001 From: Anthony Calosa Date: Mon, 1 Aug 2022 15:57:15 +0800 Subject: [PATCH 6/8] add alternate method --- forge-gui-android/src/forge/app/Main.java | 25 ++++++++++++++++------- 1 file changed, 18 insertions(+), 7 deletions(-) diff --git a/forge-gui-android/src/forge/app/Main.java b/forge-gui-android/src/forge/app/Main.java index 0a956eea17b..360c337a20a 100644 --- a/forge-gui-android/src/forge/app/Main.java +++ b/forge-gui-android/src/forge/app/Main.java @@ -449,13 +449,24 @@ public class Main extends AndroidApplication { WindowManager windowManager = (WindowManager) getApplicationContext().getSystemService(Context.WINDOW_SERVICE); Display display = windowManager.getDefaultDisplay(); Point size = new Point(); - /*if (real) - display.getRealSize(size); - else - display.getSize(size); - //real size - return Pair.of(size.x, size.y);*/ //method works only on Build.VERSION.SDK_INT >= 17 (4.2), need to update android dependency from 4.1.1.4 to at least 8.0 - return Pair.of(Gdx.graphics.getWidth(), Gdx.graphics.getHeight()); + if (Build.VERSION.SDK_INT >= 17) { + if (real) + display.getRealSize(size); + else + display.getSize(size); + } else if (Build.VERSION.SDK_INT >= 14) { + try { + size.x = (Integer) Display.class.getMethod("getRawWidth").invoke(display); + size.y = (Integer) Display.class.getMethod("getRawHeight").invoke(display); + } catch (Exception e) { + size.x = Gdx.graphics.getWidth(); + size.y = Gdx.graphics.getHeight(); + } + } else { + size.x = Gdx.graphics.getWidth(); + size.y = Gdx.graphics.getHeight(); + } + return Pair.of(size.x, size.y); } } From 27877ab10282b2874fb24d48c78b5bb58fa2e498 Mon Sep 17 00:00:00 2001 From: Anthony Calosa Date: Mon, 1 Aug 2022 16:09:49 +0800 Subject: [PATCH 7/8] Update Main.java --- forge-gui-android/src/forge/app/Main.java | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/forge-gui-android/src/forge/app/Main.java b/forge-gui-android/src/forge/app/Main.java index 360c337a20a..7c98cb18084 100644 --- a/forge-gui-android/src/forge/app/Main.java +++ b/forge-gui-android/src/forge/app/Main.java @@ -450,10 +450,13 @@ public class Main extends AndroidApplication { Display display = windowManager.getDefaultDisplay(); Point size = new Point(); if (Build.VERSION.SDK_INT >= 17) { - if (real) + // Seems it doesn't compile if using 4.1.1.4 since it's missing this method + /*if (real) display.getRealSize(size); else - display.getSize(size); + display.getSize(size);*/ + //remove this line below and use the method above if using Android libs higher than 4.1.1.4 + return Pair.of(Gdx.graphics.getWidth(), Gdx.graphics.getHeight()); // this method don't take account the soft navigation bars taken in rendered screen } else if (Build.VERSION.SDK_INT >= 14) { try { size.x = (Integer) Display.class.getMethod("getRawWidth").invoke(display); From f5bfdf3fda9740535f5beebd83a8eb573386a06b Mon Sep 17 00:00:00 2001 From: Anthony Calosa Date: Mon, 1 Aug 2022 16:14:34 +0800 Subject: [PATCH 8/8] Update RewardScene.java minor adjustment --- forge-gui-mobile/src/forge/adventure/scene/RewardScene.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/forge-gui-mobile/src/forge/adventure/scene/RewardScene.java b/forge-gui-mobile/src/forge/adventure/scene/RewardScene.java index 0d374b3cfcb..f1fab39920a 100644 --- a/forge-gui-mobile/src/forge/adventure/scene/RewardScene.java +++ b/forge-gui-mobile/src/forge/adventure/scene/RewardScene.java @@ -229,7 +229,7 @@ public class RewardScene extends UIScene { } cardHeight = bestCardHeight * 0.90f ; if (realX > x || realY > y) { - mul *= Forge.isLandscapeMode() ? 0.9f : 1.1f; + mul *= Forge.isLandscapeMode() ? 0.95f : 1.05f; } cardWidth = (cardHeight / CARD_WIDTH_TO_HEIGHT)*mul;