From dceec9e20a54e88077ca5e505e5988ed41a2010d Mon Sep 17 00:00:00 2001
From: SSimco <37044560+SSimco@users.noreply.github.com>
Date: Sun, 1 Sep 2024 17:44:33 +0300
Subject: [PATCH] Added options to show the gamepad & added a menu when in game
---
src/android/app/src/main/AndroidManifest.xml | 7 -
src/android/app/src/main/cpp/EmulationState.h | 50 ++--
src/android/app/src/main/cpp/native-lib.cpp | 28 +-
.../java/info/cemu/Cemu/NativeLibrary.java | 12 +-
.../Cemu/emulation/EmulationFragment.java | 269 ++++++++++++------
.../info/cemu/Cemu/inputoverlay/Input.java | 2 +-
.../InputOverlayConfigureActivity.java | 56 ----
.../InputOverlaySettingsFragment.java | 8 -
.../app/src/main/res/drawable/ic_move.xml | 10 +
.../app/src/main/res/drawable/ic_resize.xml | 10 +
.../res/layout/activity_overlay_configure.xml | 38 ---
.../main/res/layout/fragment_emulation.xml | 50 +++-
.../main/res/menu/menu_emulation_in_game.xml | 17 ++
.../app/src/main/res/values/strings.xml | 34 ++-
14 files changed, 347 insertions(+), 244 deletions(-)
delete mode 100644 src/android/app/src/main/java/info/cemu/Cemu/inputoverlay/InputOverlayConfigureActivity.java
create mode 100644 src/android/app/src/main/res/drawable/ic_move.xml
create mode 100644 src/android/app/src/main/res/drawable/ic_resize.xml
delete mode 100644 src/android/app/src/main/res/layout/activity_overlay_configure.xml
create mode 100644 src/android/app/src/main/res/menu/menu_emulation_in_game.xml
diff --git a/src/android/app/src/main/AndroidManifest.xml b/src/android/app/src/main/AndroidManifest.xml
index 00737f4c..2eee40f6 100644
--- a/src/android/app/src/main/AndroidManifest.xml
+++ b/src/android/app/src/main/AndroidManifest.xml
@@ -24,13 +24,6 @@
android:parentActivityName=".MainActivity"
android:screenOrientation="userLandscape"
tools:ignore="DiscouragedApi" />
-
-
(graphicPack.get())] = graphicPack;
}
}
- void onTouchEvent(sint32 x, sint32 y, bool isPad, std::optional status = {})
+ void onTouchEvent(sint32 x, sint32 y, bool isTV, std::optional status = {})
{
auto& instance = InputManager::instance();
- auto& touchInfo = isPad ? instance.m_pad_mouse : instance.m_main_mouse;
+ auto& touchInfo = isTV ? instance.m_main_mouse : instance.m_pad_mouse;
std::scoped_lock lock(touchInfo.m_mutex);
touchInfo.position = {x, y};
if (status.has_value())
@@ -68,6 +68,12 @@ class EmulationState
void clearSurface(bool isMainCanvas)
{
+ if (!isMainCanvas)
+ {
+ auto renderer = static_cast(g_renderer.get());
+ if (renderer)
+ renderer->StopUsingPadAndWait();
+ }
}
void notifySurfaceChanged(bool isMainCanvas)
@@ -76,16 +82,20 @@ class EmulationState
void setSurface(JNIEnv* env, jobject surface, bool isMainCanvas)
{
+ cemu_assert_debug(surface != nullptr);
auto& windowHandleInfo = isMainCanvas ? GuiSystem::getWindowInfo().canvas_main : GuiSystem::getWindowInfo().canvas_pad;
if (windowHandleInfo.surface)
{
ANativeWindow_release(static_cast(windowHandleInfo.surface));
windowHandleInfo.surface = nullptr;
}
- if (surface)
- windowHandleInfo.surface = ANativeWindow_fromSurface(env, surface);
+ windowHandleInfo.surface = ANativeWindow_fromSurface(env, surface);
+ int width, height;
if (isMainCanvas)
- GuiSystem::getWindowInfo().window_main.surface = windowHandleInfo.surface;
+ GuiSystem::getWindowPhysSize(width, height);
+ else
+ GuiSystem::getPadWindowPhysSize(width, height);
+ VulkanRenderer::GetInstance()->InitializeSurface({width, height}, isMainCanvas);
}
void setSurfaceSize(int width, int height, bool isMainCanvas)
@@ -178,20 +188,19 @@ class EmulationState
else
androidEmulatedController.setDisabled();
}
- void initializeRenderer()
+
+ void initializeRenderer(JNIEnv* env, jobject testSurface)
{
+ cemu_assert_debug(testSurface != nullptr);
+ // TODO: cleanup surface
+ GuiSystem::getWindowInfo().window_main.surface = ANativeWindow_fromSurface(env, testSurface);
g_renderer = std::make_unique();
}
- void initializeRenderSurface(bool isMainCanvas)
+ void setReplaceTVWithPadView(bool showDRC)
{
- int width, height;
- if (isMainCanvas)
- GuiSystem::getWindowPhysSize(width, height);
- else
- GuiSystem::getPadWindowPhysSize(width, height);
- VulkanRenderer::GetInstance()->InitializeSurface({width, height}, isMainCanvas);
+ // Emulate pressing the TAB key for showing DRC instead of TV
+ GuiSystem::getWindowInfo().set_keystate(GuiSystem::PlatformKeyCodes::TAB, showDRC);
}
-
void setDPI(float dpi)
{
auto& windowInfo = GuiSystem::getWindowInfo();
@@ -256,6 +265,7 @@ class EmulationState
void startGame(TitleId titleId)
{
+ GuiSystem::getWindowInfo().set_keystates_up();
initializeAudioDevices();
CafeSystemUtils::startGame(titleId);
}
@@ -315,16 +325,16 @@ class EmulationState
}
g_config.Save();
}
- void onTouchMove(sint32 x, sint32 y, bool isPad)
+ void onTouchMove(sint32 x, sint32 y, bool isTV)
{
- onTouchEvent(x, y, isPad);
+ onTouchEvent(x, y, isTV);
}
- void onTouchUp(sint32 x, sint32 y, bool isPad)
+ void onTouchUp(sint32 x, sint32 y, bool isTV)
{
- onTouchEvent(x, y, isPad, false);
+ onTouchEvent(x, y, isTV, false);
}
- void onTouchDown(sint32 x, sint32 y, bool isPad)
+ void onTouchDown(sint32 x, sint32 y, bool isTV)
{
- onTouchEvent(x, y, isPad, true);
+ onTouchEvent(x, y, isTV, true);
}
};
\ No newline at end of file
diff --git a/src/android/app/src/main/cpp/native-lib.cpp b/src/android/app/src/main/cpp/native-lib.cpp
index 61ff916c..7a90982b 100644
--- a/src/android/app/src/main/cpp/native-lib.cpp
+++ b/src/android/app/src/main/cpp/native-lib.cpp
@@ -72,15 +72,11 @@ Java_info_cemu_Cemu_NativeLibrary_initializeEmulation([[maybe_unused]] JNIEnv* e
s_emulationState.initializeEmulation();
}
extern "C" [[maybe_unused]] JNIEXPORT void JNICALL
-Java_info_cemu_Cemu_NativeLibrary_initializerRenderer([[maybe_unused]] JNIEnv* env, [[maybe_unused]] jclass clazz)
+Java_info_cemu_Cemu_NativeLibrary_initializerRenderer(JNIEnv* env, [[maybe_unused]] jclass clazz, jobject testSurface)
{
- s_emulationState.initializeRenderer();
-}
-extern "C" [[maybe_unused]] JNIEXPORT void JNICALL
-Java_info_cemu_Cemu_NativeLibrary_initializeRendererSurface([[maybe_unused]] JNIEnv* env, [[maybe_unused]] jclass clazz, jboolean is_main_canvas)
-{
- s_emulationState.initializeRenderSurface(is_main_canvas);
+ s_emulationState.initializeRenderer(env, testSurface);
}
+
extern "C" [[maybe_unused]] JNIEXPORT void JNICALL
Java_info_cemu_Cemu_NativeLibrary_setDPI([[maybe_unused]] JNIEnv* env, [[maybe_unused]] jclass clazz, jfloat dpi)
{
@@ -571,19 +567,25 @@ Java_info_cemu_Cemu_NativeLibrary_setNotificationFriendListEnabled([[maybe_unuse
}
extern "C" JNIEXPORT void JNICALL
-Java_info_cemu_Cemu_NativeLibrary_onTouchDown([[maybe_unused]] JNIEnv* env, [[maybe_unused]] jclass clazz, jint x, jint y, jboolean isPad)
+Java_info_cemu_Cemu_NativeLibrary_setReplaceTVWithPadView([[maybe_unused]] JNIEnv* env, [[maybe_unused]] jclass clazz, jboolean swapped)
{
- s_emulationState.onTouchDown(x, y, isPad);
+ s_emulationState.setReplaceTVWithPadView(swapped);
}
extern "C" JNIEXPORT void JNICALL
-Java_info_cemu_Cemu_NativeLibrary_onTouchUp([[maybe_unused]] JNIEnv* env, [[maybe_unused]] jclass clazz, jint x, jint y, jboolean isPad)
+Java_info_cemu_Cemu_NativeLibrary_onTouchDown([[maybe_unused]] JNIEnv* env, [[maybe_unused]] jclass clazz, jint x, jint y, jboolean isTV)
{
- s_emulationState.onTouchUp(x, y, isPad);
+ s_emulationState.onTouchDown(x, y, isTV);
}
extern "C" JNIEXPORT void JNICALL
-Java_info_cemu_Cemu_NativeLibrary_onTouchMove([[maybe_unused]] JNIEnv* env, [[maybe_unused]] jclass clazz, jint x, jint y, jboolean isPad)
+Java_info_cemu_Cemu_NativeLibrary_onTouchUp([[maybe_unused]] JNIEnv* env, [[maybe_unused]] jclass clazz, jint x, jint y, jboolean isTV)
{
- s_emulationState.onTouchMove(x, y, isPad);
+ s_emulationState.onTouchUp(x, y, isTV);
+}
+
+extern "C" JNIEXPORT void JNICALL
+Java_info_cemu_Cemu_NativeLibrary_onTouchMove([[maybe_unused]] JNIEnv* env, [[maybe_unused]] jclass clazz, jint x, jint y, jboolean isTV)
+{
+ s_emulationState.onTouchMove(x, y, isTV);
}
diff --git a/src/android/app/src/main/java/info/cemu/Cemu/NativeLibrary.java b/src/android/app/src/main/java/info/cemu/Cemu/NativeLibrary.java
index 2218990b..967cf691 100644
--- a/src/android/app/src/main/java/info/cemu/Cemu/NativeLibrary.java
+++ b/src/android/app/src/main/java/info/cemu/Cemu/NativeLibrary.java
@@ -20,12 +20,12 @@ public class NativeLibrary {
public static native void setSurfaceSize(int width, int height, boolean isMainCanvas);
- public static native void initializerRenderer();
-
- public static native void initializeRendererSurface(boolean isMainCanvas);
+ public static native void initializerRenderer(Surface surface);
public static native void startGame(long titleId);
+ public static native void setReplaceTVWithPadView(boolean swapped);
+
public static native void recreateRenderSurface(boolean isMainCanvas);
@@ -388,9 +388,9 @@ public class NativeLibrary {
public static native void setNotificationFriendListEnabled(boolean enabled);
- public static native void onTouchDown(int x, int y, boolean isPad);
+ public static native void onTouchDown(int x, int y, boolean isTV);
- public static native void onTouchMove(int x, int y, boolean isPad);
+ public static native void onTouchMove(int x, int y, boolean isTV);
- public static native void onTouchUp(int x, int y, boolean isPad);
+ public static native void onTouchUp(int x, int y, boolean isTV);
}
diff --git a/src/android/app/src/main/java/info/cemu/Cemu/emulation/EmulationFragment.java b/src/android/app/src/main/java/info/cemu/Cemu/emulation/EmulationFragment.java
index f8c9bfdb..6e468fdf 100644
--- a/src/android/app/src/main/java/info/cemu/Cemu/emulation/EmulationFragment.java
+++ b/src/android/app/src/main/java/info/cemu/Cemu/emulation/EmulationFragment.java
@@ -1,51 +1,40 @@
package info.cemu.Cemu.emulation;
import android.annotation.SuppressLint;
+import android.graphics.SurfaceTexture;
import android.os.Bundle;
import android.view.LayoutInflater;
+import android.view.MenuItem;
import android.view.MotionEvent;
+import android.view.Surface;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
import android.view.View;
import android.view.ViewGroup;
+import android.widget.LinearLayout;
import android.widget.Toast;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
+import androidx.annotation.StringRes;
+import androidx.appcompat.widget.PopupMenu;
import androidx.fragment.app.Fragment;
+import info.cemu.Cemu.NativeLibrary;
import info.cemu.Cemu.R;
import info.cemu.Cemu.databinding.FragmentEmulationBinding;
import info.cemu.Cemu.inputoverlay.InputOverlaySettingsProvider;
import info.cemu.Cemu.inputoverlay.InputOverlaySurfaceView;
-import info.cemu.Cemu.NativeLibrary;
@SuppressLint("ClickableViewAccessibility")
-public class EmulationFragment extends Fragment implements SurfaceHolder.Callback {
- private final long gameTitleId;
- private boolean isGameRunning;
- private SurfaceHolder mainCanvasSurfaceHolder;
- private Toast toast;
-
- public EmulationFragment(long gameTitleId) {
- this.gameTitleId = gameTitleId;
- }
-
- InputOverlaySettingsProvider.OverlaySettings overlaySettings;
-
- @Override
- public void onCreate(@Nullable Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- var inputOverlaySettingsProvider = new InputOverlaySettingsProvider(requireContext());
- overlaySettings = inputOverlaySettingsProvider.getOverlaySettings();
- }
+public class EmulationFragment extends Fragment implements PopupMenu.OnMenuItemClickListener {
static private class OnSurfaceTouchListener implements View.OnTouchListener {
int currentPointerId = -1;
- final boolean isPad;
+ final boolean isTV;
- public OnSurfaceTouchListener(boolean isPad) {
- this.isPad = isPad;
+ public OnSurfaceTouchListener(boolean isTV) {
+ this.isTV = isTV;
}
@Override
@@ -59,15 +48,15 @@ public class EmulationFragment extends Fragment implements SurfaceHolder.Callbac
int y = (int) event.getY(pointerIndex);
switch (event.getActionMasked()) {
case MotionEvent.ACTION_DOWN, MotionEvent.ACTION_POINTER_DOWN -> {
- NativeLibrary.onTouchDown(x, y, isPad);
+ NativeLibrary.onTouchDown(x, y, isTV);
return true;
}
case MotionEvent.ACTION_UP, MotionEvent.ACTION_POINTER_UP -> {
- NativeLibrary.onTouchUp(x, y, isPad);
+ NativeLibrary.onTouchUp(x, y, isTV);
return true;
}
case MotionEvent.ACTION_MOVE -> {
- NativeLibrary.onTouchMove(x, y, isPad);
+ NativeLibrary.onTouchMove(x, y, isTV);
return true;
}
}
@@ -75,70 +64,186 @@ public class EmulationFragment extends Fragment implements SurfaceHolder.Callbac
}
}
+ private static class SurfaceHolderCallback implements SurfaceHolder.Callback {
+ final boolean isMainCanvas;
+ boolean surfaceSet;
+
+ public SurfaceHolderCallback(boolean isMainCanvas) {
+ this.isMainCanvas = isMainCanvas;
+ }
+
+ @Override
+ public void surfaceCreated(@NonNull SurfaceHolder surfaceHolder) {
+ }
+
+ @Override
+ public void surfaceChanged(@NonNull SurfaceHolder surfaceHolder, int format, int width, int height) {
+ NativeLibrary.setSurfaceSize(width, height, isMainCanvas);
+ if (!surfaceSet) {
+ surfaceSet = true;
+ NativeLibrary.setSurface(surfaceHolder.getSurface(), isMainCanvas);
+ }
+ }
+
+ @Override
+ public void surfaceDestroyed(@NonNull SurfaceHolder surfaceHolder) {
+ NativeLibrary.clearSurface(isMainCanvas);
+ surfaceSet = false;
+ }
+ }
+
+ private final long gameTitleId;
+ private boolean isGameRunning;
+ private SurfaceView padCanvas;
+ private SurfaceTexture testSurfaceTexture;
+ private Surface testSurface;
+ private Toast toast;
+ private FragmentEmulationBinding binding;
+ private PopupMenu settingsMenu;
+ private InputOverlaySurfaceView inputOverlaySurfaceView;
+
+ public EmulationFragment(long gameTitleId) {
+ this.gameTitleId = gameTitleId;
+ }
+
+ InputOverlaySettingsProvider.OverlaySettings overlaySettings;
+
+ @Override
+ public void onCreate(@Nullable Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ var inputOverlaySettingsProvider = new InputOverlaySettingsProvider(requireContext());
+ overlaySettings = inputOverlaySettingsProvider.getOverlaySettings();
+ testSurfaceTexture = new SurfaceTexture(0);
+ testSurface = new Surface(testSurfaceTexture);
+ }
+
+ @Override
+ public void onDestroy() {
+ super.onDestroy();
+ if (testSurface != null) testSurface.release();
+ if (testSurfaceTexture != null) testSurfaceTexture.release();
+ }
+
+ private void createPadCanvas() {
+ if (padCanvas != null) return;
+ padCanvas = new SurfaceView(requireContext());
+ binding.canvasesLayout.addView(
+ padCanvas,
+ new LinearLayout.LayoutParams(0, ViewGroup.LayoutParams.MATCH_PARENT, 1.0f)
+ );
+ padCanvas.getHolder().addCallback(new SurfaceHolderCallback(false));
+ padCanvas.setOnTouchListener(new OnSurfaceTouchListener(false));
+ }
+
+ private void toastMessage(@StringRes int toastTextResId) {
+ if (toast != null) {
+ toast.cancel();
+ }
+ toast = Toast.makeText(requireContext(), toastTextResId, Toast.LENGTH_SHORT);
+ toast.show();
+ }
+
+ private void destroyPadCanvas() {
+ if (padCanvas == null) return;
+ binding.canvasesLayout.removeView(padCanvas);
+ padCanvas = null;
+ }
+
+ private void setPadViewVisibility(boolean visible) {
+ if (visible) {
+ createPadCanvas();
+ return;
+ }
+ destroyPadCanvas();
+ }
+
+ @Override
+ public boolean onMenuItemClick(MenuItem item) {
+ int itemId = item.getItemId();
+ if (itemId == R.id.show_pad) {
+ boolean padVisibility = !item.isChecked();
+ setPadViewVisibility(padVisibility);
+ item.setChecked(padVisibility);
+ return true;
+ }
+ if (itemId == R.id.edit_inputs) {
+ binding.editInputsLayout.setVisibility(View.VISIBLE);
+ binding.finishEditInputsButton.setVisibility(View.VISIBLE);
+ binding.moveInputsButton.performClick();
+ return true;
+ }
+ if (itemId == R.id.replace_tv_with_pad) {
+ boolean replaceTVWithPad = !item.isChecked();
+ NativeLibrary.setReplaceTVWithPadView(replaceTVWithPad);
+ item.setChecked(replaceTVWithPad);
+ return true;
+ }
+ if (itemId == R.id.reset_inputs) {
+ inputOverlaySurfaceView.resetInputs();
+ return true;
+ }
+ return false;
+ }
+
@Override
public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
- FragmentEmulationBinding binding = FragmentEmulationBinding.inflate(inflater, container, false);
+ binding = FragmentEmulationBinding.inflate(inflater, container, false);
+ inputOverlaySurfaceView = binding.inputOverlay;
- InputOverlaySurfaceView surfaceView = binding.inputOverlay;
- binding.inputModeButton.setOnClickListener(v -> {
- InputOverlaySurfaceView.InputMode nextMode = InputOverlaySurfaceView.InputMode.DEFAULT;
- int toastTextResId = R.string.input_mode_default;
- switch (surfaceView.getInputMode()) {
- case EDIT_POSITION -> {
- nextMode = InputOverlaySurfaceView.InputMode.EDIT_SIZE;
- toastTextResId = R.string.input_mode_edit_size;
- }
- case EDIT_SIZE -> {
- nextMode = InputOverlaySurfaceView.InputMode.DEFAULT;
- toastTextResId = R.string.input_mode_default;
- }
- case DEFAULT -> {
- nextMode = InputOverlaySurfaceView.InputMode.EDIT_POSITION;
- toastTextResId = R.string.input_mode_edit_position;
- }
- }
- if (toast != null) {
- toast.cancel();
- }
- toast = Toast.makeText(requireContext(), toastTextResId, Toast.LENGTH_SHORT);
- toast.show();
- surfaceView.setInputMode(nextMode);
+ binding.moveInputsButton.setOnClickListener(v -> {
+ if (inputOverlaySurfaceView.getInputMode() == InputOverlaySurfaceView.InputMode.EDIT_POSITION)
+ return;
+ binding.resizeInputsButton.setAlpha(0.5f);
+ binding.moveInputsButton.setAlpha(1.0f);
+ toastMessage(R.string.input_mode_edit_position);
+ inputOverlaySurfaceView.setInputMode(InputOverlaySurfaceView.InputMode.EDIT_POSITION);
});
+ binding.resizeInputsButton.setOnClickListener(v -> {
+ if (inputOverlaySurfaceView.getInputMode() == InputOverlaySurfaceView.InputMode.EDIT_SIZE)
+ return;
+ binding.moveInputsButton.setAlpha(0.5f);
+ binding.resizeInputsButton.setAlpha(1.0f);
+ toastMessage(R.string.input_mode_edit_size);
+ inputOverlaySurfaceView.setInputMode(InputOverlaySurfaceView.InputMode.EDIT_SIZE);
+ });
+ binding.finishEditInputsButton.setOnClickListener(v -> {
+ inputOverlaySurfaceView.setInputMode(InputOverlaySurfaceView.InputMode.DEFAULT);
+ binding.finishEditInputsButton.setVisibility(View.GONE);
+ binding.editInputsLayout.setVisibility(View.GONE);
+ toastMessage(R.string.input_mode_default);
+ });
+ settingsMenu = new PopupMenu(requireContext(), binding.emulationSettingsButton);
+ settingsMenu.getMenuInflater().inflate(R.menu.menu_emulation_in_game, settingsMenu.getMenu());
+ settingsMenu.setOnMenuItemClickListener(EmulationFragment.this);
+ binding.emulationSettingsButton.setOnClickListener(v -> settingsMenu.show());
+
if (!overlaySettings.isOverlayEnabled()) {
- binding.inputModeButton.setVisibility(View.GONE);
- surfaceView.setVisibility(View.GONE);
+ inputOverlaySurfaceView.setVisibility(View.GONE);
}
SurfaceView mainCanvas = binding.mainCanvas;
- mainCanvas.getHolder().addCallback(this);
- mainCanvas.setOnTouchListener(new OnSurfaceTouchListener(false));
+
+ NativeLibrary.initializerRenderer(testSurface);
+
+ var mainCanvasHolder = mainCanvas.getHolder();
+ mainCanvasHolder.addCallback(new SurfaceHolderCallback(true));
+ mainCanvasHolder.addCallback(new SurfaceHolder.Callback() {
+ @Override
+ public void surfaceCreated(@NonNull SurfaceHolder holder) {
+ }
+
+ @Override
+ public void surfaceChanged(@NonNull SurfaceHolder holder, int format, int width, int height) {
+ if (!isGameRunning) {
+ isGameRunning = true;
+ NativeLibrary.startGame(gameTitleId);
+ }
+ }
+
+ @Override
+ public void surfaceDestroyed(@NonNull SurfaceHolder holder) {
+ }
+ });
+ mainCanvas.setOnTouchListener(new OnSurfaceTouchListener(true));
return binding.getRoot();
}
-
- @Override
- public void surfaceCreated(@NonNull SurfaceHolder surfaceHolder) {
- mainCanvasSurfaceHolder = surfaceHolder;
- }
-
- @Override
- public void surfaceChanged(@NonNull SurfaceHolder surfaceHolder, int format, int width, int height) {
- NativeLibrary.setSurfaceSize(width, height, true);
- if (!isGameRunning) {
- isGameRunning = true;
- NativeLibrary.setSurface(surfaceHolder.getSurface(), true);
- NativeLibrary.initializerRenderer();
- NativeLibrary.initializeRendererSurface(true);
- NativeLibrary.startGame(gameTitleId);
- } else {
- if (mainCanvasSurfaceHolder == surfaceHolder)
- return;
- NativeLibrary.setSurface(surfaceHolder.getSurface(), true);
- NativeLibrary.recreateRenderSurface(true);
- }
- }
-
- @Override
- public void surfaceDestroyed(@NonNull SurfaceHolder surfaceHolder) {
- mainCanvasSurfaceHolder = null;
- NativeLibrary.clearSurface(true);
- }
}
\ No newline at end of file
diff --git a/src/android/app/src/main/java/info/cemu/Cemu/inputoverlay/Input.java b/src/android/app/src/main/java/info/cemu/Cemu/inputoverlay/Input.java
index 8ea980c3..fe2b7e54 100644
--- a/src/android/app/src/main/java/info/cemu/Cemu/inputoverlay/Input.java
+++ b/src/android/app/src/main/java/info/cemu/Cemu/inputoverlay/Input.java
@@ -36,7 +36,7 @@ public abstract class Input {
configure();
}
- private static final float MIN_WIDTH_HEIGHT = 100;
+ private static final float MIN_WIDTH_HEIGHT = 200;
public void resize(int diffX, int diffY, int maxWidth, int maxHeight) {
var rect = settings.getRect();
diff --git a/src/android/app/src/main/java/info/cemu/Cemu/inputoverlay/InputOverlayConfigureActivity.java b/src/android/app/src/main/java/info/cemu/Cemu/inputoverlay/InputOverlayConfigureActivity.java
deleted file mode 100644
index ba8b58a6..00000000
--- a/src/android/app/src/main/java/info/cemu/Cemu/inputoverlay/InputOverlayConfigureActivity.java
+++ /dev/null
@@ -1,56 +0,0 @@
-package info.cemu.Cemu.inputoverlay;
-
-
-
-import static info.cemu.Cemu.inputoverlay.InputOverlaySurfaceView.InputMode.EDIT_POSITION;
-import static info.cemu.Cemu.inputoverlay.InputOverlaySurfaceView.InputMode.EDIT_SIZE;
-
-import android.os.Bundle;
-import android.widget.Toast;
-
-import androidx.appcompat.app.AppCompatActivity;
-import androidx.core.view.WindowCompat;
-import androidx.core.view.WindowInsetsCompat;
-import androidx.core.view.WindowInsetsControllerCompat;
-
-import info.cemu.Cemu.R;
-import info.cemu.Cemu.databinding.ActivityOverlayConfigureBinding;
-
-public class InputOverlayConfigureActivity extends AppCompatActivity {
- private Toast toast;
-
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setFullscreen();
- ActivityOverlayConfigureBinding binding = ActivityOverlayConfigureBinding.inflate(getLayoutInflater());
- InputOverlaySurfaceView surfaceView = binding.inputConfigureOverlay;
- surfaceView.setInputMode(EDIT_POSITION);
- binding.configureModeButton.setOnClickListener(v -> {
- InputOverlaySurfaceView.InputMode nextMode;
- int toastTextResId;
- if (surfaceView.getInputMode() == EDIT_POSITION) {
- toastTextResId = R.string.input_mode_edit_size;
- nextMode = EDIT_SIZE;
- } else {
- toastTextResId = R.string.input_mode_edit_position;
- nextMode = EDIT_POSITION;
- }
- if (toast != null) {
- toast.cancel();
- }
- toast = Toast.makeText(InputOverlayConfigureActivity.this, toastTextResId, Toast.LENGTH_SHORT);
- toast.show();
- surfaceView.setInputMode(nextMode);
- });
- binding.resetOverlayButton.setOnClickListener(v -> surfaceView.resetInputs());
- setContentView(binding.getRoot());
- }
-
- private void setFullscreen() {
- WindowCompat.setDecorFitsSystemWindows(getWindow(), false);
- WindowInsetsControllerCompat controller = new WindowInsetsControllerCompat(getWindow(), getWindow().getDecorView());
- controller.hide(WindowInsetsCompat.Type.systemBars());
- controller.setSystemBarsBehavior(WindowInsetsControllerCompat.BEHAVIOR_SHOW_TRANSIENT_BARS_BY_SWIPE);
- }
-}
\ No newline at end of file
diff --git a/src/android/app/src/main/java/info/cemu/Cemu/inputoverlay/InputOverlaySettingsFragment.java b/src/android/app/src/main/java/info/cemu/Cemu/inputoverlay/InputOverlaySettingsFragment.java
index 8c82e498..2b33319e 100644
--- a/src/android/app/src/main/java/info/cemu/Cemu/inputoverlay/InputOverlaySettingsFragment.java
+++ b/src/android/app/src/main/java/info/cemu/Cemu/inputoverlay/InputOverlaySettingsFragment.java
@@ -91,14 +91,6 @@ public class InputOverlaySettingsFragment extends Fragment {
});
genericRecyclerViewAdapter.addRecyclerViewItem(controllerSelection);
- genericRecyclerViewAdapter.addRecyclerViewItem(
- new ButtonRecyclerViewItem(
- getString(R.string.configure_inputs_label),
- getString(R.string.configure_inputs_description),
- () -> startActivity(new Intent(requireActivity(), InputOverlayConfigureActivity.class))
- )
- );
-
binding.recyclerView.setAdapter(genericRecyclerViewAdapter);
return binding.getRoot();
diff --git a/src/android/app/src/main/res/drawable/ic_move.xml b/src/android/app/src/main/res/drawable/ic_move.xml
new file mode 100644
index 00000000..a9c4d927
--- /dev/null
+++ b/src/android/app/src/main/res/drawable/ic_move.xml
@@ -0,0 +1,10 @@
+
+
+
diff --git a/src/android/app/src/main/res/drawable/ic_resize.xml b/src/android/app/src/main/res/drawable/ic_resize.xml
new file mode 100644
index 00000000..d5db6649
--- /dev/null
+++ b/src/android/app/src/main/res/drawable/ic_resize.xml
@@ -0,0 +1,10 @@
+
+
+
diff --git a/src/android/app/src/main/res/layout/activity_overlay_configure.xml b/src/android/app/src/main/res/layout/activity_overlay_configure.xml
deleted file mode 100644
index ffb00c5e..00000000
--- a/src/android/app/src/main/res/layout/activity_overlay_configure.xml
+++ /dev/null
@@ -1,38 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/src/android/app/src/main/res/layout/fragment_emulation.xml b/src/android/app/src/main/res/layout/fragment_emulation.xml
index 5b9bdea0..63964928 100644
--- a/src/android/app/src/main/res/layout/fragment_emulation.xml
+++ b/src/android/app/src/main/res/layout/fragment_emulation.xml
@@ -6,10 +6,18 @@
android:layout_height="match_parent"
tools:context=".emulation.EmulationFragment">
-
+ android:layout_height="match_parent"
+ android:orientation="horizontal">
+
+
+
+
+
+
+
+
+
+
+
+