|
|
@@ -1,9 +1,10 @@
|
|
|
-package org.citra.citra_emu.activities;
|
|
|
+package org.yuzu.yuzu_emu.activities;
|
|
|
|
|
|
import android.app.Activity;
|
|
|
import android.content.Intent;
|
|
|
import android.content.SharedPreferences;
|
|
|
import android.content.pm.PackageManager;
|
|
|
+import android.graphics.Rect;
|
|
|
import android.os.Bundle;
|
|
|
import android.os.Handler;
|
|
|
import android.preference.PreferenceManager;
|
|
|
@@ -15,37 +16,31 @@ import android.view.Menu;
|
|
|
import android.view.MenuItem;
|
|
|
import android.view.MotionEvent;
|
|
|
import android.view.View;
|
|
|
-import android.widget.CheckBox;
|
|
|
import android.widget.SeekBar;
|
|
|
import android.widget.TextView;
|
|
|
|
|
|
import androidx.annotation.IntDef;
|
|
|
import androidx.annotation.NonNull;
|
|
|
+import androidx.annotation.Nullable;
|
|
|
import androidx.appcompat.app.AlertDialog;
|
|
|
import androidx.appcompat.app.AppCompatActivity;
|
|
|
import androidx.core.app.NotificationManagerCompat;
|
|
|
+import androidx.fragment.app.Fragment;
|
|
|
import androidx.fragment.app.FragmentActivity;
|
|
|
+import androidx.fragment.app.FragmentManager;
|
|
|
+
|
|
|
+import org.yuzu.yuzu_emu.NativeLibrary;
|
|
|
+import org.yuzu.yuzu_emu.R;
|
|
|
+import org.yuzu.yuzu_emu.features.settings.model.view.InputBindingSetting;
|
|
|
+import org.yuzu.yuzu_emu.features.settings.ui.SettingsActivity;
|
|
|
+import org.yuzu.yuzu_emu.features.settings.utils.SettingsFile;
|
|
|
+import org.yuzu.yuzu_emu.fragments.EmulationFragment;
|
|
|
+import org.yuzu.yuzu_emu.fragments.MenuFragment;
|
|
|
+import org.yuzu.yuzu_emu.utils.ControllerMappingHelper;
|
|
|
+import org.yuzu.yuzu_emu.utils.EmulationMenuSettings;
|
|
|
+import org.yuzu.yuzu_emu.utils.ForegroundService;
|
|
|
|
|
|
-import org.citra.citra_emu.CitraApplication;
|
|
|
-import org.citra.citra_emu.NativeLibrary;
|
|
|
-import org.citra.citra_emu.R;
|
|
|
-import org.citra.citra_emu.features.cheats.ui.CheatsActivity;
|
|
|
-import org.citra.citra_emu.features.settings.model.view.InputBindingSetting;
|
|
|
-import org.citra.citra_emu.features.settings.ui.SettingsActivity;
|
|
|
-import org.citra.citra_emu.features.settings.utils.SettingsFile;
|
|
|
-import org.citra.citra_emu.camera.StillImageCameraHelper;
|
|
|
-import org.citra.citra_emu.fragments.EmulationFragment;
|
|
|
-import org.citra.citra_emu.ui.main.MainActivity;
|
|
|
-import org.citra.citra_emu.utils.ControllerMappingHelper;
|
|
|
-import org.citra.citra_emu.utils.EmulationMenuSettings;
|
|
|
-import org.citra.citra_emu.utils.FileBrowserHelper;
|
|
|
-import org.citra.citra_emu.utils.FileUtil;
|
|
|
-import org.citra.citra_emu.utils.ForegroundService;
|
|
|
-
|
|
|
-import java.io.File;
|
|
|
-import java.io.IOException;
|
|
|
import java.lang.annotation.Retention;
|
|
|
-import java.util.Collections;
|
|
|
import java.util.List;
|
|
|
|
|
|
import static android.Manifest.permission.CAMERA;
|
|
|
@@ -53,6 +48,10 @@ import static android.Manifest.permission.RECORD_AUDIO;
|
|
|
import static java.lang.annotation.RetentionPolicy.SOURCE;
|
|
|
|
|
|
public final class EmulationActivity extends AppCompatActivity {
|
|
|
+ private static final String BACKSTACK_NAME_MENU = "menu";
|
|
|
+
|
|
|
+ private static final String BACKSTACK_NAME_SUBMENU = "submenu";
|
|
|
+
|
|
|
public static final String EXTRA_SELECTED_GAME = "SelectedGame";
|
|
|
public static final String EXTRA_SELECTED_TITLE = "SelectedTitle";
|
|
|
public static final int MENU_ACTION_EDIT_CONTROLS_PLACEMENT = 0;
|
|
|
@@ -60,61 +59,10 @@ public final class EmulationActivity extends AppCompatActivity {
|
|
|
public static final int MENU_ACTION_ADJUST_SCALE = 2;
|
|
|
public static final int MENU_ACTION_EXIT = 3;
|
|
|
public static final int MENU_ACTION_SHOW_FPS = 4;
|
|
|
- public static final int MENU_ACTION_SCREEN_LAYOUT_LANDSCAPE = 5;
|
|
|
- public static final int MENU_ACTION_SCREEN_LAYOUT_PORTRAIT = 6;
|
|
|
- public static final int MENU_ACTION_SCREEN_LAYOUT_SINGLE = 7;
|
|
|
- public static final int MENU_ACTION_SCREEN_LAYOUT_SIDEBYSIDE = 8;
|
|
|
- public static final int MENU_ACTION_SWAP_SCREENS = 9;
|
|
|
- public static final int MENU_ACTION_RESET_OVERLAY = 10;
|
|
|
- public static final int MENU_ACTION_SHOW_OVERLAY = 11;
|
|
|
- public static final int MENU_ACTION_OPEN_SETTINGS = 12;
|
|
|
- public static final int MENU_ACTION_LOAD_AMIIBO = 13;
|
|
|
- public static final int MENU_ACTION_REMOVE_AMIIBO = 14;
|
|
|
- public static final int MENU_ACTION_JOYSTICK_REL_CENTER = 15;
|
|
|
- public static final int MENU_ACTION_DPAD_SLIDE_ENABLE = 16;
|
|
|
- public static final int MENU_ACTION_OPEN_CHEATS = 17;
|
|
|
-
|
|
|
- public static final int REQUEST_SELECT_AMIIBO = 2;
|
|
|
+ public static final int MENU_ACTION_RESET_OVERLAY = 6;
|
|
|
+ public static final int MENU_ACTION_SHOW_OVERLAY = 7;
|
|
|
+ public static final int MENU_ACTION_OPEN_SETTINGS = 8;
|
|
|
private static final int EMULATION_RUNNING_NOTIFICATION = 0x1000;
|
|
|
- private static SparseIntArray buttonsActionsMap = new SparseIntArray();
|
|
|
-
|
|
|
- static {
|
|
|
- buttonsActionsMap.append(R.id.menu_emulation_edit_layout,
|
|
|
- EmulationActivity.MENU_ACTION_EDIT_CONTROLS_PLACEMENT);
|
|
|
- buttonsActionsMap.append(R.id.menu_emulation_toggle_controls,
|
|
|
- EmulationActivity.MENU_ACTION_TOGGLE_CONTROLS);
|
|
|
- buttonsActionsMap
|
|
|
- .append(R.id.menu_emulation_adjust_scale, EmulationActivity.MENU_ACTION_ADJUST_SCALE);
|
|
|
- buttonsActionsMap.append(R.id.menu_emulation_show_fps,
|
|
|
- EmulationActivity.MENU_ACTION_SHOW_FPS);
|
|
|
- buttonsActionsMap.append(R.id.menu_screen_layout_landscape,
|
|
|
- EmulationActivity.MENU_ACTION_SCREEN_LAYOUT_LANDSCAPE);
|
|
|
- buttonsActionsMap.append(R.id.menu_screen_layout_portrait,
|
|
|
- EmulationActivity.MENU_ACTION_SCREEN_LAYOUT_PORTRAIT);
|
|
|
- buttonsActionsMap.append(R.id.menu_screen_layout_single,
|
|
|
- EmulationActivity.MENU_ACTION_SCREEN_LAYOUT_SINGLE);
|
|
|
- buttonsActionsMap.append(R.id.menu_screen_layout_sidebyside,
|
|
|
- EmulationActivity.MENU_ACTION_SCREEN_LAYOUT_SIDEBYSIDE);
|
|
|
- buttonsActionsMap.append(R.id.menu_emulation_swap_screens,
|
|
|
- EmulationActivity.MENU_ACTION_SWAP_SCREENS);
|
|
|
- buttonsActionsMap
|
|
|
- .append(R.id.menu_emulation_reset_overlay, EmulationActivity.MENU_ACTION_RESET_OVERLAY);
|
|
|
- buttonsActionsMap
|
|
|
- .append(R.id.menu_emulation_show_overlay, EmulationActivity.MENU_ACTION_SHOW_OVERLAY);
|
|
|
- buttonsActionsMap
|
|
|
- .append(R.id.menu_emulation_open_settings, EmulationActivity.MENU_ACTION_OPEN_SETTINGS);
|
|
|
- buttonsActionsMap
|
|
|
- .append(R.id.menu_emulation_amiibo_load, EmulationActivity.MENU_ACTION_LOAD_AMIIBO);
|
|
|
- buttonsActionsMap
|
|
|
- .append(R.id.menu_emulation_amiibo_remove, EmulationActivity.MENU_ACTION_REMOVE_AMIIBO);
|
|
|
- buttonsActionsMap.append(R.id.menu_emulation_joystick_rel_center,
|
|
|
- EmulationActivity.MENU_ACTION_JOYSTICK_REL_CENTER);
|
|
|
- buttonsActionsMap.append(R.id.menu_emulation_dpad_slide_enable,
|
|
|
- EmulationActivity.MENU_ACTION_DPAD_SLIDE_ENABLE);
|
|
|
- buttonsActionsMap
|
|
|
- .append(R.id.menu_emulation_open_cheats, EmulationActivity.MENU_ACTION_OPEN_CHEATS);
|
|
|
- }
|
|
|
-
|
|
|
private View mDecorView;
|
|
|
private EmulationFragment mEmulationFragment;
|
|
|
private SharedPreferences mPreferences;
|
|
|
@@ -124,6 +72,8 @@ public final class EmulationActivity extends AppCompatActivity {
|
|
|
private String mSelectedTitle;
|
|
|
private String mPath;
|
|
|
|
|
|
+ private boolean mMenuVisible;
|
|
|
+
|
|
|
public static void launch(FragmentActivity activity, String path, String title) {
|
|
|
Intent launcher = new Intent(activity, EmulationActivity.class);
|
|
|
|
|
|
@@ -172,7 +122,7 @@ public final class EmulationActivity extends AppCompatActivity {
|
|
|
// Set these options now so that the SurfaceView the game renders into is the right size.
|
|
|
enableFullscreenImmersive();
|
|
|
|
|
|
- setTheme(R.style.CitraEmulationBase);
|
|
|
+ setTheme(R.style.YuzuEmulationBase);
|
|
|
|
|
|
setContentView(R.layout.activity_emulation);
|
|
|
|
|
|
@@ -217,52 +167,7 @@ public final class EmulationActivity extends AppCompatActivity {
|
|
|
|
|
|
@Override
|
|
|
public void onBackPressed() {
|
|
|
- NativeLibrary.PauseEmulation();
|
|
|
- new AlertDialog.Builder(this)
|
|
|
- .setTitle(R.string.emulation_close_game)
|
|
|
- .setMessage(R.string.emulation_close_game_message)
|
|
|
- .setPositiveButton(android.R.string.yes, (dialogInterface, i) ->
|
|
|
- {
|
|
|
- mEmulationFragment.stopEmulation();
|
|
|
- finish();
|
|
|
- })
|
|
|
- .setNegativeButton(android.R.string.cancel, (dialogInterface, i) ->
|
|
|
- NativeLibrary.UnPauseEmulation())
|
|
|
- .setOnCancelListener(dialogInterface ->
|
|
|
- NativeLibrary.UnPauseEmulation())
|
|
|
- .create()
|
|
|
- .show();
|
|
|
- }
|
|
|
-
|
|
|
- @Override
|
|
|
- public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
|
|
|
- switch (requestCode) {
|
|
|
- case NativeLibrary.REQUEST_CODE_NATIVE_CAMERA:
|
|
|
- if (grantResults[0] != PackageManager.PERMISSION_GRANTED &&
|
|
|
- shouldShowRequestPermissionRationale(CAMERA)) {
|
|
|
- new AlertDialog.Builder(this)
|
|
|
- .setTitle(R.string.camera)
|
|
|
- .setMessage(R.string.camera_permission_needed)
|
|
|
- .setPositiveButton(android.R.string.ok, null)
|
|
|
- .show();
|
|
|
- }
|
|
|
- NativeLibrary.CameraPermissionResult(grantResults[0] == PackageManager.PERMISSION_GRANTED);
|
|
|
- break;
|
|
|
- case NativeLibrary.REQUEST_CODE_NATIVE_MIC:
|
|
|
- if (grantResults[0] != PackageManager.PERMISSION_GRANTED &&
|
|
|
- shouldShowRequestPermissionRationale(RECORD_AUDIO)) {
|
|
|
- new AlertDialog.Builder(this)
|
|
|
- .setTitle(R.string.microphone)
|
|
|
- .setMessage(R.string.microphone_permission_needed)
|
|
|
- .setPositiveButton(android.R.string.ok, null)
|
|
|
- .show();
|
|
|
- }
|
|
|
- NativeLibrary.MicPermissionResult(grantResults[0] == PackageManager.PERMISSION_GRANTED);
|
|
|
- break;
|
|
|
- default:
|
|
|
- super.onRequestPermissionsResult(requestCode, permissions, grantResults);
|
|
|
- break;
|
|
|
- }
|
|
|
+ toggleMenu();
|
|
|
}
|
|
|
|
|
|
private void enableFullscreenImmersive() {
|
|
|
@@ -276,179 +181,13 @@ public final class EmulationActivity extends AppCompatActivity {
|
|
|
View.SYSTEM_UI_FLAG_IMMERSIVE);
|
|
|
}
|
|
|
|
|
|
- @Override
|
|
|
- public boolean onCreateOptionsMenu(Menu menu) {
|
|
|
- // Inflate the menu; this adds items to the action bar if it is present.
|
|
|
- getMenuInflater().inflate(R.menu.menu_emulation, menu);
|
|
|
-
|
|
|
- int layoutOptionMenuItem = R.id.menu_screen_layout_landscape;
|
|
|
- switch (EmulationMenuSettings.getLandscapeScreenLayout()) {
|
|
|
- case EmulationMenuSettings.LayoutOption_SingleScreen:
|
|
|
- layoutOptionMenuItem = R.id.menu_screen_layout_single;
|
|
|
- break;
|
|
|
- case EmulationMenuSettings.LayoutOption_SideScreen:
|
|
|
- layoutOptionMenuItem = R.id.menu_screen_layout_sidebyside;
|
|
|
- break;
|
|
|
- case EmulationMenuSettings.LayoutOption_MobilePortrait:
|
|
|
- layoutOptionMenuItem = R.id.menu_screen_layout_portrait;
|
|
|
- break;
|
|
|
- }
|
|
|
-
|
|
|
- menu.findItem(layoutOptionMenuItem).setChecked(true);
|
|
|
- menu.findItem(R.id.menu_emulation_joystick_rel_center).setChecked(EmulationMenuSettings.getJoystickRelCenter());
|
|
|
- menu.findItem(R.id.menu_emulation_dpad_slide_enable).setChecked(EmulationMenuSettings.getDpadSlideEnable());
|
|
|
- menu.findItem(R.id.menu_emulation_show_fps).setChecked(EmulationMenuSettings.getShowFps());
|
|
|
- menu.findItem(R.id.menu_emulation_swap_screens).setChecked(EmulationMenuSettings.getSwapScreens());
|
|
|
- menu.findItem(R.id.menu_emulation_show_overlay).setChecked(EmulationMenuSettings.getShowOverlay());
|
|
|
-
|
|
|
- return true;
|
|
|
- }
|
|
|
-
|
|
|
- private void DisplaySavestateWarning() {
|
|
|
- SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(CitraApplication.getAppContext());
|
|
|
- if (preferences.getBoolean("savestateWarningShown", false)) {
|
|
|
- return;
|
|
|
- }
|
|
|
-
|
|
|
- LayoutInflater inflater = mEmulationFragment.requireActivity().getLayoutInflater();
|
|
|
- View view = inflater.inflate(R.layout.dialog_checkbox, null);
|
|
|
- CheckBox checkBox = view.findViewById(R.id.checkBox);
|
|
|
-
|
|
|
- new AlertDialog.Builder(this)
|
|
|
- .setTitle(R.string.savestate_warning_title)
|
|
|
- .setMessage(R.string.savestate_warning_message)
|
|
|
- .setView(view)
|
|
|
- .setPositiveButton(android.R.string.ok, (dialog, which) -> {
|
|
|
- preferences.edit().putBoolean("savestateWarningShown", checkBox.isChecked()).apply();
|
|
|
- })
|
|
|
- .show();
|
|
|
- }
|
|
|
-
|
|
|
- @Override
|
|
|
- public boolean onPrepareOptionsMenu(Menu menu) {
|
|
|
- super.onPrepareOptionsMenu(menu);
|
|
|
- menu.findItem(R.id.menu_emulation_save_state).setVisible(false);
|
|
|
- menu.findItem(R.id.menu_emulation_load_state).setVisible(false);
|
|
|
- return true;
|
|
|
- }
|
|
|
-
|
|
|
- @SuppressWarnings("WrongConstant")
|
|
|
- @Override
|
|
|
- public boolean onOptionsItemSelected(MenuItem item) {
|
|
|
- int action = buttonsActionsMap.get(item.getItemId(), -1);
|
|
|
-
|
|
|
+ public void handleMenuAction(int action) {
|
|
|
switch (action) {
|
|
|
- // Edit the placement of the controls
|
|
|
- case MENU_ACTION_EDIT_CONTROLS_PLACEMENT:
|
|
|
- editControlsPlacement();
|
|
|
- break;
|
|
|
-
|
|
|
- // Enable/Disable specific buttons or the entire input overlay.
|
|
|
- case MENU_ACTION_TOGGLE_CONTROLS:
|
|
|
- toggleControls();
|
|
|
- break;
|
|
|
-
|
|
|
- // Adjust the scale of the overlay controls.
|
|
|
- case MENU_ACTION_ADJUST_SCALE:
|
|
|
- adjustScale();
|
|
|
- break;
|
|
|
-
|
|
|
- // Toggle the visibility of the Performance stats TextView
|
|
|
- case MENU_ACTION_SHOW_FPS: {
|
|
|
- final boolean isEnabled = !EmulationMenuSettings.getShowFps();
|
|
|
- EmulationMenuSettings.setShowFps(isEnabled);
|
|
|
- item.setChecked(isEnabled);
|
|
|
-
|
|
|
- mEmulationFragment.updateShowFpsOverlay();
|
|
|
- break;
|
|
|
- }
|
|
|
- // Sets the screen layout to Landscape
|
|
|
- case MENU_ACTION_SCREEN_LAYOUT_LANDSCAPE:
|
|
|
- changeScreenOrientation(EmulationMenuSettings.LayoutOption_MobileLandscape, item);
|
|
|
- break;
|
|
|
-
|
|
|
- // Sets the screen layout to Portrait
|
|
|
- case MENU_ACTION_SCREEN_LAYOUT_PORTRAIT:
|
|
|
- changeScreenOrientation(EmulationMenuSettings.LayoutOption_MobilePortrait, item);
|
|
|
- break;
|
|
|
-
|
|
|
- // Sets the screen layout to Single
|
|
|
- case MENU_ACTION_SCREEN_LAYOUT_SINGLE:
|
|
|
- changeScreenOrientation(EmulationMenuSettings.LayoutOption_SingleScreen, item);
|
|
|
- break;
|
|
|
-
|
|
|
- // Sets the screen layout to Side by Side
|
|
|
- case MENU_ACTION_SCREEN_LAYOUT_SIDEBYSIDE:
|
|
|
- changeScreenOrientation(EmulationMenuSettings.LayoutOption_SideScreen, item);
|
|
|
- break;
|
|
|
-
|
|
|
- // Swap the top and bottom screen locations
|
|
|
- case MENU_ACTION_SWAP_SCREENS: {
|
|
|
- final boolean isEnabled = !EmulationMenuSettings.getSwapScreens();
|
|
|
- EmulationMenuSettings.setSwapScreens(isEnabled);
|
|
|
- item.setChecked(isEnabled);
|
|
|
- break;
|
|
|
- }
|
|
|
-
|
|
|
- // Reset overlay placement
|
|
|
- case MENU_ACTION_RESET_OVERLAY:
|
|
|
- resetOverlay();
|
|
|
- break;
|
|
|
-
|
|
|
- // Show or hide overlay
|
|
|
- case MENU_ACTION_SHOW_OVERLAY: {
|
|
|
- final boolean isEnabled = !EmulationMenuSettings.getShowOverlay();
|
|
|
- EmulationMenuSettings.setShowOverlay(isEnabled);
|
|
|
- item.setChecked(isEnabled);
|
|
|
-
|
|
|
- mEmulationFragment.refreshInputOverlay();
|
|
|
- break;
|
|
|
- }
|
|
|
-
|
|
|
case MENU_ACTION_EXIT:
|
|
|
mEmulationFragment.stopEmulation();
|
|
|
finish();
|
|
|
break;
|
|
|
-
|
|
|
- case MENU_ACTION_OPEN_SETTINGS:
|
|
|
- SettingsActivity.launch(this, SettingsFile.FILE_NAME_CONFIG, "");
|
|
|
- break;
|
|
|
-
|
|
|
- case MENU_ACTION_LOAD_AMIIBO:
|
|
|
- FileBrowserHelper.openFilePicker(this, REQUEST_SELECT_AMIIBO,
|
|
|
- R.string.select_amiibo,
|
|
|
- Collections.singletonList("bin"), false);
|
|
|
- break;
|
|
|
-
|
|
|
- case MENU_ACTION_REMOVE_AMIIBO:
|
|
|
- RemoveAmiibo();
|
|
|
- break;
|
|
|
-
|
|
|
- case MENU_ACTION_JOYSTICK_REL_CENTER:
|
|
|
- final boolean isJoystickRelCenterEnabled = !EmulationMenuSettings.getJoystickRelCenter();
|
|
|
- EmulationMenuSettings.setJoystickRelCenter(isJoystickRelCenterEnabled);
|
|
|
- item.setChecked(isJoystickRelCenterEnabled);
|
|
|
- break;
|
|
|
-
|
|
|
- case MENU_ACTION_DPAD_SLIDE_ENABLE:
|
|
|
- final boolean isDpadSlideEnabled = !EmulationMenuSettings.getDpadSlideEnable();
|
|
|
- EmulationMenuSettings.setDpadSlideEnable(isDpadSlideEnabled);
|
|
|
- item.setChecked(isDpadSlideEnabled);
|
|
|
- break;
|
|
|
-
|
|
|
- case MENU_ACTION_OPEN_CHEATS:
|
|
|
- CheatsActivity.launch(this);
|
|
|
- break;
|
|
|
}
|
|
|
-
|
|
|
- return true;
|
|
|
- }
|
|
|
-
|
|
|
- private void changeScreenOrientation(int layoutOption, MenuItem item) {
|
|
|
- item.setChecked(true);
|
|
|
- NativeLibrary.NotifyOrientationChange(layoutOption, getWindowManager().getDefaultDisplay()
|
|
|
- .getRotation());
|
|
|
- EmulationMenuSettings.setLandscapeScreenLayout(layoutOption);
|
|
|
}
|
|
|
|
|
|
private void editControlsPlacement() {
|
|
|
@@ -462,6 +201,11 @@ public final class EmulationActivity extends AppCompatActivity {
|
|
|
// Gets button presses
|
|
|
@Override
|
|
|
public boolean dispatchKeyEvent(KeyEvent event) {
|
|
|
+ if (mMenuVisible || event.getKeyCode() == KeyEvent.KEYCODE_BACK)
|
|
|
+ {
|
|
|
+ return super.dispatchKeyEvent(event);
|
|
|
+ }
|
|
|
+
|
|
|
int action;
|
|
|
int button = mPreferences.getInt(InputBindingSetting.getInputButtonKey(event.getKeyCode()), event.getKeyCode());
|
|
|
|
|
|
@@ -492,49 +236,6 @@ public final class EmulationActivity extends AppCompatActivity {
|
|
|
return NativeLibrary.onGamePadEvent(input.getDescriptor(), button, action);
|
|
|
}
|
|
|
|
|
|
- @Override
|
|
|
- protected void onActivityResult(int requestCode, int resultCode, Intent result) {
|
|
|
- super.onActivityResult(requestCode, resultCode, result);
|
|
|
- switch (requestCode) {
|
|
|
- case StillImageCameraHelper.REQUEST_CAMERA_FILE_PICKER:
|
|
|
- StillImageCameraHelper.OnFilePickerResult(resultCode == RESULT_OK ? result : null);
|
|
|
- break;
|
|
|
- case REQUEST_SELECT_AMIIBO:
|
|
|
- // If the user picked a file, as opposed to just backing out.
|
|
|
- if (resultCode == MainActivity.RESULT_OK) {
|
|
|
- String[] selectedFiles = FileBrowserHelper.getSelectedFiles(result);
|
|
|
- if (selectedFiles == null)
|
|
|
- return;
|
|
|
-
|
|
|
- onAmiiboSelected(selectedFiles[0]);
|
|
|
- }
|
|
|
- break;
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- private void onAmiiboSelected(String selectedFile) {
|
|
|
- File file = new File(selectedFile);
|
|
|
- boolean success = false;
|
|
|
- try {
|
|
|
- byte[] bytes = FileUtil.getBytesFromFile(file);
|
|
|
- } catch (IOException e) {
|
|
|
- e.printStackTrace();
|
|
|
- }
|
|
|
-
|
|
|
- if (!success) {
|
|
|
- new AlertDialog.Builder(this)
|
|
|
- .setTitle(R.string.amiibo_load_error)
|
|
|
- .setMessage(R.string.amiibo_load_error_message)
|
|
|
- .setPositiveButton(android.R.string.ok, null)
|
|
|
- .create()
|
|
|
- .show();
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- private void RemoveAmiibo() {
|
|
|
-
|
|
|
- }
|
|
|
-
|
|
|
private void toggleControls() {
|
|
|
final SharedPreferences.Editor editor = mPreferences.edit();
|
|
|
boolean[] enabledButtons = new boolean[14];
|
|
|
@@ -630,8 +331,59 @@ public final class EmulationActivity extends AppCompatActivity {
|
|
|
.show();
|
|
|
}
|
|
|
|
|
|
+ private static boolean areCoordinatesOutside(@Nullable View view, float x, float y)
|
|
|
+ {
|
|
|
+ if (view == null)
|
|
|
+ {
|
|
|
+ return true;
|
|
|
+ }
|
|
|
+
|
|
|
+ Rect viewBounds = new Rect();
|
|
|
+ view.getGlobalVisibleRect(viewBounds);
|
|
|
+ return !viewBounds.contains(Math.round(x), Math.round(y));
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public boolean dispatchTouchEvent(MotionEvent event)
|
|
|
+ {
|
|
|
+ if (event.getActionMasked() == MotionEvent.ACTION_DOWN)
|
|
|
+ {
|
|
|
+ boolean anyMenuClosed = false;
|
|
|
+
|
|
|
+ Fragment submenu = getSupportFragmentManager().findFragmentById(R.id.frame_submenu);
|
|
|
+ if (submenu != null && areCoordinatesOutside(submenu.getView(), event.getX(), event.getY()))
|
|
|
+ {
|
|
|
+ closeSubmenu();
|
|
|
+ submenu = null;
|
|
|
+ anyMenuClosed = true;
|
|
|
+ }
|
|
|
+
|
|
|
+ if (submenu == null)
|
|
|
+ {
|
|
|
+ Fragment menu = getSupportFragmentManager().findFragmentById(R.id.frame_menu);
|
|
|
+ if (menu != null && areCoordinatesOutside(menu.getView(), event.getX(), event.getY()))
|
|
|
+ {
|
|
|
+ closeMenu();
|
|
|
+ anyMenuClosed = true;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ if (anyMenuClosed)
|
|
|
+ {
|
|
|
+ return true;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ return super.dispatchTouchEvent(event);
|
|
|
+ }
|
|
|
+
|
|
|
@Override
|
|
|
public boolean dispatchGenericMotionEvent(MotionEvent event) {
|
|
|
+ if (mMenuVisible)
|
|
|
+ {
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+
|
|
|
if (((event.getSource() & InputDevice.SOURCE_CLASS_JOYSTICK) == 0)) {
|
|
|
return super.dispatchGenericMotionEvent(event);
|
|
|
}
|
|
|
@@ -747,9 +499,39 @@ public final class EmulationActivity extends AppCompatActivity {
|
|
|
|
|
|
@Retention(SOURCE)
|
|
|
@IntDef({MENU_ACTION_EDIT_CONTROLS_PLACEMENT, MENU_ACTION_TOGGLE_CONTROLS, MENU_ACTION_ADJUST_SCALE,
|
|
|
- MENU_ACTION_EXIT, MENU_ACTION_SHOW_FPS, MENU_ACTION_SCREEN_LAYOUT_LANDSCAPE,
|
|
|
- MENU_ACTION_SCREEN_LAYOUT_PORTRAIT, MENU_ACTION_SCREEN_LAYOUT_SINGLE, MENU_ACTION_SCREEN_LAYOUT_SIDEBYSIDE,
|
|
|
- MENU_ACTION_SWAP_SCREENS, MENU_ACTION_RESET_OVERLAY, MENU_ACTION_SHOW_OVERLAY, MENU_ACTION_OPEN_SETTINGS})
|
|
|
+ MENU_ACTION_EXIT, MENU_ACTION_SHOW_FPS, MENU_ACTION_RESET_OVERLAY, MENU_ACTION_SHOW_OVERLAY, MENU_ACTION_OPEN_SETTINGS})
|
|
|
public @interface MenuAction {
|
|
|
}
|
|
|
+
|
|
|
+ private boolean closeSubmenu()
|
|
|
+ {
|
|
|
+ return getSupportFragmentManager().popBackStackImmediate(BACKSTACK_NAME_SUBMENU,
|
|
|
+ FragmentManager.POP_BACK_STACK_INCLUSIVE);
|
|
|
+ }
|
|
|
+
|
|
|
+ private boolean closeMenu()
|
|
|
+ {
|
|
|
+ mMenuVisible = false;
|
|
|
+ return getSupportFragmentManager().popBackStackImmediate(BACKSTACK_NAME_MENU,
|
|
|
+ FragmentManager.POP_BACK_STACK_INCLUSIVE);
|
|
|
+ }
|
|
|
+
|
|
|
+ private void toggleMenu()
|
|
|
+ {
|
|
|
+ if (!closeMenu()) {
|
|
|
+ // Removing the menu failed, so that means it wasn't visible. Add it.
|
|
|
+ Fragment fragment = MenuFragment.newInstance();
|
|
|
+ getSupportFragmentManager().beginTransaction()
|
|
|
+ .setCustomAnimations(
|
|
|
+ R.animator.menu_slide_in_from_start,
|
|
|
+ R.animator.menu_slide_out_to_start,
|
|
|
+ R.animator.menu_slide_in_from_start,
|
|
|
+ R.animator.menu_slide_out_to_start)
|
|
|
+ .add(R.id.frame_menu, fragment)
|
|
|
+ .addToBackStack(BACKSTACK_NAME_MENU)
|
|
|
+ .commit();
|
|
|
+ mMenuVisible = true;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
}
|