Set theme result from onBackPressed

This commit is contained in:
Phillip Hsu 2016-09-27 03:51:33 -07:00
parent 26215d3641
commit 8798dea67a
2 changed files with 37 additions and 50 deletions

View File

@ -1,6 +1,11 @@
package com.philliphsu.clock2.settings; package com.philliphsu.clock2.settings;
import android.app.Activity;
import android.content.Intent;
import android.content.SharedPreferences;
import android.os.Bundle; import android.os.Bundle;
import android.preference.PreferenceManager;
import android.view.MenuItem;
import com.philliphsu.clock2.BaseActivity; import com.philliphsu.clock2.BaseActivity;
import com.philliphsu.clock2.R; import com.philliphsu.clock2.R;
@ -11,9 +16,14 @@ import com.philliphsu.clock2.R;
public class SettingsActivity extends BaseActivity { public class SettingsActivity extends BaseActivity {
public static final String EXTRA_THEME_CHANGED = "com.philliphsu.clock2.settings.extra.THEME_CHANGED"; public static final String EXTRA_THEME_CHANGED = "com.philliphsu.clock2.settings.extra.THEME_CHANGED";
private String mInitialTheme;
private SharedPreferences mPrefs;
@Override @Override
protected void onCreate(Bundle savedInstanceState) { protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState); super.onCreate(savedInstanceState);
mPrefs = PreferenceManager.getDefaultSharedPreferences(this);
mInitialTheme = getSelectedTheme();
} }
@Override @Override
@ -30,4 +40,31 @@ public class SettingsActivity extends BaseActivity {
protected boolean isDisplayShowTitleEnabled() { protected boolean isDisplayShowTitleEnabled() {
return true; return true;
} }
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case android.R.id.home:
setThemeResult(getSelectedTheme());
return false; // Don't capture, proceed as usual
default:
return false;
}
}
@Override
public void onBackPressed() {
setThemeResult(getSelectedTheme());
super.onBackPressed();
}
private String getSelectedTheme() {
return mPrefs.getString(getString(R.string.key_theme), "");
}
private void setThemeResult(String selectedTheme) {
Intent result = new Intent();
result.putExtra(EXTRA_THEME_CHANGED, !selectedTheme.equals(mInitialTheme));
setResult(Activity.RESULT_OK, result);
}
} }

View File

@ -1,8 +1,6 @@
package com.philliphsu.clock2.settings; package com.philliphsu.clock2.settings;
import android.app.Activity;
import android.content.Context; import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences; import android.content.SharedPreferences;
import android.media.AudioManager; import android.media.AudioManager;
import android.media.Ringtone; import android.media.Ringtone;
@ -11,25 +9,17 @@ import android.net.Uri;
import android.os.Bundle; import android.os.Bundle;
import android.preference.Preference; import android.preference.Preference;
import android.preference.PreferenceFragment; import android.preference.PreferenceFragment;
import android.preference.PreferenceManager;
import android.preference.RingtonePreference; import android.preference.RingtonePreference;
import android.view.MenuItem;
import com.philliphsu.clock2.R; import com.philliphsu.clock2.R;
public class SettingsFragment extends PreferenceFragment implements SharedPreferences.OnSharedPreferenceChangeListener { public class SettingsFragment extends PreferenceFragment implements SharedPreferences.OnSharedPreferenceChangeListener {
private String mInitialTheme;
private SharedPreferences mPrefs;
public SettingsFragment() {} public SettingsFragment() {}
@Override @Override
public void onCreate(Bundle savedInstanceState) { public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState); super.onCreate(savedInstanceState);
// We don't have a menu, but this is needed so we can receive callbacks to the options menu.
// The only callback we are interested in is onOptionsItemSelected().
setHasOptionsMenu(true);
addPreferencesFromResource(R.xml.preferences); addPreferencesFromResource(R.xml.preferences);
// Set ringtone summary // Set ringtone summary
setSummary(getPreferenceScreen().getSharedPreferences(), getString(R.string.key_timer_ringtone)); setSummary(getPreferenceScreen().getSharedPreferences(), getString(R.string.key_timer_ringtone));
@ -45,8 +35,6 @@ public class SettingsFragment extends PreferenceFragment implements SharedPrefer
return true; return true;
} }
}); });
mPrefs = PreferenceManager.getDefaultSharedPreferences(getActivity());
mInitialTheme = mPrefs.getString(keyOfThemePreference(), "");
} }
@Override @Override
@ -63,43 +51,9 @@ public class SettingsFragment extends PreferenceFragment implements SharedPrefer
.unregisterOnSharedPreferenceChangeListener(this); .unregisterOnSharedPreferenceChangeListener(this);
} }
@Override
public boolean onOptionsItemSelected(MenuItem item) {
/*
* https://developer.android.com/guide/topics/ui/menus.html#RespondingOptionsMenu
* "If your activity includes fragments, the system first calls onOptionsItemSelected()
* for the activity then for each fragment (in the order each fragment was added)
* until one returns true or all fragments have been called."
*/
switch (item.getItemId()) {
case android.R.id.home:
String selectedTheme = mPrefs.getString(keyOfThemePreference(), "");
Intent result = new Intent();
result.putExtra(SettingsActivity.EXTRA_THEME_CHANGED, !selectedTheme.equals(mInitialTheme));
getActivity().setResult(Activity.RESULT_OK, result);
return false; // Don't capture, proceed as usual
default:
return false;
}
}
@Override @Override
public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) { public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) {
setSummary(sharedPreferences, key); setSummary(sharedPreferences, key);
// --------------------------------------------------------------------------------------
// TOneverDO
//
// A new instance of the activity would be created and onCreate() called again.
// Our reading of the initial theme for the previous instance, which would be destroyed,
// would not be retained.
// Reading the initial theme *for the new instance* would give us the theme
// that the previous instance had just changed to, prior to its recreate().
// As such, the result passed back *by the new instance* via the up button
// would always indicate the theme didn't change.
// if (key.equals(keyOfThemePreference())) {
// getActivity().recreate();
// }
// --------------------------------------------------------------------------------------
} }
private void setSummary(SharedPreferences prefs, String key) { private void setSummary(SharedPreferences prefs, String key) {
@ -112,8 +66,4 @@ public class SettingsFragment extends PreferenceFragment implements SharedPrefer
pref.setSummary(ringtone.getTitle(getActivity())); pref.setSummary(ringtone.getTitle(getActivity()));
} }
} }
private String keyOfThemePreference() {
return getString(R.string.key_theme);
}
} }