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..7c98cb18084 100644 --- a/forge-gui-android/src/forge/app/Main.java +++ b/forge-gui-android/src/forge/app/Main.java @@ -3,8 +3,9 @@ package forge.app; import java.io.File; import java.io.InputStream; import java.io.OutputStream; -import java.util.concurrent.Callable; +import android.graphics.Point; +import com.badlogic.gdx.Gdx; import com.badlogic.gdx.Version; import com.badlogic.gdx.backends.android.AndroidApplication; @@ -16,7 +17,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 +40,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 +54,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 +138,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 +152,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 +181,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 +336,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 +428,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 +443,34 @@ 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 (Build.VERSION.SDK_INT >= 17) { + // 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);*/ + //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); + 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); + } } 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..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.*; @@ -224,5 +225,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..f1fab39920a 100644 --- a/forge-gui-mobile/src/forge/adventure/scene/RewardScene.java +++ b/forge-gui-mobile/src/forge/adventure/scene/RewardScene.java @@ -213,8 +213,12 @@ 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(); + 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); @@ -224,6 +228,9 @@ public class RewardScene extends UIScene { mul *= 0.8f; } cardHeight = bestCardHeight * 0.90f ; + if (realX > x || realY > y) { + mul *= Forge.isLandscapeMode() ? 0.95f : 1.05f; + } cardWidth = (cardHeight / CARD_WIDTH_TO_HEIGHT)*mul; yOff += (targetHeight - (cardHeight * numberOfRows)) / 2f; 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); }