Browse Source

Misc editor tweaks and polishes:
- Using a bucketized approach to select the editor scale in order to avoid too high values
- Add default app dimensions: used on Android devices with free floating app windows to set the default app frame
- Add ability to launch the Game window in an adjacent frame when in multi window mode

(cherry picked from commit 6f7ec7f723d3e479ef1ee6e1f619432bac7f2ee0)

Fredia Huya-Kouadio 3 years ago
parent
commit
05fc140ee6

+ 1 - 1
platform/android/java/app/config.gradle

@@ -1,6 +1,6 @@
 ext.versions = [
 ext.versions = [
     androidGradlePlugin: '7.0.3',
     androidGradlePlugin: '7.0.3',
-    compileSdk         : 30,
+    compileSdk         : 31,
     minSdk             : 19, // Also update 'platform/android/java/lib/AndroidManifest.xml#minSdkVersion' & 'platform/android/export/export_plugin.cpp#DEFAULT_MIN_SDK_VERSION'
     minSdk             : 19, // Also update 'platform/android/java/lib/AndroidManifest.xml#minSdkVersion' & 'platform/android/export/export_plugin.cpp#DEFAULT_MIN_SDK_VERSION'
     targetSdk          : 30, // Also update 'platform/android/java/lib/AndroidManifest.xml#targetSdkVersion' & 'platform/android/export/export_plugin.cpp#DEFAULT_TARGET_SDK_VERSION'
     targetSdk          : 30, // Also update 'platform/android/java/lib/AndroidManifest.xml#targetSdkVersion' & 'platform/android/export/export_plugin.cpp#DEFAULT_TARGET_SDK_VERSION'
     buildTools         : '30.0.3',
     buildTools         : '30.0.3',

+ 2 - 0
platform/android/java/editor/build.gradle

@@ -8,6 +8,8 @@ dependencies {
     implementation libraries.kotlinStdLib
     implementation libraries.kotlinStdLib
     implementation libraries.androidxFragment
     implementation libraries.androidxFragment
     implementation project(":lib")
     implementation project(":lib")
+
+    implementation "androidx.window:window:1.0.0"
 }
 }
 
 
 android {
 android {

+ 7 - 0
platform/android/java/editor/src/main/AndroidManifest.xml

@@ -34,6 +34,9 @@
             android:theme="@android:style/Theme.Black.NoTitleBar.Fullscreen"
             android:theme="@android:style/Theme.Black.NoTitleBar.Fullscreen"
             android:process=":GodotProjectManager">
             android:process=":GodotProjectManager">
 
 
+            <layout android:defaultHeight="@dimen/editor_default_window_height"
+                android:defaultWidth="@dimen/editor_default_window_width" />
+
             <intent-filter>
             <intent-filter>
                 <action android:name="android.intent.action.MAIN" />
                 <action android:name="android.intent.action.MAIN" />
                 <category android:name="android.intent.category.LAUNCHER" />
                 <category android:name="android.intent.category.LAUNCHER" />
@@ -47,6 +50,8 @@
             android:launchMode="singleTask"
             android:launchMode="singleTask"
             android:screenOrientation="userLandscape"
             android:screenOrientation="userLandscape"
             android:theme="@android:style/Theme.Black.NoTitleBar.Fullscreen">
             android:theme="@android:style/Theme.Black.NoTitleBar.Fullscreen">
+            <layout android:defaultHeight="@dimen/editor_default_window_height"
+                android:defaultWidth="@dimen/editor_default_window_width" />
         </activity>
         </activity>
 
 
         <activity
         <activity
@@ -57,6 +62,8 @@
             android:launchMode="singleTask"
             android:launchMode="singleTask"
             android:screenOrientation="userLandscape"
             android:screenOrientation="userLandscape"
             android:theme="@android:style/Theme.Black.NoTitleBar.Fullscreen">
             android:theme="@android:style/Theme.Black.NoTitleBar.Fullscreen">
+            <layout android:defaultHeight="@dimen/editor_default_window_height"
+                android:defaultWidth="@dimen/editor_default_window_width" />
         </activity>
         </activity>
 
 
     </application>
     </application>

+ 28 - 1
platform/android/java/editor/src/main/java/org/godotengine/editor/GodotEditor.java

@@ -34,10 +34,13 @@ import org.godotengine.godot.FullScreenGodotApp;
 import org.godotengine.godot.utils.PermissionsUtil;
 import org.godotengine.godot.utils.PermissionsUtil;
 
 
 import android.content.Intent;
 import android.content.Intent;
+import android.os.Build;
 import android.os.Bundle;
 import android.os.Bundle;
 import android.os.Debug;
 import android.os.Debug;
 
 
 import androidx.annotation.Nullable;
 import androidx.annotation.Nullable;
+import androidx.window.layout.WindowMetrics;
+import androidx.window.layout.WindowMetricsCalculator;
 
 
 import java.util.ArrayList;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Arrays;
@@ -91,23 +94,47 @@ public class GodotEditor extends FullScreenGodotApp {
 	public void onNewGodotInstanceRequested(String[] args) {
 	public void onNewGodotInstanceRequested(String[] args) {
 		// Parse the arguments to figure out which activity to start.
 		// Parse the arguments to figure out which activity to start.
 		Class<?> targetClass = GodotGame.class;
 		Class<?> targetClass = GodotGame.class;
+		// Whether we should launch the new godot instance in an adjacent window
+		// https://developer.android.com/reference/android/content/Intent#FLAG_ACTIVITY_LAUNCH_ADJACENT
+		boolean launchAdjacent = Build.VERSION.SDK_INT >= Build.VERSION_CODES.N && (isInMultiWindowMode() || isLargeScreen());
+
 		for (String arg : args) {
 		for (String arg : args) {
 			if (EDITOR_ARG.equals(arg)) {
 			if (EDITOR_ARG.equals(arg)) {
 				targetClass = GodotEditor.class;
 				targetClass = GodotEditor.class;
+				launchAdjacent = false;
 				break;
 				break;
 			}
 			}
 
 
 			if (PROJECT_MANAGER_ARG.equals(arg)) {
 			if (PROJECT_MANAGER_ARG.equals(arg)) {
 				targetClass = GodotProjectManager.class;
 				targetClass = GodotProjectManager.class;
+				launchAdjacent = false;
 				break;
 				break;
 			}
 			}
 		}
 		}
 
 
 		// Launch a new activity
 		// Launch a new activity
-		Intent newInstance = new Intent(this, targetClass).putExtra(COMMAND_LINE_PARAMS, args);
+		Intent newInstance = new Intent(this, targetClass)
+									 .addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
+									 .putExtra(COMMAND_LINE_PARAMS, args);
+		if (launchAdjacent) {
+			newInstance.addFlags(Intent.FLAG_ACTIVITY_LAUNCH_ADJACENT);
+		}
 		startActivity(newInstance);
 		startActivity(newInstance);
 	}
 	}
 
 
+	protected boolean isLargeScreen() {
+		WindowMetrics metrics =
+				WindowMetricsCalculator.getOrCreate().computeMaximumWindowMetrics(this);
+
+		// Get the screen's density scale
+		float scale = getResources().getDisplayMetrics().density;
+
+		// Get the minimum window size
+		float minSize = Math.min(metrics.getBounds().width(), metrics.getBounds().height());
+		float minSizeDp = minSize / scale;
+		return minSizeDp >= 840f; // Correspond to the EXPANDED window size class.
+	}
+
 	@Override
 	@Override
 	public void setRequestedOrientation(int requestedOrientation) {
 	public void setRequestedOrientation(int requestedOrientation) {
 		if (!overrideOrientationRequest()) {
 		if (!overrideOrientationRequest()) {

+ 5 - 0
platform/android/java/editor/src/main/res/values/dimens.xml

@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8"?>
+<resources>
+	<dimen name="editor_default_window_height">600dp</dimen>
+	<dimen name="editor_default_window_width">800dp</dimen>
+</resources>

+ 21 - 3
platform/android/java/lib/src/org/godotengine/godot/GodotIO.java

@@ -224,12 +224,30 @@ public class GodotIO {
 	}
 	}
 
 
 	public int getScreenDPI() {
 	public int getScreenDPI() {
-		DisplayMetrics metrics = activity.getResources().getDisplayMetrics();
-		return (int)(metrics.density * 160f);
+		return activity.getResources().getDisplayMetrics().densityDpi;
 	}
 	}
 
 
+	/**
+	 * Returns bucketized density values.
+	 */
 	public float getScaledDensity() {
 	public float getScaledDensity() {
-		return activity.getResources().getDisplayMetrics().scaledDensity;
+		int densityDpi = activity.getResources().getDisplayMetrics().densityDpi;
+		float selectedScaledDensity;
+		if (densityDpi >= DisplayMetrics.DENSITY_XXXHIGH) {
+			selectedScaledDensity = 4.0f;
+		} else if (densityDpi >= DisplayMetrics.DENSITY_XXHIGH) {
+			selectedScaledDensity = 3.0f;
+		} else if (densityDpi >= DisplayMetrics.DENSITY_XHIGH) {
+			selectedScaledDensity = 2.0f;
+		} else if (densityDpi >= DisplayMetrics.DENSITY_HIGH) {
+			selectedScaledDensity = 1.5f;
+		} else if (densityDpi >= DisplayMetrics.DENSITY_MEDIUM) {
+			selectedScaledDensity = 1.0f;
+		} else {
+			selectedScaledDensity = 0.75f;
+		}
+		Log.d(TAG, "Selected scaled density: " + selectedScaledDensity);
+		return selectedScaledDensity;
 	}
 	}
 
 
 	public double getScreenRefreshRate(double fallback) {
 	public double getScreenRefreshRate(double fallback) {