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
This commit is contained in:
parent
70eaaf2a01
commit
6f7ec7f723
|
@ -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',
|
||||||
|
|
|
@ -5,6 +5,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 {
|
||||||
|
|
|
@ -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>
|
||||||
|
|
|
@ -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()) {
|
||||||
|
|
|
@ -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>
|
|
@ -224,12 +224,30 @@ public class GodotIO {
|
||||||
}
|
}
|
||||||
|
|
||||||
public int getScreenDPI() {
|
public int getScreenDPI() {
|
||||||
DisplayMetrics metrics = activity.getResources().getDisplayMetrics();
|
return activity.getResources().getDisplayMetrics().densityDpi;
|
||||||
return (int)(metrics.density * 160f);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 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) {
|
||||||
|
|
Loading…
Reference in New Issue