diff --git a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/CustomControlsActivity.java b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/CustomControlsActivity.java index 6e328b843..b7c6c9607 100644 --- a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/CustomControlsActivity.java +++ b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/CustomControlsActivity.java @@ -1,6 +1,5 @@ package net.kdt.pojavlaunch; -import android.app.Activity; import android.content.Context; import android.content.Intent; import android.net.Uri; @@ -9,7 +8,6 @@ import android.os.Bundle; import android.provider.DocumentsContract; import android.view.View; import android.widget.ArrayAdapter; -import android.widget.Button; import android.widget.EditText; import android.widget.ListView; import android.widget.Toast; @@ -24,18 +22,17 @@ import com.kdt.pickafile.FileSelectedListener; import net.kdt.pojavlaunch.customcontrols.ControlData; import net.kdt.pojavlaunch.customcontrols.ControlDrawerData; import net.kdt.pojavlaunch.customcontrols.ControlLayout; +import net.kdt.pojavlaunch.customcontrols.Exitable; import net.kdt.pojavlaunch.prefs.LauncherPreferences; import java.io.File; import java.io.IOException; -public class CustomControlsActivity extends BaseActivity { +public class CustomControlsActivity extends BaseActivity implements Exitable { private DrawerLayout mDrawerLayout; private ListView mDrawerNavigationView; private ControlLayout mControlLayout; - - public boolean isModified = false; private static String sSelectedName = "new_control"; @Override @@ -59,7 +56,7 @@ public class CustomControlsActivity extends BaseActivity { case 1: mControlLayout.addDrawer(new ControlDrawerData()); break; //case 2: mControlLayout.addJoystickButton(new ControlData()); break; case 2: load(mControlLayout); break; - case 3: save(false, mControlLayout); break; + case 3: save( mControlLayout, this); break; case 4: dialogSelectDefaultCtrl(mControlLayout); break; case 5: // Saving the currently shown control try { @@ -81,7 +78,6 @@ public class CustomControlsActivity extends BaseActivity { } mDrawerLayout.closeDrawers(); }); - mControlLayout.setActivity(this); mControlLayout.setModifiable(true); loadControl(LauncherPreferences.PREF_DEFAULTCTRL_PATH, mControlLayout); @@ -89,13 +85,7 @@ public class CustomControlsActivity extends BaseActivity { @Override public void onBackPressed() { - if (!isModified) { - setResult(Activity.RESULT_OK, new Intent()); - super.onBackPressed(); - return; - } - - save(true, mControlLayout); + mControlLayout.askToExit(this); } public static void dialogSelectDefaultCtrl(final ControlLayout layout) { @@ -119,7 +109,7 @@ public class CustomControlsActivity extends BaseActivity { } - public static void save(final boolean exit, final ControlLayout layout) { + public static void save(final ControlLayout layout, final Exitable exitListener) { final Context ctx = layout.getContext(); final EditText edit = new EditText(ctx); edit.setSingleLine(); @@ -130,49 +120,58 @@ public class CustomControlsActivity extends BaseActivity { builder.setView(edit); builder.setPositiveButton(android.R.string.ok, null); builder.setNegativeButton(android.R.string.cancel, null); - if (exit) { - builder.setNeutralButton(R.string.mcn_exit_call, (p1, p2) -> { - layout.setModifiable(false); - if(ctx instanceof MainActivity) { - ((MainActivity) ctx).leaveCustomControls(); - }else{ - ((CustomControlsActivity) ctx).isModified = false; - ((Activity)ctx).onBackPressed(); - } - }); - } + if(exitListener != null) builder.setNeutralButton(R.string.global_save_and_exit, null); final AlertDialog dialog = builder.create(); dialog.setOnShowListener(dialogInterface -> { - - Button button = dialog.getButton(AlertDialog.BUTTON_POSITIVE); - button.setOnClickListener(view -> { - if (edit.getText().toString().isEmpty()) { - edit.setError(ctx.getResources().getString(R.string.global_error_field_empty)); - return; - } - - try { - String jsonPath = doSaveCtrl(edit.getText().toString(),layout); - Toast.makeText(ctx, ctx.getString(R.string.global_save) + ": " + jsonPath, Toast.LENGTH_SHORT).show(); - - dialog.dismiss(); - if (!exit) return; - - if(ctx instanceof MainActivity) { - ((MainActivity) ctx).leaveCustomControls(); - }else{ - ((Activity)ctx).onBackPressed(); - } - } catch (Throwable th) { - Tools.showError(ctx, th, exit); - } - - }); + dialog.getButton(AlertDialog.BUTTON_POSITIVE) + .setOnClickListener(new OnClickExitListener(dialog, edit, layout, null)); + if(exitListener != null) dialog.getButton(AlertDialog.BUTTON_NEUTRAL) + .setOnClickListener(new OnClickExitListener(dialog, edit, layout, exitListener)); }); dialog.show(); } + static class OnClickExitListener implements View.OnClickListener { + private final AlertDialog mDialog; + private final EditText mEditText; + private final ControlLayout mLayout; + private final Exitable mListener; + + public OnClickExitListener(AlertDialog mDialog, EditText mEditText, ControlLayout mLayout, Exitable mListener) { + this.mDialog = mDialog; + this.mEditText = mEditText; + this.mLayout = mLayout; + this.mListener = mListener; + } + + @Override + public void onClick(View v) { + Context context = v.getContext(); + if (mEditText.getText().toString().isEmpty()) { + mEditText.setError(context.getString(R.string.global_error_field_empty)); + return; + } + try { + String jsonPath = doSaveCtrl(mEditText.getText().toString(),mLayout); + Toast.makeText(context, context.getString(R.string.global_save) + ": " + jsonPath, Toast.LENGTH_SHORT).show(); + mDialog.dismiss(); + if(mListener != null) mListener.exitEditor(); + } catch (Throwable th) { + Tools.showError(context, th, mListener != null); + } + } + } + + public static void showExitDialog(Context context, Exitable exitListener) { + AlertDialog.Builder builder = new AlertDialog.Builder(context); + builder.setTitle(R.string.customctrl_editor_exit_title); + builder.setMessage(R.string.customctrl_editor_exit_msg); + builder.setPositiveButton(R.string.global_yes, (d,w)->exitListener.exitEditor()); + builder.setNegativeButton(R.string.global_no, (d,w)->{}); + builder.show(); + } + public static void load(final ControlLayout layout) { AlertDialog.Builder builder = new AlertDialog.Builder(layout.getContext()); builder.setTitle(R.string.global_load); @@ -222,4 +221,9 @@ public class CustomControlsActivity extends BaseActivity { Tools.showError(layout.getContext(), e); } } + + @Override + public void exitEditor() { + super.onBackPressed(); + } } diff --git a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/MainActivity.java b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/MainActivity.java index 6e4be0d16..0170ffe85 100644 --- a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/MainActivity.java +++ b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/MainActivity.java @@ -46,6 +46,7 @@ import net.kdt.pojavlaunch.customcontrols.ControlData; import net.kdt.pojavlaunch.customcontrols.ControlDrawerData; import net.kdt.pojavlaunch.customcontrols.ControlLayout; import net.kdt.pojavlaunch.customcontrols.CustomControls; +import net.kdt.pojavlaunch.customcontrols.Exitable; import net.kdt.pojavlaunch.customcontrols.keyboard.LwjglCharSender; import net.kdt.pojavlaunch.customcontrols.keyboard.TouchCharInput; import net.kdt.pojavlaunch.prefs.LauncherPreferences; @@ -61,7 +62,7 @@ import org.lwjgl.glfw.CallbackBridge; import java.io.File; import java.io.IOException; -public class MainActivity extends BaseActivity implements ControlButtonMenuListener{ +public class MainActivity extends BaseActivity implements ControlButtonMenuListener, Exitable { public static volatile ClipboardManager GLOBAL_CLIPBOARD; public static final String INTENT_MINECRAFT_VERSION = "intent_version"; @@ -111,8 +112,9 @@ public class MainActivity extends BaseActivity implements ControlButtonMenuListe case 1: mControlLayout.addDrawer(new ControlDrawerData()); break; //case 2: mControlLayout.addJoystickButton(new ControlData()); break; case 2 : CustomControlsActivity.load(mControlLayout); break; - case 3: CustomControlsActivity.save(true,mControlLayout); break; + case 3: CustomControlsActivity.save(mControlLayout, this); break; case 4: CustomControlsActivity.dialogSelectDefaultCtrl(mControlLayout); break; + case 5: CustomControlsActivity.showExitDialog(this, this); } }; @@ -365,24 +367,6 @@ public class MainActivity extends BaseActivity implements ControlButtonMenuListe isInEditor = true; } - public void leaveCustomControls() { - try { - MainActivity.mControlLayout.loadLayout((CustomControls)null); - MainActivity.mControlLayout.setModifiable(false); - System.gc(); - MainActivity.mControlLayout.loadLayout( - minecraftProfile.controlFile == null - ? LauncherPreferences.PREF_DEFAULTCTRL_PATH - : Tools.CTRLMAP_PATH + "/" + minecraftProfile.controlFile); - mDrawerPullButton.setVisibility(mControlLayout.hasMenuButton() ? View.GONE : View.VISIBLE); - } catch (IOException e) { - Tools.showError(this,e); - } - //((MainActivity) this).mControlLayout.loadLayout((CustomControls)null); - navDrawer.setAdapter(gameActionArrayAdapter); - navDrawer.setOnItemClickListener(gameActionClickListener); - isInEditor = false; - } private void openLogOutput() { loggerView.setVisibility(View.VISIBLE); } @@ -410,7 +394,13 @@ public class MainActivity extends BaseActivity implements ControlButtonMenuListe @Override public boolean dispatchKeyEvent(KeyEvent event) { - if(isInEditor) return super.dispatchKeyEvent(event); + if(isInEditor) { + if(event.getKeyCode() == KeyEvent.KEYCODE_BACK) { + if(event.getAction() == KeyEvent.ACTION_DOWN) mControlLayout.askToExit(this); + return true; + } + return super.dispatchKeyEvent(event); + } boolean handleEvent; if(!(handleEvent = minecraftGLView.processKeyEvent(event))) { if (event.getKeyCode() == KeyEvent.KEYCODE_BACK && !touchCharInput.isEnabled()) { @@ -559,4 +549,24 @@ public class MainActivity extends BaseActivity implements ControlButtonMenuListe drawerLayout.openDrawer(navDrawer); navDrawer.requestLayout(); } + + @Override + public void exitEditor() { + try { + MainActivity.mControlLayout.loadLayout((CustomControls)null); + MainActivity.mControlLayout.setModifiable(false); + System.gc(); + MainActivity.mControlLayout.loadLayout( + minecraftProfile.controlFile == null + ? LauncherPreferences.PREF_DEFAULTCTRL_PATH + : Tools.CTRLMAP_PATH + "/" + minecraftProfile.controlFile); + mDrawerPullButton.setVisibility(mControlLayout.hasMenuButton() ? View.GONE : View.VISIBLE); + } catch (IOException e) { + Tools.showError(this,e); + } + //((MainActivity) this).mControlLayout.loadLayout((CustomControls)null); + navDrawer.setAdapter(gameActionArrayAdapter); + navDrawer.setOnItemClickListener(gameActionClickListener); + isInEditor = false; + } } diff --git a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/ControlLayout.java b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/ControlLayout.java index 14f331cba..f0ebc0f9f 100644 --- a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/ControlLayout.java +++ b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/ControlLayout.java @@ -34,7 +34,7 @@ public class ControlLayout extends FrameLayout { /* Cache to buttons for performance purposes */ private List mButtons; private boolean mModifiable = false; - private CustomControlsActivity mActivity; + private boolean mIsModified; private boolean mControlVisible = false; private EditControlPopup mControlPopup = null; @@ -187,10 +187,6 @@ public class ControlLayout extends FrameLayout { setModified(false); } - public void setActivity(CustomControlsActivity activity) { - mActivity = activity; - } - public void toggleControlVisible(){ mControlVisible = !mControlVisible; setControlVisible(mControlVisible); @@ -225,8 +221,7 @@ public class ControlLayout extends FrameLayout { } public void setModified(boolean isModified) { - if (mActivity != null) mActivity.isModified = isModified; - + mIsModified = isModified; } public List getButtonChildren(){ @@ -412,4 +407,12 @@ public class ControlLayout extends FrameLayout { } return mGameSurface; } + + public void askToExit(Exitable exitable) { + if(mIsModified) { + CustomControlsActivity.save(this, exitable); + }else{ + CustomControlsActivity.showExitDialog(getContext(), exitable); + } + } } diff --git a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/Exitable.java b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/Exitable.java new file mode 100644 index 000000000..c70ae484a --- /dev/null +++ b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/Exitable.java @@ -0,0 +1,5 @@ +package net.kdt.pojavlaunch.customcontrols; + +public interface Exitable { + void exitEditor(); +} diff --git a/app_pojavlauncher/src/main/res/values/headings_array.xml b/app_pojavlauncher/src/main/res/values/headings_array.xml index 067259b26..fb5d4c695 100644 --- a/app_pojavlauncher/src/main/res/values/headings_array.xml +++ b/app_pojavlauncher/src/main/res/values/headings_array.xml @@ -13,6 +13,7 @@ @string/global_load @string/global_save @string/customctrl_selectdefault + @string/customctrl_editor_exit diff --git a/app_pojavlauncher/src/main/res/values/strings.xml b/app_pojavlauncher/src/main/res/values/strings.xml index 51fbdaef9..28859966b 100644 --- a/app_pojavlauncher/src/main/res/values/strings.xml +++ b/app_pojavlauncher/src/main/res/values/strings.xml @@ -357,4 +357,10 @@ Enable shader dumping Log converted shaders into the log file %d%% + Leaving? + Are you sure you want to exit? + Leave editor + Save and exit + Yes + No