Skip to content

Commit 1383a4c

Browse files
committed
Merge remote-tracking branch 'upstream/master'
2 parents 2425f7f + 29a8515 commit 1383a4c

File tree

66 files changed

+1067
-219
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

66 files changed

+1067
-219
lines changed

builds/android/app/build.gradle

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -77,10 +77,11 @@ allprojects {
7777

7878
dependencies {
7979
implementation 'androidx.appcompat:appcompat:1.7.0'
80+
implementation "androidx.activity:activity:1.10.1"
8081
implementation 'com.google.android.material:material:1.12.0'
8182
implementation 'androidx.cardview:cardview:1.0.0'
82-
implementation 'androidx.recyclerview:recyclerview:1.3.2'
83-
implementation 'androidx.constraintlayout:constraintlayout:2.1.4'
83+
implementation 'androidx.recyclerview:recyclerview:1.4.0'
84+
implementation 'androidx.constraintlayout:constraintlayout:2.2.1'
8485
implementation 'androidx.documentfile:documentfile:1.0.1'
8586
implementation 'org.ini4j:ini4j:0.5.4'
8687
}

builds/android/app/src/main/AndroidManifest.xml

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,9 @@
3636
android:allowBackup="true"
3737
android:icon="@drawable/ic_launcher"
3838
android:label="@string/app_name"
39-
android:theme="@style/AppTheme">
39+
android:theme="@style/AppTheme"
40+
android:enableOnBackInvokedCallback="true"
41+
>
4042

4143
<!-- Setting SDL hints from AndroidManifest.xml: -->
4244
<meta-data android:name="SDL_ENV.SDL_ACCELEROMETER_AS_JOYSTICK" android:value="0" />
@@ -106,6 +108,7 @@
106108
</activity>
107109
<activity
108110
android:name=".button_mapping.ButtonMappingActivity"
111+
android:theme="@style/AppTheme.NoActionBar"
109112
android:configChanges="orientation|screenSize" />
110113

111114
<provider

builds/android/app/src/main/java/org/easyrpg/player/BaseActivity.java

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,14 +3,17 @@
33
import android.os.Bundle;
44
import android.util.Log;
55

6+
import androidx.activity.OnBackPressedCallback;
67
import androidx.appcompat.app.AppCompatActivity;
8+
79
import org.easyrpg.player.settings.SettingsManager;
810

911
/**
1012
* This activity is used by the GameBrowser and the settings.
1113
*/
1214
public class BaseActivity extends AppCompatActivity {
1315
public static Boolean libraryLoaded = false;
16+
protected OnBackPressedCallback onBackPressedCallback = null;
1417

1518
private static void loadNativeLibraries() {
1619
if (!libraryLoaded) {
@@ -44,5 +47,18 @@ protected void init() {
4447
SettingsManager.init(getApplicationContext());
4548

4649
loadNativeLibraries();
50+
51+
// Handle pressing of back button on newer Android 35+
52+
onBackPressedCallback = new OnBackPressedCallback(false) {
53+
@Override
54+
public void handleOnBackPressed() {
55+
backPressed();
56+
}
57+
};
58+
getOnBackPressedDispatcher().addCallback(this, onBackPressedCallback);
59+
}
60+
61+
public void backPressed() {
62+
// no-op, to be overwritten
4763
}
4864
}

builds/android/app/src/main/java/org/easyrpg/player/Helper.java

Lines changed: 35 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -8,17 +8,20 @@
88
import android.database.Cursor;
99
import android.graphics.Bitmap;
1010
import android.graphics.Color;
11+
import android.graphics.Insets;
1112
import android.graphics.Paint;
1213
import android.graphics.Paint.Style;
1314
import android.graphics.Point;
1415
import android.net.Uri;
16+
import android.os.Build;
1517
import android.os.ParcelFileDescriptor;
1618
import android.provider.DocumentsContract;
1719
import android.util.DisplayMetrics;
1820
import android.util.Log;
1921
import android.util.TypedValue;
2022
import android.view.View;
2123
import android.view.ViewGroup;
24+
import android.view.WindowInsets;
2225
import android.widget.Button;
2326
import android.widget.RelativeLayout;
2427
import android.widget.RelativeLayout.LayoutParams;
@@ -68,17 +71,41 @@ public static int getPixels(Activity v, double dipValue) {
6871
* Y position from 0 to 1
6972
*/
7073
public static void setLayoutPosition(Activity a, View view, double x, double y) {
71-
DisplayMetrics displayMetrics = a.getResources().getDisplayMetrics();
72-
float screenWidthDp = displayMetrics.widthPixels / displayMetrics.density;
73-
float screenHeightDp = displayMetrics.heightPixels / displayMetrics.density;
74+
int padW = 0;
75+
int padH = 0;
76+
77+
// Consider the display cut out when calculating the button position to avoid that they are
78+
// rendered out of bounds.
79+
// Starting from Android 15 (SDK35) the reported display metrics are of the entire screen
80+
// including the system bar but our activity has insets configured
81+
// Substract the size of the display cutout to prevent that our buttons are displayed out of
82+
// bounds.
83+
if (Build.VERSION.SDK_INT >= 35) {
84+
WindowInsets insets = a.getWindow().getDecorView().getRootWindowInsets();
85+
if (insets != null) {
86+
Insets systemBar = insets.getInsets(WindowInsets.Type.displayCutout());
87+
88+
padW = systemBar.left + systemBar.right;
89+
padH = systemBar.top + systemBar.bottom;
90+
}
91+
}
92+
93+
DisplayMetrics displayMetrics = a.getResources().getDisplayMetrics();
94+
float screenWidthDp = (displayMetrics.widthPixels) / displayMetrics.density;
95+
float screenHeightDp = (displayMetrics.heightPixels) / displayMetrics.density;
96+
97+
float screenWidthDpFit = (displayMetrics.widthPixels - padW) / displayMetrics.density;
98+
float screenHeightDpFit = (displayMetrics.heightPixels - padH) / displayMetrics.density;
99+
100+
float widthRatio = screenWidthDpFit / screenWidthDp;
101+
float heightRatio = screenHeightDpFit / screenHeightDp;
74102

75-
RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams(LayoutParams.WRAP_CONTENT,
76-
LayoutParams.WRAP_CONTENT);
103+
RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
77104

78-
params.leftMargin = Helper.getPixels(a, screenWidthDp * x);
79-
params.topMargin = Helper.getPixels(a, screenHeightDp * y);
105+
params.leftMargin = Helper.getPixels(a, screenWidthDpFit * x * widthRatio);
106+
params.topMargin = Helper.getPixels(a, screenHeightDpFit * y * heightRatio);
80107

81-
view.setLayoutParams(params);
108+
view.setLayoutParams(params);
82109
}
83110

84111
public static Paint getUIPainter() {
Lines changed: 91 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,91 @@
1+
package org.easyrpg.player;
2+
3+
import android.content.Context;
4+
import android.content.res.TypedArray;
5+
import android.graphics.Canvas;
6+
import android.graphics.Insets;
7+
import android.graphics.drawable.Drawable;
8+
import android.os.Build;
9+
import android.util.AttributeSet;
10+
import android.view.View;
11+
import android.view.WindowInsets;
12+
13+
import androidx.annotation.NonNull;
14+
15+
/*
16+
Rendering and layout code based on androidx/drawerlayout/widget/DrawerLayout.java
17+
*/
18+
19+
public class ScrollView extends android.widget.ScrollView {
20+
private WindowInsets insets = null;
21+
private Drawable statusBarBackground = null;
22+
23+
private static final int[] THEME_ATTRS = {
24+
android.R.attr.colorPrimaryDark
25+
};
26+
27+
public ScrollView(Context context) {
28+
super(context);
29+
init();
30+
}
31+
32+
public ScrollView(Context context, AttributeSet attrs) {
33+
super(context, attrs);
34+
init();
35+
}
36+
37+
38+
public ScrollView(Context context, AttributeSet attrs, int defStyleAttr) {
39+
super(context, attrs, defStyleAttr);
40+
init();
41+
}
42+
43+
public ScrollView(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
44+
super(context, attrs, defStyleAttr, defStyleRes);
45+
init();
46+
}
47+
48+
private void init() {
49+
if (Build.VERSION.SDK_INT >= 35) {
50+
setOnApplyWindowInsetsListener(new View.OnApplyWindowInsetsListener() {
51+
@NonNull
52+
@Override
53+
public WindowInsets onApplyWindowInsets(@NonNull View view, @NonNull WindowInsets insets) {
54+
final ScrollView thisView = (ScrollView) view;
55+
56+
Insets systemBarsInsets = insets.getInsets(WindowInsets.Type.systemBars());
57+
thisView.setPadding(
58+
systemBarsInsets.left,
59+
systemBarsInsets.top,
60+
systemBarsInsets.right,
61+
systemBarsInsets.bottom
62+
);
63+
64+
thisView.setChildInsets(insets);
65+
66+
return WindowInsets.CONSUMED;
67+
}
68+
});
69+
70+
71+
try (TypedArray a = getContext().obtainStyledAttributes(THEME_ATTRS)) {
72+
statusBarBackground = a.getDrawable(0);
73+
}
74+
}
75+
}
76+
77+
public void setChildInsets(WindowInsets insets) {
78+
this.insets = insets;
79+
requestLayout();
80+
}
81+
82+
@Override
83+
protected void onDraw(@NonNull Canvas c) {
84+
super.onDraw(c);
85+
86+
if (insets != null && insets.getSystemWindowInsetTop() > 0) {
87+
statusBarBackground.setBounds(0, 0, getWidth(), insets.getSystemWindowInsetTop());
88+
statusBarBackground.draw(c);
89+
}
90+
}
91+
}

builds/android/app/src/main/java/org/easyrpg/player/button_mapping/ButtonMappingActivity.java

Lines changed: 20 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,27 +5,32 @@
55
import android.content.Context;
66
import android.content.pm.ActivityInfo;
77
import android.content.res.Configuration;
8+
import android.os.Build;
89
import android.os.Bundle;
910
import android.util.Log;
1011
import android.view.KeyEvent;
1112
import android.view.MenuItem;
1213
import android.view.MotionEvent;
14+
import android.view.View;
1315
import android.view.ViewGroup;
16+
import android.view.WindowInsets;
1417
import android.view.WindowManager;
1518

19+
import androidx.annotation.NonNull;
1620
import androidx.core.view.GravityCompat;
1721
import androidx.drawerlayout.widget.DrawerLayout;
1822

1923
import com.google.android.material.navigation.NavigationView;
2024

25+
import org.easyrpg.player.BaseActivity;
2126
import org.easyrpg.player.Helper;
2227
import org.easyrpg.player.R;
2328
import org.easyrpg.player.settings.SettingsManager;
2429

2530
import java.util.LinkedList;
2631
import java.util.List;
2732

28-
public class ButtonMappingActivity extends Activity implements NavigationView.OnNavigationItemSelectedListener {
33+
public class ButtonMappingActivity extends BaseActivity implements NavigationView.OnNavigationItemSelectedListener {
2934
private DrawerLayout drawer;
3035
private ViewGroup layoutManager;
3136
private List<VirtualButton> buttonList;
@@ -78,9 +83,22 @@ protected void onCreate(Bundle savedInstanceState) {
7883
vb = new MenuButton(this, b.getPosX(), b.getPosY(), b.getSize());
7984
}
8085
buttonList.add(vb);
86+
}
8187

88+
if (Build.VERSION.SDK_INT >= 35) {
89+
getWindow().getDecorView().setOnApplyWindowInsetsListener(new View.OnApplyWindowInsetsListener() {
90+
@NonNull
91+
@Override
92+
public WindowInsets onApplyWindowInsets(@NonNull View view, @NonNull WindowInsets insets) {
93+
drawButtons();
94+
return insets;
95+
}
96+
});
97+
} else {
8298
drawButtons();
8399
}
100+
101+
onBackPressedCallback.setEnabled(true);
84102
}
85103

86104
@Override
@@ -132,8 +150,7 @@ public boolean onNavigationItemSelected(MenuItem item) {
132150
return true;
133151
}
134152

135-
@Override
136-
public void onBackPressed() {
153+
public void backPressed() {
137154
openOrCloseMenu();
138155
}
139156

builds/android/app/src/main/java/org/easyrpg/player/game_browser/GameBrowserActivity.java

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -72,6 +72,8 @@ protected void onCreate(Bundle savedInstanceState) {
7272
toggle.syncState();
7373
NavigationView navigationView = findViewById(R.id.nav_view);
7474
navigationView.setNavigationItemSelectedListener(this);
75+
76+
onBackPressedCallback.setEnabled(true);
7577
}
7678

7779
@Override
@@ -93,14 +95,13 @@ public void onConfigurationChanged(@NonNull Configuration newConfig) {
9395
scanGamesAndDisplayResult(false);
9496
}
9597

96-
@Override
97-
public void onBackPressed() {
98+
public void backPressed() {
9899
// Open the lateral menu
99100
DrawerLayout drawer = findViewById(R.id.drawer_layout);
100101
if (drawer.isDrawerOpen(GravityCompat.START)) {
101102
drawer.closeDrawer(GravityCompat.START);
102103
} else {
103-
super.onBackPressed();
104+
drawer.openDrawer(GravityCompat.START);
104105
}
105106
}
106107

builds/android/app/src/main/java/org/easyrpg/player/player/EasyRpgPlayerActivity.java

Lines changed: 24 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -44,11 +44,13 @@
4444
import android.view.SurfaceView;
4545
import android.view.View;
4646
import android.view.ViewGroup;
47-
import android.view.WindowManager;
47+
import android.view.WindowInsets;
4848
import android.widget.RelativeLayout;
4949
import android.widget.RelativeLayout.LayoutParams;
5050
import android.widget.TextView;
5151

52+
import androidx.activity.OnBackPressedCallback;
53+
import androidx.annotation.NonNull;
5254
import androidx.core.content.FileProvider;
5355
import androidx.core.view.GravityCompat;
5456
import androidx.drawerlayout.widget.DrawerLayout;
@@ -163,7 +165,26 @@ public void onDrawerStateChanged(int newState) {
163165
mLayout.addView(surface);
164166
updateScreenPosition();
165167

166-
showInputLayout();
168+
if (Build.VERSION.SDK_INT >= 35) {
169+
getWindow().getDecorView().setOnApplyWindowInsetsListener(new View.OnApplyWindowInsetsListener() {
170+
@NonNull
171+
@Override
172+
public WindowInsets onApplyWindowInsets(@NonNull View view, @NonNull WindowInsets insets) {
173+
showInputLayout();
174+
return insets;
175+
}
176+
});
177+
} else {
178+
showInputLayout();
179+
}
180+
181+
OnBackPressedCallback onBackPressedCallback = new OnBackPressedCallback(true) {
182+
@Override
183+
public void handleOnBackPressed() {
184+
backPressed();
185+
}
186+
};
187+
getOnBackPressedDispatcher().addCallback(this, onBackPressedCallback);
167188
}
168189

169190
@Override
@@ -308,8 +329,7 @@ private void reportBug() {
308329
((TextView) alertDialog.findViewById(android.R.id.message)).setMovementMethod(LinkMovementMethod.getInstance());
309330
}
310331

311-
@Override
312-
public void onBackPressed() {
332+
public void backPressed() {
313333
openOrCloseMenu();
314334
}
315335

builds/android/app/src/main/java/org/libsdl/app/SDLActivity.java

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -55,15 +55,17 @@
5555

5656
// EasyRPG additions
5757
import org.easyrpg.player.R;
58+
import androidx.appcompat.app.AppCompatActivity;
5859

5960
/**
6061
SDL Activity
6162
*/
62-
public class SDLActivity extends Activity implements View.OnSystemUiVisibilityChangeListener {
63+
// EasyRPG modification: extends AppCompatActivity
64+
public class SDLActivity extends AppCompatActivity implements View.OnSystemUiVisibilityChangeListener {
6365
private static final String TAG = "SDL";
6466
private static final int SDL_MAJOR_VERSION = 2;
6567
private static final int SDL_MINOR_VERSION = 32;
66-
private static final int SDL_MICRO_VERSION = 2;
68+
private static final int SDL_MICRO_VERSION = 6;
6769
/*
6870
// Display InputType.SOURCE/CLASS of events and devices
6971
//

0 commit comments

Comments
 (0)