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 @@ - - - - - - - -