From a1cc19f443fb9c39d1341f3aa1c80b1ecfe0ec4d Mon Sep 17 00:00:00 2001 From: JosJuice Date: Sun, 30 Oct 2022 17:20:10 +0100 Subject: [PATCH] Android: Add "Create mappings for other devices" --- .../features/input/ui/MotionAlertDialog.java | 12 ++++--- .../settings/ui/SettingsActivity.java | 25 ++++++++++++-- .../settings/ui/SettingsActivityView.java | 12 +++++++ .../features/settings/ui/SettingsAdapter.java | 3 +- .../settings/ui/SettingsFragment.java | 12 +++++++ .../ui/SettingsFragmentPresenter.java | 34 +++++++++++++++++++ .../settings/ui/SettingsFragmentView.java | 12 +++++++ .../app/src/main/res/values/strings.xml | 2 ++ 8 files changed, 105 insertions(+), 7 deletions(-) diff --git a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/input/ui/MotionAlertDialog.java b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/input/ui/MotionAlertDialog.java index 0a4afc7acf..9872bdd01e 100644 --- a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/input/ui/MotionAlertDialog.java +++ b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/input/ui/MotionAlertDialog.java @@ -22,20 +22,24 @@ public final class MotionAlertDialog extends AlertDialog { private final Activity mActivity; private final InputMappingControlSetting mSetting; + private final boolean mAllDevices; private boolean mRunning = false; /** * Constructor * - * @param activity The current {@link Activity}. - * @param setting The setting to show this dialog for. + * @param activity The current {@link Activity}. + * @param setting The setting to show this dialog for. + * @param allDevices Whether to detect inputs from devices other than the configured one. */ - public MotionAlertDialog(Activity activity, InputMappingControlSetting setting) + public MotionAlertDialog(Activity activity, InputMappingControlSetting setting, + boolean allDevices) { super(activity); mActivity = activity; mSetting = setting; + mAllDevices = allDevices; } @Override @@ -46,7 +50,7 @@ public final class MotionAlertDialog extends AlertDialog mRunning = true; new Thread(() -> { - String result = MappingCommon.detectInput(mSetting.getController(), false); + String result = MappingCommon.detectInput(mSetting.getController(), mAllDevices); mActivity.runOnUiThread(() -> { if (mRunning) diff --git a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/ui/SettingsActivity.java b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/ui/SettingsActivity.java index 2af17e2d2f..f10a915bcc 100644 --- a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/ui/SettingsActivity.java +++ b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/ui/SettingsActivity.java @@ -41,15 +41,17 @@ public final class SettingsActivity extends AppCompatActivity implements Setting private static final String ARG_GAME_ID = "game_id"; private static final String ARG_REVISION = "revision"; private static final String ARG_IS_WII = "is_wii"; + private static final String KEY_MAPPING_ALL_DEVICES = "all_devices"; private static final String FRAGMENT_TAG = "settings"; + private SettingsActivityPresenter mPresenter; - private AlertDialog dialog; - private CollapsingToolbarLayout mToolbarLayout; private ActivitySettingsBinding mBinding; + private boolean mMappingAllDevices = false; + public static void launch(Context context, MenuTag menuTag, String gameId, int revision, boolean isWii) { @@ -82,6 +84,10 @@ public final class SettingsActivity extends AppCompatActivity implements Setting { MainPresenter.skipRescanningLibrary(); } + else + { + mMappingAllDevices = savedInstanceState.getBoolean(KEY_MAPPING_ALL_DEVICES); + } mBinding = ActivitySettingsBinding.inflate(getLayoutInflater()); setContentView(mBinding.getRoot()); @@ -125,7 +131,10 @@ public final class SettingsActivity extends AppCompatActivity implements Setting { // Critical: If super method is not called, rotations will be busted. super.onSaveInstanceState(outState); + mPresenter.saveState(outState); + + outState.putBoolean(KEY_MAPPING_ALL_DEVICES, mMappingAllDevices); } @Override @@ -333,6 +342,18 @@ public final class SettingsActivity extends AppCompatActivity implements Setting mToolbarLayout.setTitle(title); } + @Override + public void setMappingAllDevices(boolean allDevices) + { + mMappingAllDevices = allDevices; + } + + @Override + public boolean isMappingAllDevices() + { + return mMappingAllDevices; + } + private void setInsets() { ViewCompat.setOnApplyWindowInsetsListener(mBinding.appbarSettings, (v, windowInsets) -> diff --git a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/ui/SettingsActivityView.java b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/ui/SettingsActivityView.java index c835aa4399..d71d729af8 100644 --- a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/ui/SettingsActivityView.java +++ b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/ui/SettingsActivityView.java @@ -97,4 +97,16 @@ public interface SettingsActivityView * Accesses the material toolbar layout and changes the title */ void setToolbarTitle(String title); + + /** + * Sets whether the input mapping dialog should detect inputs from all devices, + * not just the device configured for the controller. + */ + void setMappingAllDevices(boolean allDevices); + + /** + * Returns whether the input mapping dialog should detect inputs from all devices, + * not just the device configured for the controller. + */ + boolean isMappingAllDevices(); } diff --git a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/ui/SettingsAdapter.java b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/ui/SettingsAdapter.java index cd2d047ecb..10ca9ddef2 100644 --- a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/ui/SettingsAdapter.java +++ b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/ui/SettingsAdapter.java @@ -312,7 +312,8 @@ public final class SettingsAdapter extends RecyclerView.Adapter diff --git a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/ui/SettingsFragmentPresenter.java b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/ui/SettingsFragmentPresenter.java index c0540cefed..e2199d2922 100644 --- a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/ui/SettingsFragmentPresenter.java +++ b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/ui/SettingsFragmentPresenter.java @@ -1179,6 +1179,40 @@ public final class SettingsFragmentPresenter private void addControllerMetaSettings(ArrayList sl, EmulatedController controller) { sl.add(new InputDeviceSetting(mContext, R.string.input_device, 0, controller)); + + sl.add(new SwitchSetting(mContext, new AbstractBooleanSetting() + { + @Override + public boolean isOverridden(Settings settings) + { + return false; + } + + @Override + public boolean isRuntimeEditable() + { + return true; + } + + @Override + public boolean delete(Settings settings) + { + mView.setMappingAllDevices(false); + return true; + } + + @Override + public boolean getBoolean(Settings settings) + { + return mView.isMappingAllDevices(); + } + + @Override + public void setBoolean(Settings settings, boolean newValue) + { + mView.setMappingAllDevices(newValue); + } + }, R.string.input_device_all_devices, R.string.input_device_all_devices_description)); } /** diff --git a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/ui/SettingsFragmentView.java b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/ui/SettingsFragmentView.java index 295ff95abd..280657158f 100644 --- a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/ui/SettingsFragmentView.java +++ b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/ui/SettingsFragmentView.java @@ -89,4 +89,16 @@ public interface SettingsFragmentView * @param value The current value of the setting. */ boolean hasMenuTagActionForValue(@NonNull MenuTag menuTag, int value); + + /** + * Sets whether the input mapping dialog should detect inputs from all devices, + * not just the device configured for the controller. + */ + void setMappingAllDevices(boolean allDevices); + + /** + * Returns whether the input mapping dialog should detect inputs from all devices, + * not just the device configured for the controller. + */ + boolean isMappingAllDevices(); } diff --git a/Source/Android/app/src/main/res/values/strings.xml b/Source/Android/app/src/main/res/values/strings.xml index 3cde229c28..f8c4852027 100644 --- a/Source/Android/app/src/main/res/values/strings.xml +++ b/Source/Android/app/src/main/res/values/strings.xml @@ -28,6 +28,8 @@ Extension Device + Create Mappings for Other Devices + Detects inputs from all devices, not just the selected device. Input Binding Press or move an input to bind it to %1$s.