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 zcmV+v0qg#WP)lUcPU>TM!j6?-=93f~FWKwOUldq_*wN)Ly`le0JY$7NT;DXh4!tA}9z`v#CR% zB}=dr62O?+V=qBb7^Dt`z-yLpjo)buS{O?x8pBlTU$a4D*sG(2vP@MU2GrG(l}?jA zV^jY-+RQZrfh2W?MzzEs*9-(gDlm*X~)of^&6pdjFSw?%K! z@qhbE1hZamlr#`9+%3%F#P(hP{KY*!T1%Jg>zUP*$ZCBw$b`XA#641#Dei!O#RP*t zC*DVOI;2bP0 Hl+XkK)aOdC 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 zcmV-P0k-~$P)-Hp^2CxGti$Q;Z^2qD!Xpyz3;wxcLE3?fB*sr@K1nC z*e>jz5XOc*Z)Z>d@xeF$SSuJ|w`az+!X}>Cv)%zD zqB#87TPTGXYKJemMu!3fEPQDlID>$OM-;LYVyqD!Rf)$p5R~x9R^kXj3yvk`%46&{AjIcz3X)jh<-8f+~U23w9b*s3vFoS36UO{WDAKmY** b5CFaJELQUamZcBV00000NkvXXu0mjf$2@;u literal 0 HcmV?d00001 diff --git a/Source/Android/app/src/main/res/drawable-xxhdpi/ic_cancel.png b/Source/Android/app/src/main/res/drawable-xxhdpi/ic_cancel.png new file mode 100644 index 0000000000000000000000000000000000000000..717c7b59190385c7c55c515beb1f45439eee6d19 GIT binary patch literal 462 zcmeAS@N?(olHy`uVBq!ia0vp^9w5xY1|&n@Zgyv2V4Ujd;uunK>+P+Bd4~*mjurad zJya|Ev~7y-*f|&&Sp*!w1Pg@9W~-Y2 z$l$2LoeQ@`j%#ka*^oA;`|mn^!Am{Ham70-6e}Ok;K=Mu=3X*a>V=q}$tB%6s+Zz8 zza;iwFHc_LZc+bw0gKc+4z49ab6%~#p&ZB>#L@R$Q>;^@?Qt#tEMcp^lYgu<`WP@r z%>3mvkB1g(y?Vtwgyu}!IzxRD&+^iZuNqa3cCL8V-o)EiZl-a(Gpl@0(-bE4P4ZuO zf~4lWXp7Vgl9F+C-}vOUNAu#Wo%^~}GLL9RFHSC#DZRW;#IucAz~1oR63b`TOU_Kc zHzCwEPxFHD)58-uHKqO9GCef{d>_ta($w~QqTs;v4uu9V!2zMFy5$om-}hO)V5KH7o)|n`{an^LB{Ts5sZG74 literal 0 HcmV?d00001 diff --git a/Source/Android/app/src/main/res/drawable-xxxhdpi/ic_cancel.png b/Source/Android/app/src/main/res/drawable-xxxhdpi/ic_cancel.png new file mode 100644 index 0000000000000000000000000000000000000000..9ef2d8f9fbe5914285f0776e412c4d1be25d17aa GIT binary patch literal 601 zcmeAS@N?(olHy`uVBq!ia0vp^2_VeD1|%QND7Ro>U{dgOaSW-r_4ZC+UbBIS%f%dp zw?z$e53|kETYi>JV@2nbevLzo>E~~VXZ|}qXB+3Y!^v<76Oj13%SGvlPQ2{H$e#~6cAgG*tq85ta5{3<=kvDL;Vg;XKfh-eF}%ooYNfDb ziu|W=>C$9Aj-#jh|A{T>Q3$N-d(Pm>GV@chEvL4k$JF`7x*DPj^B4ZP(_L8W$a3`yKlehY9-ozqI*i9SVs4$z`47%+TcfQ!9FsyHdo|^;^_y zSejygX3hRoEueEcd`?#d`@wBBS2s?X;d`RHW&PO55cgztX3> zd(`%ICm3=(GtsJ8yS9db;X%BB{2_)9rc>Ar8OqjX?doy7rE_fQy0<0gINm+A=3_aX zcj8U#)h#Y7mexeK%sRE*WyRW>rI8_-4KlYo_A)!YUC(+_dCP~W2_{b3?^8}HZTaFC z_C#luNyDW(=N7bGxWZl7#j$p(e*1-_pFtdJr|CBf6b3K8sTX=m|I7=94RSAw3~wvl zY1%MvUTN7+o{H876$!x}KQG>Inx|+X7bzA746p{#gMTmVyD(YUa@(d)$=aN_;*enh fFd`M6eq#S;eQNDygJ~+j2xjnf^>bP0l+XkKX6gf2 literal 0 HcmV?d00001 diff --git a/Source/Android/app/src/main/res/layout/fragment_grid.xml b/Source/Android/app/src/main/res/layout/fragment_grid.xml index eb46ff8458..3711602198 100644 --- a/Source/Android/app/src/main/res/layout/fragment_grid.xml +++ b/Source/Android/app/src/main/res/layout/fragment_grid.xml @@ -11,5 +11,5 @@ android:layout_height="match_parent" android:layout_marginLeft="@dimen/activity_horizontal_margin" android:layout_marginRight="@dimen/activity_horizontal_margin" - tools:listitem="@layout/grid_card_game"/> + 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