* Add setup step to grant `MANAGE_EXTERNAL_STORAGE`
* WIP re-implementation of Android `Rename` using native filesystem manipulation
* Applied clang-format and updated license headers
* Support user directories on removable storage devices
* If `MANAGE_EXTERNAL_STORAGE` is lost, re-request it
* Fix missing permission dialog appearing during initial setup
* Added empty code branches to prep for old Android support
* Fixed permission setup completion not accounting for external storage permission
* Implement code for Android <11
* Fixed emulation error if a renamed file is then opened for R/W
* Detect if the current user directory cannot be located, and prompt re-selection
* If an invalid user directory is selected, reject and re-prompt
* Prevent SecondaryDisplay from stealing focus
The SecondaryDisplay Activity was stealing focus from the main
Activity when it was launched.
Set the `FLAG_NOT_FOCUSABLE` and `FLAG_NOT_TOUCH_MODAL` window flags
to prevent the SecondaryDisplay from gaining focus.
* Implement touch controls for secondary display
This commit introduces touch input handling for the secondary display.
The following changes were made:
- Added `onSecondaryTouchEvent` and `onSecondaryTouchMoved` to `NativeLibrary.kt` and `native.cpp` to process touch events on the secondary display.
- Implemented `onTouchListener` in `SecondaryDisplay.kt` to capture touch events and forward them to the native layer.
- Handles `ACTION_DOWN`, `ACTION_POINTER_DOWN`, `ACTION_MOVE`, `ACTION_UP`, `ACTION_POINTER_UP`, and `ACTION_CANCEL` motion events.
- Tracks the active pointer to ensure correct touch event handling.
* Refactor display logic for multi-display support
This commit introduces a `DisplayHelper` class to centralize display-related logic, particularly for handling scenarios where the application might be launched on an external display.
Key changes:
- Added `DisplayHelper.kt` to manage internal and external display identification based on launch conditions.
- `MainActivity` and `EmulationActivity` now use `DisplayHelper.checkLaunchDisplay()` to determine the initial display.
- `SecondaryDisplay` now uses `DisplayHelper.getExternalDisplay()` to correctly identify the target display for the secondary presentation.
- `InputOverlay` now queries `DisplayHelper.isBottomOnPrimary()` to determine if touch input should be processed for the primary display based on the current screen layout.
- `SecondaryDisplay` now queries `DisplayHelper.isBottomOnSecondary()` to conditionally pass touch events to the native layer based on which screen (primary or secondary) is currently displaying the 3DS bottom screen.
These changes ensure that the application behaves correctly when launched on either the internal or an external display, and that touch input is routed appropriately based on the user's chosen screen layout for the dual screens.
* Removed primary-screen checks so the input overlay always forwards touch events, ensuring all touches reach the native handler even when multiple displays are active
* Remove DisplayHelper class and adjust external display logic
* Formatting adjustments
---------
Co-authored-by: DavidRGriswold <novachild@gmail.com>
Co-authored-by: OpenSauce04 <opensauce04@gmail.com>
* EmulationActivity and EmulationFragment clear only their own hooks
* EmulationLifecycleUtil: Rename `remove()` to `removeHook()`
* EmulationLifecycleUtil: Removed unused function `clear()`
* Corrected somewhat incorrect usage of the word "hook"
* Define `onShutdown` and `onPause` hook functions in constructors
* Formatting nitpicks
* Updated license header
* Re-added log messages for attempting to add duplicate hooks
---------
Co-authored-by: OpenSauce04 <opensauce04@gmail.com>
* Enable the SecondScreenPresentation class
* Update everything to enable second screen on android under GL and Vulkan. Still some issues!
* Some attempts to enable surface changes
* OpenGL is working on surface change, vulkan still no
* release surfaces (also fixed vulkan?)
* added and enabled layout setting
* resolve merge conflict
* rearrange switch cases to satisfy linux compiler
* openGL is working!
* several vk changes to try to fix crashes
* maybe vulkan is working?
* removing unnecessary code attempts
* Simplified secondscreen for better performance
* vk_platform.cpp: Fixed build failure caused by bad rebase
* vk_present_window.h: Removed stray newline
* Applied clang-format
* bug fix for odin 2
* Applied clang-format
* Updated license headers
* Moved SecondScreen class to org.citra.citra_emu.display
* Various formatting and readability improvements
* Added brackets where previously absent for readability
* Additional readability improvement
* RendererVulkan::NotifySurfaceChanged: Simplified condition checking
* change all references to "secondary screen" to "secondary display" to limit confusion with top screen / bottom screen
* rename main_window to main_present_window and second_window to secondary_present_window
* Reverted accidentally downgraded compatibility list submodule
* Removed unnecessary log message
* Applied clang-format
* Added a description to the Secondary Display Screen Layout setting
* Added `_ptr` suffix to `secondary_present_window`
This distinguishes it as a pointer, as `main_present_window` isn't a pointer, so there could be confusion on whether to use `.` or `->`
---------
Co-authored-by: OpenSauce04 <opensauce04@gmail.com>
* Added simple button sliding mode
* Added "keep first" button sliding mode
* directly pressed buttons stay active even when sliding off
* further buttons can be triggered via the simple sliding method
* Added button sliding configuration to overlay settings menu
* Updated licences
* Added button sliding activation to dpads and joysticks
* separated handling of buttons, dpads and joysticks needed since they can be activated by moving now
* Adjusted strings
* Changed ButtonSlidingMode values to mirror prior string name changes
* Reverted incorrectly applied language translation
* Nitpicky formatting adjustments
* Shortened string IDs
* hasActiveJoy --> hasActiveJoystick
* showButtonSlidingModeMenu --> showButtonSlidingMenu
* Updated outdated comment relating to `isMotionFirstButton`
Co-authored-by: toksn <toksn@yahoo.de>
---------
Co-authored-by: OpenSauce04 <opensauce04@gmail.com>
* renderer_vulkan: remove out of context SDL_Quit call (fixes#1220)
SDL_Quit must not be called unless the application must exit or SDL is no longer needed
* comment: simplify, forgot init had ref-count
* android: Implement play time tacking
Co-Authored-By: Reg Tiangha <rtiangha@users.noreply.github.com>
* Moved playtime manager from `citra_qt` to `common`
* Reimplemented Android play time to use existing logic from desktop
* Updated license headers
* When getting current game ID fails, silently error rather than crashing
* playTimeManagerStart: Check that `play_time_manager` is initialized before using it
---------
Co-authored-by: Kleidis <167202775+kleidis@users.noreply.github.com>
Co-authored-by: Reg Tiangha <rtiangha@users.noreply.github.com>