From fb046220393a7e3a3a8fcb928945aa069b56847a Mon Sep 17 00:00:00 2001 From: sigmabeta Date: Sun, 24 Jan 2016 19:31:34 -0500 Subject: [PATCH] Fix bugs in Setting screen & add a way to exit without saving --- .../ui/settings/SettingsActivity.java | 41 ++++++++++++++++++ .../settings/SettingsActivityPresenter.java | 37 +++++++++++++++- .../ui/settings/SettingsActivityView.java | 11 +++++ .../ui/settings/SettingsAdapter.java | 3 ++ .../ui/settings/SettingsFragment.java | 27 ++++++++++++ .../settings/SettingsFragmentPresenter.java | 7 ++- .../ui/settings/SettingsFragmentView.java | 11 +++++ .../src/main/res/drawable-hdpi/ic_cancel.png | Bin 0 -> 276 bytes .../src/main/res/drawable-mdpi/ic_cancel.png | Bin 0 -> 209 bytes .../src/main/res/drawable-xhdpi/ic_cancel.png | Bin 0 -> 329 bytes .../main/res/drawable-xxhdpi/ic_cancel.png | Bin 0 -> 462 bytes .../main/res/drawable-xxxhdpi/ic_cancel.png | Bin 0 -> 601 bytes .../app/src/main/res/layout/fragment_grid.xml | 2 +- .../src/main/res/menu/menu_add_directory.xml | 5 ++- .../app/src/main/res/menu/menu_settings.xml | 10 +++++ .../app/src/main/res/values/strings.xml | 1 + Source/Android/build.gradle | 2 +- 17 files changed, 150 insertions(+), 7 deletions(-) create mode 100644 Source/Android/app/src/main/res/drawable-hdpi/ic_cancel.png create mode 100644 Source/Android/app/src/main/res/drawable-mdpi/ic_cancel.png create mode 100644 Source/Android/app/src/main/res/drawable-xhdpi/ic_cancel.png create mode 100644 Source/Android/app/src/main/res/drawable-xxhdpi/ic_cancel.png create mode 100644 Source/Android/app/src/main/res/drawable-xxxhdpi/ic_cancel.png create mode 100644 Source/Android/app/src/main/res/menu/menu_settings.xml diff --git a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/ui/settings/SettingsActivity.java b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/ui/settings/SettingsActivity.java index 9af89ae48a..c84c145f6e 100644 --- a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/ui/settings/SettingsActivity.java +++ b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/ui/settings/SettingsActivity.java @@ -6,6 +6,9 @@ import android.content.Context; import android.content.Intent; import android.os.Bundle; import android.support.v7.app.AppCompatActivity; +import android.view.Menu; +import android.view.MenuInflater; +import android.view.MenuItem; import android.widget.Toast; import org.dolphinemu.dolphinemu.BuildConfig; @@ -32,6 +35,27 @@ public final class SettingsActivity extends AppCompatActivity implements Setting mPresenter.onCreate(savedInstanceState, filename); } + @Override + public boolean onCreateOptionsMenu(Menu menu) + { + MenuInflater inflater = getMenuInflater(); + inflater.inflate(R.menu.menu_settings, menu); + + return true; + } + + @Override + public boolean onOptionsItemSelected(MenuItem item) + { + return mPresenter.handleOptionsItem(item.getItemId()); + } + + @Override + protected void onSaveInstanceState(Bundle outState) + { + mPresenter.saveState(outState); + } + /** * If this is called, the user has left the settings screen (potentially through the * home button) and will expect their changes to be persisted. So we kick off an @@ -96,6 +120,17 @@ public final class SettingsActivity extends AppCompatActivity implements Setting } } + @Override + public void onSettingsFileNotFound() + { + SettingsFragmentView fragment = getFragment(); + + if (fragment != null) + { + fragment.loadDefaultSettings(); + } + } + @Override public void showToastMessage(String message) { @@ -108,6 +143,12 @@ public final class SettingsActivity extends AppCompatActivity implements Setting getFragmentManager().popBackStackImmediate(); } + @Override + public void onSettingChanged() + { + mPresenter.onSettingChanged(); + } + private SettingsFragment getFragment() { return (SettingsFragment) getFragmentManager().findFragmentByTag(SettingsFragment.FRAGMENT_TAG); diff --git a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/ui/settings/SettingsActivityPresenter.java b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/ui/settings/SettingsActivityPresenter.java index 46d95e47f6..8c16443cec 100644 --- a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/ui/settings/SettingsActivityPresenter.java +++ b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/ui/settings/SettingsActivityPresenter.java @@ -3,6 +3,8 @@ package org.dolphinemu.dolphinemu.ui.settings; import android.os.Bundle; +import org.dolphinemu.dolphinemu.BuildConfig; +import org.dolphinemu.dolphinemu.R; import org.dolphinemu.dolphinemu.model.settings.SettingSection; import org.dolphinemu.dolphinemu.utils.Log; import org.dolphinemu.dolphinemu.utils.SettingsFile; @@ -15,6 +17,8 @@ import rx.schedulers.Schedulers; public final class SettingsActivityPresenter { + private static final String SHOULD_SAVE = BuildConfig.APPLICATION_ID + ".should_save"; + private SettingsActivityView mView; private String mFileName; @@ -22,6 +26,8 @@ public final class SettingsActivityPresenter private int mStackCount; + private boolean mShouldSave; + public SettingsActivityPresenter(SettingsActivityView view) { mView = view; @@ -51,12 +57,16 @@ public final class SettingsActivityPresenter public void call(Throwable throwable) { Log.error("[SettingsActivityPresenter] Error reading file " + filename + ".ini: "+ throwable.getMessage()); - mView.onSettingsFileLoaded(null); + mView.onSettingsFileNotFound(); } }); mView.showSettingsFragment(mFileName, false); } + else + { + mShouldSave = savedInstanceState.getBoolean(SHOULD_SAVE); + } } public void setSettings(HashMap settings) @@ -71,7 +81,7 @@ public final class SettingsActivityPresenter public void onStop(boolean finishing) { - if (mSettingsBySection != null && finishing) + if (mSettingsBySection != null && finishing && mShouldSave) { Log.debug("[SettingsActivity] Settings activity stopping. Saving settings to INI..."); SettingsFile.saveFile(mFileName, mSettingsBySection) @@ -114,4 +124,27 @@ public final class SettingsActivityPresenter mView.finish(); } } + + public boolean handleOptionsItem(int itemId) + { + switch (itemId) + { + case R.id.menu_exit_no_save: + mShouldSave = false; + mView.finish(); + return true; + } + + return false; + } + + public void onSettingChanged() + { + mShouldSave = true; + } + + public void saveState(Bundle outState) + { + outState.putBoolean(SHOULD_SAVE, mShouldSave); + } } diff --git a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/ui/settings/SettingsActivityView.java b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/ui/settings/SettingsActivityView.java index 84221b0220..0a14440087 100644 --- a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/ui/settings/SettingsActivityView.java +++ b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/ui/settings/SettingsActivityView.java @@ -42,6 +42,11 @@ public interface SettingsActivityView */ void onSettingsFileLoaded(HashMap settings); + /** + * Called when an asynchronous load operation fails. + */ + void onSettingsFileNotFound(); + /** * Display a popup text message on screen. * @@ -58,4 +63,10 @@ public interface SettingsActivityView * End the activity. */ void finish(); + + /** + * Called by a containing Fragment to tell the Activity that a setting was changed; + * unless this has been called, the Activity will not save to disk. + */ + void onSettingChanged(); } diff --git a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/ui/settings/SettingsAdapter.java b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/ui/settings/SettingsAdapter.java index c83c578f06..72ff6049b1 100644 --- a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/ui/settings/SettingsAdapter.java +++ b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/ui/settings/SettingsAdapter.java @@ -128,6 +128,8 @@ public final class SettingsAdapter extends RecyclerView.Adapter settings) { - if (mSettingsList == null) + if (mSettingsList == null && settings != null) { mSettings = settings; diff --git a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/ui/settings/SettingsFragmentView.java b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/ui/settings/SettingsFragmentView.java index c437863c94..66ea466b54 100644 --- a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/ui/settings/SettingsFragmentView.java +++ b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/ui/settings/SettingsFragmentView.java @@ -39,6 +39,12 @@ public interface SettingsFragmentView */ void showSettingsList(ArrayList settingsList); + /** + * Called by the containing Activity when an asynchronous load operation fails. + * Instructs the Fragment to load the settings screen with defaults selected. + */ + void loadDefaultSettings(); + /** * @return The Fragment's containing activity. */ @@ -65,4 +71,9 @@ public interface SettingsFragmentView * @param setting The (possibly previously missing) new setting. */ void putSetting(Setting setting); + + /** + * Have the fragment tell the containing Activity that a setting was modified. + */ + void onSettingChanged(); } diff --git a/Source/Android/app/src/main/res/drawable-hdpi/ic_cancel.png b/Source/Android/app/src/main/res/drawable-hdpi/ic_cancel.png new file mode 100644 index 0000000000000000000000000000000000000000..fc5a294ed5ff9e16a4cda3e88eb1beb1a078de96 GIT binary patch literal 276 zcmeAS@N?(olHy`uVBq!ia0y~yU{C>J4mJh`hKCF@W-u@?-1c;F45_&F_PQtEVFe!6 zfLqn3?Jo;7Cw*D5P~qUB6(-N>7b&Eum_^>`KPm8djG{GVhLaCf$V7oz4tSDq9nXEqz;F?ir?&*d}HD}D?Q23kO6Xp2- gr$v@5Sm+>M-@JpP@A>j$3=9kmp00i_>zopr02h;UZ~y=R literal 0 HcmV?d00001 diff --git a/Source/Android/app/src/main/res/drawable-mdpi/ic_cancel.png b/Source/Android/app/src/main/res/drawable-mdpi/ic_cancel.png new file mode 100644 index 0000000000000000000000000000000000000000..9813279c0df8b5c75b053f3cf3c204a76fbdf290 GIT binary patch literal 209 zcmeAS@N?(olHy`uVBq!ia0y~yV2}V|4mJh`h6m-gKNuJoW_Y?dhE&{oJ2jfCK|#Rv zZj0Wc(z3800r+-=;Q!i^VFfcH9 My85}Sb4q9e0MzG7uK)l5 literal 0 HcmV?d00001 diff --git a/Source/Android/app/src/main/res/drawable-xhdpi/ic_cancel.png b/Source/Android/app/src/main/res/drawable-xhdpi/ic_cancel.png new file mode 100644 index 0000000000000000000000000000000000000000..0b00a33a728a56902219f949ade2a25821dc9276 GIT binary patch literal 329 zcmeAS@N?(olHy`uVBq!ia0y~yU@!n-4mJh`hH$2z?F|2H^V0(uJ{~mxAE7OgxIO*Y)+Y)@e1-o?k23RG{3(u=WY}CBpm|7b-p$ST7*!To z{J9ye(JGPEuD{c*ory)KCR5g;xuMNnWRpnJ8bP_x&g13+Q$Cysd&J?$-T$sNh$E`P z&3OCw?8}EX@46_Glxot*^ygCiiL^aOo?T{e4_}(7bmQU7wH7QBf|m%y>WCC9JH(ga z(ygzlvFK!aLYg=?tAg}q!Nv?xxwaFQIclL-ZI2w0%Fz{Ni|#YMvC1%N&Wy#bzROt! h92gi`1Q__m zs^&j3II3{x!flb`n%izRq|NF6yG~#5Qjc+5@s0|`%EvP}GCPyGm&}!VA?9atNq3Iw zr8v$niT&5hlb5(#)W2T9BDIc#Yl+aDSL<&m2eJln^gY)U>lA5wT+2U8*y``(A1jSM z2FwvNe>u(Lp~YISUNH}$In%bzP@lxJymaHMMwO$TE1tDC@%ELQX&mp&D&NyIg-Lyr z{1=`esW~s&A~l1gWL(`hK6&lYyf|y;zAlx_Bbw2RlgngEFYgoaY-1L%H~hE6^4ay0 zGt=))2(``AykPwF@B~gxX}`8iPmKWIhclTpwf&wbI50iAxoLt@>hX!nUrqR?DSS24 z=68RU7Zzv9F@Zs|>O`W4?V}c@t7<6g*uVLn>~)y%U(%Y#`!t zF-PHTQN!HBY_s&1pJmfn(K)4G<4|Mz`5WSy|4z@@#`*2=^2&MsOJXz_85lSi7z7v? z6c`vB7#JED7#J8C7?>CsSQr>OEDt=Nlwo#OeR@{;!u8ZrS?h_1pA+ zQJ)@ieTev%)AS+Y-``y>N>6m+WgkZVe8{o$bhv9pXq|@Bk+VLZx4jN$N%a2tJ-dkE zMcz{@g(XwuKZQ$|Ci8I|J>CCLY)OwoU|rvH23MAupNefcwG}<4&M(&05M7wR@Xwv@ z!dgd`lb^iTv`urEpu7J{QHdYR%TM0#*q=B|(BJ>1%}47{K=e;8>m+A}Cf}c0(UaVj zBBrk2qF%$&6#Fx4_NQtAozvlSx+>TYZmYSvamo~@_2-^ypJ!dFaAVqfyBVb-On zF8BDAKHc4;wy!(EkmH$&R>j)2H4F?7;sxXnF?=wc!fwb=wl-^5kK-+!V@ub)Ejh>W z?x{5&%jvumZ(^@*aapmnCc0(TsqHQ+*48YI49RSex!tjs+3D?i)|1LxK15A0angRD za#Cr_7r(G4I;%_?F5Nk|pzXpH?!qpPwNv%mFC_g8;#fOPzgeI#c=1iW&{O(nUNCHs zds$?7Tj@^IhI#W!%YO1yv_7av2=@4S@qW`hMGLt|v9P+n=MAC<|6bU4VY0C0woRXs nwK;LcA;SU|1_p(vpV + tools:listitem="@layout/card_game"/> \ No newline at end of file diff --git a/Source/Android/app/src/main/res/menu/menu_add_directory.xml b/Source/Android/app/src/main/res/menu/menu_add_directory.xml index 667d28a4f0..7bc27379d1 100644 --- a/Source/Android/app/src/main/res/menu/menu_add_directory.xml +++ b/Source/Android/app/src/main/res/menu/menu_add_directory.xml @@ -1,8 +1,9 @@ - + + app:showAsAction="ifRoom|withText"/> \ No newline at end of file diff --git a/Source/Android/app/src/main/res/menu/menu_settings.xml b/Source/Android/app/src/main/res/menu/menu_settings.xml new file mode 100644 index 0000000000..13353030ac --- /dev/null +++ b/Source/Android/app/src/main/res/menu/menu_settings.xml @@ -0,0 +1,10 @@ + + + + + \ No newline at end of file diff --git a/Source/Android/app/src/main/res/values/strings.xml b/Source/Android/app/src/main/res/values/strings.xml index cf98d53bb9..db5cc8355a 100644 --- a/Source/Android/app/src/main/res/values/strings.xml +++ b/Source/Android/app/src/main/res/values/strings.xml @@ -327,6 +327,7 @@ That folder is empty. + Exit Without Saving CPU Settings Input Settings Extension Bindings diff --git a/Source/Android/build.gradle b/Source/Android/build.gradle index 04b57996fc..469472dc22 100644 --- a/Source/Android/build.gradle +++ b/Source/Android/build.gradle @@ -5,7 +5,7 @@ buildscript { jcenter() } dependencies { - classpath 'com.android.tools.build:gradle:2.0.0-alpha5' + classpath 'com.android.tools.build:gradle:2.0.0-alpha7' // NOTE: Do not place your application dependencies here; they belong // in the individual module build.gradle files